Ansible

Ansible 從各種主機獲取各種文件

  • November 5, 2022

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

缺少縮進會導致兩個任務都在兩個主機上執行。由於主機上的第一個任務ansible2src路徑不存在而在主機上失敗,因此 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

引用自:https://serverfault.com/questions/1114853