Rhel

使用 Ansible 傳輸 RPM 文件並在本地安裝它們

  • July 16, 2019

我有以下 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"}

前言

除非您有非常特殊的情況,否則您永遠不應該使用loopwith_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 循環文件

引用自:https://unix.stackexchange.com/questions/527418