обнаружение разницы (изменения) файлов с помощью `ansible`

#ansible

#ansible

Вопрос:

В этой задаче я нашел обходной метод для сравнения двух файлов ( dconfDump и dconfDumpLocalCurrent ) и установки переменной (ранее определенной как false ) в значение true, если два файла отличаются.

Решение, похоже, работает, но выглядит уродливо, и, как у новичка ansible , у меня сложилось впечатление, что должно существовать лучшее решение.

 ---
# vars file for dconfLoad
local_changed : false
target_changed : false

---

- name: local changed is true when previous target different then local current  
  shell:  diff /home/frank/dconfDump /home/frank/dconfDumpLocalCurrent
  register: diff_oldtarget_localCurrent
  register: local_changed  
  ignore_errors: true
- debug:
    msg: CHANGED LOCALLY 
  when: local_changed 
 

Некоторая предыстория задачи, которая представляет собой попытку синхронизации файлов: файл LocalCurrent сравнивается с LocalOld и CurrentTarget , чтобы определить, LocalCurrent изменен ли он и отличается currentTarget ли он от . Если LocalCurrent не изменено и CurrentTarget изменено, то примените изменение (и установите LocalOld значение CurrentTarget ); если LocalCurrent изменено, то загрузите на контроллер.

С каким подходящим подходом ansible ? Спасибо за помощь!

Ответ №1:

Вы можете использовать stat для получения контрольной суммы, а затем сравнить ее. Пожалуйста, смотрите ниже.

    tasks:
   - name: Stat of dconfDump
     stat:
      path : "/tmp/dconfDump"
     register: dump

   - name: SHA1 of dconfDump
     set_fact:
      dump_sha1: "{{ dump.stat.checksum }}"

   - name: Stat of dconfDumpLocalCurrent
     stat:
      path : "/tmp/dconfDumpLocalCurrent"
     register: dump_local

   - name: SHA1 of dconfDumpLocalCurrent
     set_fact:
      local_sha1: "{{ dump_local.stat.checksum }}"

   - name: Same
     set_fact:
      val: "False"
     when:  dump_sha1 != local_sha1

   - name: Different
     set_fact:
      val: "True"
     when:  dump_sha1 == local_sha1

   - name: Print
     debug:
      msg: "{{val}}"
 

Комментарии:

1. интересные новые функции! почему вы используете set_fact ? и перед регистрацией — в чем разница? — каким был бы метод создания «подпрограммы», подобной конструкции, для каждого файла (stat и SHA1)?

2. Вы также можете удалить обе задачи SHA1 и просто добавить условие, например, когда: dump.stat.checksum != dump_local.stat.checksum для задачи — то же самое, а когда: dump.stat.checksum == dump_local.stat.checksum для задачи — другое. set_fact был дан, чтобы лучше понять это.

3. это полезно; я могу это сделать! — просто чтобы узнать это, не могли бы вы указать мне на документ, чтобы узнать, как можно использовать «подпрограммы» с аргументами?

4. извините, подпрограммы, в которых я не уверен

5. вы можете отметить ответ как ответ или проголосовать за него, если он показался вам полезным.

Ответ №2:

Используйте статистику и создайте словарь контрольных сумм. Например

     - stat:
        path: "{{ item }}"
      loop:
        - LocalOld
        - LocalCurrent
        - CurrentTarget
      register: result
    - set_fact:
        my_files: "{{ dict(paths|zip(chkms)) }}"
      vars:
        paths: "{{ result.results|map(attribute='stat.path')|list }}"
        chkms: "{{ result.results|map(attribute='stat.checksum')|list }}"
    - debug:
        var: my_files
 

выдает (сокращенный), если все файлы одинаковы

   my_files:
    CurrentTarget: 7c73e9f589ca1f0a1372aa4cd6944feec459c4a8
    LocalCurrent: 7c73e9f589ca1f0a1372aa4cd6944feec459c4a8
    LocalOld: 7c73e9f589ca1f0a1372aa4cd6944feec459c4a8
 

Затем используйте словарь для сравнения контрольных сумм и копирования файлов. Например

     # If LocalCurrent is not changed and CurrentTarget is changed,
    # then apply the change (and set LocalOld to CurrentTarget)

    - debug:
        msg: Set LocalOld to CurrentTarget
      when:
        - my_files['LocalCurrent'] == my_files['LocalOld'] 
        - my_files['LocalCurrent'] != my_files['CurrentTarget'] 

    - debug:
        msg: Do not copy anything
      when:
        - my_files['LocalCurrent'] == my_files['LocalOld'] 
        - my_files['LocalCurrent'] == my_files['CurrentTarget']
 

дает

 TASK [debug] ****
skipping: [localhost]

TASK [debug] ****
ok: [localhost] => 
  msg: Do not copy anything
 

Комментарии:

1. спасибо — это намного чище! ваше решение показало мне несколько новых приемов, которые я не видел, как использовать!

2. в чем преимущество создания массива со значением по сравнению с использованием только трех имен переменных?