머리말

머리말

다음 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 }}"와 엄밀히 말하면 loopAnsible 2.5에 도입된 새로운 구문입니다. 두 구문 모두 유효합니다. 바라보다가능한 루프 문서자세한 내용은.

관련 정보