次の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 Playbook:
---
- 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
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"}
Edit2:
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"}
非常に特別な状況でない限り(_ doc を引用)、loop
または_with_item
_をyum
モジュールで使用しないでください。
ループで使用する場合:各パッケージは個別に処理されます。リストを名前オプションに直接渡す方がはるかに効率的です。
モジュールを呼び出すために最新の完全なyaml構文を採用してください。読みやすくなり、リンター(例: yamllint )がより多くのエラーを早期にキャッチします。
私の例では、これらの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 }}"
_と完全に同等です。 loop
は新しい構文で、ansible 2.5で導入されました。どちらの構文も有効です。詳細は ansible loopsのドキュメント を参照してください。