如何在 ansible 条件中正确使用 stdout?

如何在 ansible 条件中正确使用 stdout?
tasks:
    - name: check if rpmforge installed
      shell: rpm -q rpmforge-release-0.5.3-1.el6.rf.i686
      register: shell_output

    - name: Enable repo for htop
      shell: "{{ item }}"
      with_items:
        - wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm
        - sudo rpm -Uhv rpmforge-release-0.5.3-1.el6.rf.i686.rpm
      when: shell_output.stdout.find('not installed') != -1

上述任务失败,原因如下:

failed: [default] => {"changed": true, "cmd": "rpm -q rpmforge-release-0.5.3-1.el6.rf.i686", "delta": "0:00:00.100877", "end": "2016-01-08 09:05:30.495234", "rc": 1, "start": "2016-01-08 09:05:30.394357", "warnings": ["Consider using yum module rather than running rpm"]}
stdout: package rpmforge-release-0.5.3-1.el6.rf.i686 is not installed

标准输出包含短语“未安装”。

Ansible 版本 1.9.4,在 OSX El Capitan 上使用 Vagrant 和 Virtualbox 运行(截至 2016 年 1 月的最新版本)

答案1

Ansible 看到rpm -q返回非零退出代码并中止。

您需要像这样更改它以告诉 Ansible 不要关心退出代码:

tasks:
    - name: check if rpmforge installed
      shell: rpm -q rpmforge-release-0.5.3-1.el6.rf.i686
      register: shell_output
      failed_when: false
      changed_when: false

(我还添加了,changed_when所以 Ansible 不会告诉你某些变化,就像它通常对每个shell任务所做的那样。因为当你查询 RPM 数据库时没有任何变化。)

第二个任务很好。

相关内容