ヘッダー

ヘッダー

次のyaml ansible-playbookがあり、rpmsを送信してからリモートシステムにローカルにインストールしようとしています。ファイル転送フェーズまではうまく機能しますが、インストール部分では次のエラーが発生します。"Failure talking to yum: near \"gskcrypt64\": syntax error" この部分を克服する方法を知っていますか?

Anspooバージョン:

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)]

アンサーブルマニュアル:

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

以下を使用してシェルモジュールを変更すると、同じエラーが報告されます。

   - 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 

編集1:ファイルがすでに反対側にあるので、次のループを試しました。

---
- 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"}

答え1

ヘッダー

特に特別な状況ではない限り、このモジュールを使用または使用しないでください。(loop引用文with_itemyum文書)

ループで使用する場合:各パッケージは個別に処理され、リストをnameオプションに直接渡す方が効率的です。

自分に役立つことをしてください。現代の完全なYAML構文を使用してモジュールを呼び出します。読んで確認するのは簡単です(例:ヤムリント)より早くより多くのエラーが見つかります。

私の例はこれら2つの規則に従います。

重要な答え

上記のいずれの試みも、各要素の絶対パスとともに実際のファイルのリストを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 }}"と厳密に言えば、loopAnsible 2.5で導入された新しい構文です。どちらの構文も有効です。バラより可能なループ文書詳細については。

関連情報