[英]Ansible - Compare checksum on 2 lists of files
我想使用Ansible將一個文件夾中的所有特定文件與2個遠程主機之間的另一個文件夾中的所有特定文件進行比較
我嘗試了“統計”“文件”模塊。 我可以獲得文件及其對應的校驗和的列表,但是我無法找到一種遍歷該列表以將校驗和與每個文件的校驗和進行比較的方法。
我希望能夠快速識別文件中的差異,以便根據需要更新服務器
下面的劇本對我有用。 讓我們為組“ test”中的所有主機在第一個播放中注冊文件的狀態,並在第二個播放中比較主機“ test_01”和“ test_02”的狀態。
- 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) }}"
下面第二個游戲的變化形式將主機“ test_01”聲明為主機,並將“ test”組中的所有其他主機與主機進行比較。
- 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
將一個文件夾中的所有特定文件與2個遠程主機之間的另一個文件 夾中的所有特定文件進行比較。
讓我們用文件夾的路徑創建一個變量
$ cat hosts
[test]
test_01 my_folder=/scratch/testA
test_02 my_folder=/scratch/testB
test_03 my_folder=/scratch/testC
並在第一次播放中創建文件列表
- 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
然后在第二場比賽中使用symmetric_difference過濾器
- debug:
msg: "{{ list1 | symmetric_difference(list2) }}"
要么
- debug:
msg: "{{ master_list|
symmetric_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
- 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 }}"
希望這可以幫助。
我能夠比較每個主機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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.