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客户端的地方实际上正在更改。但我现在明白了,事情就是这样!我认为你写的最后一条评论最好在你的答案末尾插入。。。据我所知,在这个世界上,评论可能有些转瞬即逝