簡體   English   中英

Ansible-比較2個文件列表的校驗和

[英]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

用來比較N個主機中的文件的Playbook

- 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM