다음 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_item
(인용문yum
문서)
루프와 함께 사용하는 경우: 각 패키지는 개별적으로 처리되며 목록을 name 옵션에 직접 전달하는 것이 더 효율적입니다.
자신에게 도움이 되는 일을 하세요. 현대적인 전체 YAML 구문을 사용하여 모듈을 호출하세요. 읽고 확인하기가 더 쉽습니다(예:얌린트) 더 일찍 더 많은 오류를 발견할 것입니다.
내 예는 이 두 가지 규칙을 따릅니다.
핵심 답변
위의 시도 중 어느 것도 각 요소의 절대 경로와 함께 실제 파일 목록을 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에 도입된 새로운 구문입니다. 두 구문 모두 유효합니다. 바라보다가능한 루프 문서자세한 내용은.