Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible 可忽略条件_Ansible_Ansible Playbook - Fatal编程技术网

Ansible 可忽略条件

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

我正在为我的服务器(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\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')