ansible`fetch`在:false`时需要一个`changed\ u`?
当我运行以下ansible`fetch`在:false`时需要一个`changed\ u`?,ansible,Ansible,当我运行以下ansible(v2.8.4)任务时,我得到 `changed: [1.2.3.4]` 而我期望 ok:[1.2.3.4] 因为fetch只是(我认为)更改了local端 - name: Foo fetch: dest: config/ flat: true src: /etc/foo/bar.tar.gz 当然,我可以在:false时使用changed\u来避免这种情况,但这似乎有点奇怪 引用文件: 它用于从远程机器获取文件并存储它们 在本地文
ansible
(v2.8.4)任务时,我得到
`changed: [1.2.3.4]`
而我期望
ok:[1.2.3.4]
因为fetch
只是(我认为)更改了local端
- name: Foo
fetch:
dest: config/
flat: true
src: /etc/foo/bar.tar.gz
当然,我可以在:false时使用changed\u来避免这种情况,但这似乎有点奇怪
引用文件:
它用于从远程机器获取文件并存储它们
在本地文件树中,按主机名组织
Ansible用于描述可预测的状态。在您的特定情况下,您将使用(但使用与传输方向相同的增量)并描述以下内容:
服务器A上的文件X(又名dest)必须存在,并且与服务器B上的文件Y(又名src)具有相同的内容
只有两个原因可以解释连续两次播放之间的结果:
目标文件已被修改或删除(例如,在完成解压缩后)
源文件已被修改
作为证明,一个测试剧本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
正如你在上面看到的,没有任何改变。但如果您更改源或目标:
$ # 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
我原以为更改是指远程机器,我们从中获取文件。对我来说,客户端(本地端)机器状态影响播放状态似乎有点奇怪?我怀疑是的,tar.gz在客户端被删除了(但我需要检查一下)稍后在剧本中。似乎我误解了变化,这取决于其中一方或双方的变化?Ansible是关于描述可预测状态的。fetch
和copy
模块执行相同的操作。只有传输方向改变。您描述了一种状态:hostA上的fileX(aka dest)必须存在,并且与hostB上的fileY(aka src)具有相同的内容
。如果第一次运行后其中一个文件发生更改,则必须再次传输以达到所述状态,这将导致模块报告更改
。谢谢。现在这是有道理的。我确实认为日志有点直观,因为它们在我的ansible客户端指向的机器的IP地址旁边已经确定或更改,即我们从哪里获取文件,即使它是dst,即我运行ansible客户端的地方实际上正在更改。但我现在明白了,事情就是这样!我认为你写的最后一条评论最好在你的答案末尾插入。。。据我所知,在这个世界上,评论可能有些转瞬即逝