Ansible позволяет вам описывать предсказуемые состояния.В вашем конкретном случае вы используете fetch
модуль (но использование copy
будет идентично дельте направления передачи) и описываете следующее:
fileX (aka dest) на сервере A должен существовать и иметь тот же контент, что и fileY (aka src) на сервере B
Есть только две причины, которые могут объяснить ваш результат между 2 последовательными воспроизведениями:
- целевой файл был изменен или удален (например, после того, как вы его распаковали)
- исходный файл был изменен.
В качестве доказательства,тестовая книга воспроизведения fetch.yml
:
---
- hosts: localhost
gather_facts: false
tasks:
- name: test fetch idempotency
fetch:
dest: /tmp/
flat: true
src: "{{ lookup('env', 'HOME') }}/test.txt"
Первый запуск:
$ # Create the fetched file
$ echo "test line" > $HOME/test.txt
$ # Run playbook
$ ansible-playbook fetch.yml
PLAY [localhost] ********************************************************************************************************************************************************************************************************************************************************
TASK [test fetch idempotency] *******************************************************************************************************************************************************************************************************************************************
changed: [localhost]
PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Второй запуск
$ ansible-playbook fetch.yml
PLAY [localhost] ********************************************************************************************************************************************************************************************************************************************************
TASK [test fetch idempotency] *******************************************************************************************************************************************************************************************************************************************
ok: [localhost]
PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Как вы можете видеть выше, ничего не изменилось.Но если вы измените источник или dest:
$ # Run either of the following commands
$ #
$ # Modify the source
$ echo "change file on host" >> $HOME/test.txt
$ # or modify the destination
$ echo "change file on controler" >> /tmp/test.txt
$ # or delete the destination
$ rm /tmp/test.txt
$ # and run playbook again
$ ansible-playbook fetch.yml
PLAY [localhost] ********************************************************************************************************************************************************************************************************************************************************
TASK [test fetch idempotency] *******************************************************************************************************************************************************************************************************************************************
changed: [localhost]
PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0