#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. в чем преимущество создания массива со значением по сравнению с использованием только трех имен переменных?