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 密鑰在目標機器上導入。
提前感謝您的幫助:)
在vars中創建字典。例如,
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
你的縮進是錯誤的。
when
需要與 處於同一水平fetch
,而不是低於它。- name: fetch files fetch: src: /home/ubuntu/test1/testing1.txt dest: /home/ubuntu/ flat: yes when: inventory_hostname == "ansible1"
缺少縮進會導致兩個任務都在兩個主機上執行。由於主機上的第一個任務
ansible2
因src
路徑不存在而在主機上失敗,因此 Ansible 結束了該主機的 playbook,並且不再為它執行任何任務。然後第二個任務在剩餘的主機上再次失敗,因為src
那裡不存在路徑。但是您可以通過將 src 路徑保存為主機變數並將其簡化為單個任務來簡化此操作
host_vars/ansible1.yml
src_path: /home/ubuntu/test1/testing1.txt
host_vars/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