Ansible 可忽略条件
我正在为我的服务器(ubuntu和centos的混合)编写ansible playbook,当我试图为monit传输一些配置文件时,如果安装了程序,我会遇到问题。它在我的centos机器上运行得很好,但是ubuntu的它会传输模板,不管发生什么,完全忽略条件Ansible 可忽略条件,ansible,ansible-playbook,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_i
---
- 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\u installed.stdout!=“”
以下是您的条件:
- when: ubuntu_installed.skipped is not defined and ubuntu_installed.stdout != "" and ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu'
- when: (ubuntu_installed.skipped is not defined and ubuntu_installed.stdout != "") and (ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu')
你的答案不正确:A和B和C或D的意思是(A和B和C)或D,这不是你想要的。(注意use,它反映Python条件,所以)
懒惰的程序员为了清晰起见添加了括号;以下是修订后的条件:
- when: ubuntu_installed.skipped is not defined and ubuntu_installed.stdout != "" and ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu'
- 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(ansible_发行版=='Debian'或ansible_发行版=='Ubuntu')也可以折叠成(ansible_os_家族=='Debian')