Rhel
使用 Ansible 傳輸 RPM 文件並在本地安裝它們
我有以下 yaml ansible-playbook 並希望傳輸 rpm,然後將它們本地安裝到遠端機器上。直到傳輸文件步驟它工作正常但是在安裝部分我出現以下錯誤:
"Failure talking to yum: near \"gskcrypt64\": syntax error"
知道如何克服這部分嗎?Ansible 版本:
ansible 2.4.2.0 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Jun 11 2019, 12:19:05) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
Ansible 劇本:
--- - hosts: "1.2.3.4" connection: "ssh" vars: RPM: - gskcrypt64-8.0.50.86.linux.ppcle.rpm - gskssl64-8.0.50.86.linux.ppcle.rpm - TIVsm-API64.ppc64le.rpm - TIVsm-BA.ppc64le.rpm tasks: - name: "Transfer Files" copy: src=/root/ansible_playbooks/{{ item }} dest=/root/ with_items: "{{ RPM }}" - name: "Install Local RPMs" shell: yum localinstall -y /root/*.rpm
如果我更改 shell 模組,則會報告相同的錯誤
- name: "Install Local RPMs" yum: name: /root/{{ RPM }} state: present
錯誤:
root@server [/root/ansible_playbooks] > ansible-playbook tsm PLAY [1.2.3.4] ****************************************************************************************************************************************************************************************************** TASK [Gathering Facts] *************************************************************************************************************************************************************************************************** ok: [1.2.3.4] TASK [Transfer Files] **************************************************************************************************************************************************************************************************** ok: [1.2.3.4] => (item=gskcrypt64-8.0.50.86.linux.ppcle.rpm) ok: [1.2.3.4] => (item=gskssl64-8.0.50.86.linux.ppcle.rpm) ok: [1.2.3.4] => (item=TIVsm-API64.ppc64le.rpm) ok: [1.2.3.4] => (item=TIVsm-BA.ppc64le.rpm) TASK [Install Local RPMs] ************************************************************************************************************************************************************************************************ fatal: [1.2.3.4]: FAILED! => {"changed": false, "msg": "Failure talking to yum: near \"gskcrypt64\": syntax error"} to retry, use: --limit @/root/ansible_playbooks/tsm.retry PLAY RECAP *************************************************************************************************************************************************************************************************************** 1.2.3.4 : ok=2 changed=0 unreachable=0 failed=1
Edit1:我嘗試了以下循環,因為文件已經在另一邊:
--- - hosts: "1.2.3.4" connection: "ssh" vars: RPM: - gskcrypt64-8.0.50.86.linux.ppcle.rpm - gskssl64-8.0.50.86.linux.ppcle.rpm - TIVsm-API64.ppc64le.rpm - TIVsm-BA.ppc64le.rpm tasks: - name: "Install Local RPMs" yum: name: /root/"{{ item }}" state: present loop: "{{ RPM }}"
現在收到以下錯誤:
fatal: [1.2.3.4]: FAILED! => {"msg": "Unexpected failure in finding the lookup named '{{ RPM }}' in the available lookup plugins"}
編輯2:
嘗試移動並測試 yum localinstall 的失敗部分:
--- - hosts: "1.2.3.4" connection: "ssh" vars: RPM: - gskcrypt64-8.0.50.86.linux.ppcle.rpm - gskssl64-8.0.50.86.linux.ppcle.rpm - TIVsm-API64.ppc64le.rpm - TIVsm-BA.ppc64le.rpm tasks: - name: "Install Local RPMs" yum: name: "/root/{{RPM}}" state: present
但得到錯誤:
fatal: [1.2.3.4]: FAILED! => {"changed": false, "msg": "Failure talking to yum: near \"gskcrypt64\": syntax error"}
前言
除非您有非常特殊的情況,否則您永遠不應該使用
loop
或with_item
與模組一起使用,因為(引用文件)yum
當與循環一起使用時:將單獨處理每個包,將列表直接傳遞給 name 選項效率更高。
幫自己一個忙:採用現代的完整 yaml 語法來呼叫模組。它更容易閱讀,並且 linter(例如yamllint)會更早地擷取更多錯誤。
我的例子是遵循這兩個規則。
核心答案
您的上述嘗試都沒有將實際的文件列表發送到 yum 模組以及每個元素的絕對路徑。如果您註冊結果,則很容易從您的複制任務中檢索此資訊。然後,您可以過濾數據(例如
json_query
)以僅獲取相關資訊。下面的劇本應該為您提供完成這項工作的關鍵
--- - name: Copy and install rpms hosts: all vars: RPM: - gskcrypt64-8.0.50.86.linux.ppcle.rpm - gskssl64-8.0.50.86.linux.ppcle.rpm - TIVsm-API64.ppc64le.rpm - TIVsm-BA.ppc64le.rpm tasks: - name: "Transfer Files" copy: src: "/root/ansible_playbooks/{{ item }}" dest: /root/ loop: "{{ RPM }}" register: copied - name: "Install RPMs from local copied files" yum: name: "{{ copied | json_query('results[?!failed].dest[]') }}"
筆記
?!failed
如果您決定忽略複製任務中的錯誤,則查詢中的過濾器僅用於過濾掉有錯誤的結果。如果您願意,可以將其刪除(即json_query('results[].dest')
)loop: "{{ RPM }}"
嚴格等價於with_items: "{{ RPM }}"
。loop
是一種較新的語法,在 ansible 2.5 中引入。兩種語法都有效。有關更多詳細資訊,請參閱ansible 循環文件。