Ansible-比较2个文件列表的校验和

时间:2019-07-09 01:05:20

标签: ansible

我想使用Ansible将2个远程主机之间的一个文件夹中的所有特定文件与另一个文件夹中的所有特定文件进行比较

我尝试了'stat''file'模块。 我可以获得文件及其对应的校验和的列表,但是我找不到一种遍历该列表以将校验和与每个文件的校验和进行比较的方法。

我希望能够快速识别文件中的差异,以便根据需要更新服务器

3 个答案:

答案 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)

用来比较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 }}"

希望这会有所帮助。

答案 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