Ansible 从各种主机获取各种文件

Ansible 从各种主机获取各种文件

我是 ansible 新手。我的目标是从各种服务器获取文件。每个服务器存储文件的路径都不同。目标路径始终相同。

我有以下内容:

- name: fetch files
  hosts: hosts
  tasks:
    - name: fetch files
      fetch:
       src: /home/ubuntu/test1/testing1.txt
       dest: /home/ubuntu/
       flat: yes
       when: inventory_hostname == "ansible1"

    - name: fetch files2
      fetch:
       src: /home/ubuntu/test2/testing2.txt
       dest: /home/ubuntu/
       flat: yes
       when: inventory_hostname == "ansible2"

我的库存文件是:

[hosts]
ansible1
ansible2

当我执行:

ansible-playbook fetch.yml -i inventory.txt

输出如下:

PLAY [fetch files] ****************************************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************************************
ok: [ansible2]
ok: [ansible1]

TASK [fetch files] ****************************************************************************************************************************************************
ok: [ansible1]
fatal: [ansible2]: FAILED! => {"changed": false, "msg": "file not found: /home/ubuntu/test1/testing1.txt"}

TASK [fetch files2] ***************************************************************************************************************************************************
fatal: [ansible1]: FAILED! => {"changed": false, "msg": "file not found: /home/ubuntu/test2/testing2.txt"}

PLAY RECAP ************************************************************************************************************************************************************
ansible1                   : ok=2    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
ansible2                   : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

为什么当条件特定于一个主机时,它会尝试为其他主机运行它?第二个问题 - 为什么对于第二个任务“获取文件 2”,它实际上根本没有获取它,尽管该文件存在于远程计算机上?

我使用 multipass 和 ubuntu 进行测试和开发。SSH 密钥已导入目标机器。

提前感谢你的帮助:)

答案1

在中创建字典瓦尔斯。 例如,

shel> cat group_vars/all/testing.yml
testing_paths:
  ansible1: /home/ubuntu/test1/testing1.txt
  ansible2: /home/ubuntu/test2/testing2.txt

并用它来完成任务

    - fetch:
        src: "{{ testing_paths[inventory_hostname] }}"
        dest: /home/ubuntu/
        flat: yes

答案2

你的缩进是错误的。when需要与处于同一级别fetch,而不是低于它。

    - name: fetch files
      fetch:
        src: /home/ubuntu/test1/testing1.txt
        dest: /home/ubuntu/
        flat: yes
      when: inventory_hostname == "ansible1"

缺少缩进会导致两个任务都在两个主机上运行。由于第一个任务在该主机上失败,ansible2因为src路径不存在,Ansible 会结束该主机的剧本,并且不会为其执行其他任务。第二个任务在剩余的主机上再次失败,因为路径src不存在。


但是,你可以将 src 路径保存为主机变量,并将其简化为单个任务,从而使此过程变得更容易

主机变量/ansible1.yml

src_path: /home/ubuntu/test1/testing1.txt

主机变量/ansible2.yml

src_path: /home/ubuntu/test2/testing2.txt

剧本.yml

- name: fetch files
  hosts: hosts
  tasks:
    - name: fetch files
      fetch:
        src: "{{ src_path }}"
        dest: /home/ubuntu/
        flat: yes

相关内容