我是 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