我想使用Ansible将2个远程主机之间的一个文件夹中的所有特定文件与另一个文件夹中的所有特定文件进行比较
我尝试了'stat''file'模块。 我可以获得文件及其对应的校验和的列表,但是我找不到一种遍历该列表以将校验和与每个文件的校验和进行比较的方法。
我希望能够快速识别文件中的差异,以便根据需要更新服务器
答案 0 :(得分:0)
下面的剧本对我有用。让我们为“ test”组中的所有主机在第一次播放中注册文件的状态,并在第二次播放中比较主机“ test_01”和“ test_02”的状态。
os.startfile(r'C:\file.mp3')
下面第二局的变化形式将主机“ test_01”声明为主机,并将“ test”组中的所有其他主机与主机进行比较。
- hosts: test
vars:
files:
- /scratch/testA/file1
- /scratch/testA/file2
- /scratch/testA/file3
tasks:
- stat:
path: "{{ item }}"
loop: "{{ files }}"
register: status_of_files
- hosts: localhost
tasks:
- set_fact:
list1: "{{ hostvars['test_01'].status_of_files.results|
json_query('[].{item: item, hash: stat.checksum}') }}"
- set_fact:
list2: "{{ hostvars['test_02'].status_of_files.results|
json_query('[].{item: item, hash: stat.checksum}') }}"
- debug:
msg: "{{ list1 | difference(list2) }}"
在两个远程主机之间,将一个文件夹中的所有特定文件与另一个文件夹中的所有特定文件进行比较。
让我们创建一个包含文件夹路径的变量
- hosts: localhost
vars:
master: test_01
tasks:
- set_fact:
master_list: "{{ hostvars[master].status_of_files.results|
json_query('[].{item: item, hash: stat.checksum}') }}"
- debug:
msg: "{{ master_list|
difference(hostvars[item_host].status_of_files.results|
json_query('[].{item: item, hash: stat.checksum}')) }}"
loop: "{{ groups['test'] | difference([ master ]) }}"
loop_control:
loop_var: item_host
并在第一次播放中创建文件列表
$ cat hosts
[test]
test_01 my_folder=/scratch/testA
test_02 my_folder=/scratch/testB
test_03 my_folder=/scratch/testC
然后在第二场比赛中使用 symmetric_difference 过滤器
- hosts: test
tasks:
- find:
path: "{{ my_folder }}"
register: list_of_files
- set_fact:
files: "{{ list_of_files.files|
json_query('[].path')|
map('basename')|
list }}"
- stat:
path: "{{ my_folder }}/{{ item }}"
loop: "{{ files }}"
register: status_of_files
或
- debug:
msg: "{{ list1 | symmetric_difference(list2) }}"
答案 1 :(得分:0)
- name: Compare files from each host in hosts file
hosts: all
gather_facts: true
vars:
files:
- /tmp/file1
- /tmp/file2
- /tmp/file3
tasks:
- name: Get file info
stat:
path: "{{ item }}"
with_items:
- "{{ files }}"
register: p
- name: Save in required format
set_fact:
result: "{{ result|default([]) + [ {item.item: { inventory_hostname: { 'checksum': item.stat.checksum if item.stat.exists == true else 'File does not exists'} } } ] }}"
with_items:
- "{{ p.results }}"
loop_control:
label: "{{ item.item }}"
- name: Merge results in ansible machine
hosts: localhost
tasks:
- name: Combine Result
set_fact:
value: "{{ value|default([{}]) | combine(hostvars[item].result, recursive=True) }}"
with_items:
- "{{ groups['all'] }}"
- name: Final result
debug:
msg: "{{ value }}"
希望这会有所帮助。
答案 2 :(得分:0)
我能够比较每个主机1个文件夹。 如果每个主机有2个文件夹,如何比较第二个文件夹? 示例:对于每种环境,我有4台服务器-UAT和SIT。每个服务器运行应用程序服务器的2个实例,因此需要2个包含.war文件的单独文件夹。 我有一台服务器作为主服务器,但该服务器也有2个文件夹,因此需要进行比较。
# --- first ---
- name: Find all files
find:
path: "{{ my_folder }}"
register: list_of_files
- name: set_fact - basename all files
set_fact:
files: "{{ list_of_files.files|
json_query('[].path')|
map('basename')|
list }}"
- name: stat files from set_fact
stat:
path: "{{ my_folder }}/{{ item }}"
loop: "{{ files }}"
register: status_of_files
# --- second ---
- name: set_fact for master_list
set_fact:
master_list: "{{ hostvars[master].status_of_files.results|
json_query('[].{item: item, hash: stat.checksum}') }}"
- name: debug - set_fact for master_list
debug:
msg: "{{ master_list|
symmetric_difference(hostvars[item_host].status_of_files.results|
json_query('[].{item: item, hash: stat.checksum}')) }}"
loop: "{{ groups['FS-AA-PERF-WAS'] | difference([ master ]) }}"
loop_control:
loop_var: item_host