Ansible无视条件

时间:2014-07-12 00:03:54

标签: ansible ansible-playbook

我正在为我的服务器(ubuntu和centos的混合)制作一个ansible playbook,当试图在安装程序时为monit传输一些配置文件时,我遇到了一个问题。它完全适用于我的centos机器,但ubuntu无论完全忽略条件,它都会传输模板。

---
- name: Check for Sendmail (Ubuntu)
  shell: dpkg-query -W -f='${Status} ${Version}\n' sendmail
  register: ubuntu_installed
  when: ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu'
  changed_when: False
  failed_when: "'FAILED' in ubuntu_installed.stderr"

- debug: var=ubuntu_installed

- name: Check for Sendmail (CentOs)
  shell: rpm -qa | grep sendmail
  register: cent_installed
  when: ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux'
  changed_when: False
  failed_when: "'FAILED' in cent_installed.stderr"

- name: Transfer Monit config files for Sendmail (Ubuntu)
  template: src=monit/templates/sendmail.j2 dest=/etc/monit/conf.d/sendmail owner=root group=root mode=644
  when: ubuntu_installed.skipped is not defined and ubuntu_installed.stdout != "" and ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu'

- name: Transfer Monit config files for Sendmail (CentOs)
  template: src=monit/templates/sendmail.j2 dest=/etc/monit.d/sendmail owner=root group=root mode=644
  when: cent_installed.skipped is not defined and cent_installed.stdout != "" and ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux'

我在那里进行调试以检查以确保变量是正确的。当我运行剧本时,我得到......

TASK: [monit | debug var=ubuntu_installed] ************************************
ok: [server1] => {
    "item": "",
    "ubuntu_installed": {
        "changed": false,
        "cmd": "dpkg-query -W -f='${Status} ${Version}\\n' sendmail ",
        "delta": "0:00:00.012985",
        "end": "2014-07-11 16:56:12.688509",
        "failed": false,
        "failed_when_result": false,
        "invocation": {
            "module_args": "dpkg-query -W -f='${Status} ${Version}\\n' sendmail",
            "module_name": "shell"
        },
        "item": "",
        "rc": 1,
        "start": "2014-07-11 16:56:12.675524",
        "stderr": "dpkg-query: no packages found matching sendmail",
        "stdout": "",
        "stdout_lines": []
    }
}

完全无视条件ubuntu_installed.stdout != ""

1 个答案:

答案 0 :(得分:3)

这是你的条件:

-  when: ubuntu_installed.skipped is not defined and ubuntu_installed.stdout != "" and ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu'

您的precedence不正确:A和B以及C或D表示(A和B和C)或D,这不是您想要的。 (注意Ansible conditionals使用反映Python条件的Jinja2 expressions,所以here are the precedence rules)。

懒惰程序员为了清晰起见添加括号;这是修改后的条件:

-  when: (ubuntu_installed.skipped is not defined and ubuntu_installed.stdout != "") and (ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu')

PS-你将输出显示给一个命令debug,但是给出alllll输出是有帮助的。那是ansible-playbook -vvv