前言

前言

我有以下 yaml ansible-playbook 并希望传输 rpm,然后将它们本地安装到远程计算机上。直到传输文件步骤正常工作,但是在安装部分我遇到以下错误:"Failure talking to yum: near \"gskcrypt64\": syntax error" 知道如何克服这部分吗?

安斯波版本:

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 

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

前言

除非您遇到极其特殊的情况,否则您永远不应该使用loopwith_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 中引入。两种语法都是有效的。看ansible 循环文档更多细节。

相关内容