Ansible"when variable == true"表现不符合预期

编程入门 行业动态 更新时间:2024-10-24 20:13:18
本文介绍了Ansible"when variable == true"表现不符合预期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在写的剧本中有以下任务(结果在<>的debug语句旁边列出):

- debug: var=nrpe_installed.stat.exists <true> - debug: var=force_install <true> - debug: var=plugins_installed.stat.exists <true> - name: Run the prep include: prep.yml when: (nrpe_installed.stat.exists == false or plugins_installed.stat.exists == true or force_install == true) tags: ['prep'] - debug: var=nrpe_installed.stat.exists <true> - debug: var=force_install <true> - debug: var=force_nrpe_install <false> - name: Install NRPE include: install-nrpe.yml when: (nrpe_installed.stat.exists == false or force_install == true or force_nrpe_install == true) tags: ['install_nrpe'] vars: nrpe_url: 'url.goes.here' nrpe_md5: 3921ddc598312983f604541784b35a50 nrpe_version: 2.15 nrpe_artifact: nrpe-{{ nrpe_version }}.tar.gz nagios_ip: {{ nagios_ip }} config_dir: /home/ansible/config/

我正在使用以下命令运行它:

ansible-playbook install.yml -i $invFile --extra-vars="hosts=webservers force_install=True"

第一个包含运行,但是第二个包含以下输出:

skipping: [server1] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}

我的印象是,所有条件检查都应通过,因为force_install == true评估为true,这应该使整个when评估为true(因为它是一系列的或")./p>

如何正确设置变量后何时运行?

将Install NRPE include的第二个时间更改为以下作品,但没有解释为什么另一个Run the prep可以正常运行:

工作:

when: (not nrpe_installed.stat.exists or force_install or force_nrpe_install)

也在工作:

when: (nrpe_installed.stat.exists == false or plugins_installed.stat.exists == true or force_install == true)

不起作用:

when: (nrpe_installed.stat.exists == false or force_install == true or force_nrpe_install == true)

该剧的特定部分的截断(删除重复项)输出为:

TASK [debug] ******************************************************************* ok: [server2] => { "nrpe_installed.stat.exists": true } TASK [debug] ******************************************************************* ok: [server2] => { "plugins_installed.stat.exists": true } TASK [debug] ******************************************************************* ok: [server2] => { "force_install": true } TASK [Run the prep] ************************************************************ included: /tasks/nrpe-install/prep.yml for server2, server3, server4, server5, server6, server7 TASK [Prep and configure for installation | Install yum packages] ************** ok: [server6] => (item=[u'gcc', u'glibc', u'glibc-common', u'gd', u'gd-devel', u'make', u'net-snmp', u'openssl-devel', u'unzip', u'tar', u'gzip', u'xinetd']) => {"changed": false, "item": ["gcc", "glibc", "glibc-common", "gd", "gd-devel", "make", "net-snmp", "openssl-devel", "unzip", "tar", "gzip", "xinetd"], "msg": "", "rc": 0, "results": ["gcc-4.1.2-55.el5.x86_64 providing gcc is already installed", "glibc-2.5-123.el5_11.3.i686 providing glibc is already installed", "glibc-common-2.5-123.el5_11.3.x86_64 providing glibc-common is already installed", "gd-2.0.33-9.4.el5_4.2.x86_64 providing gd is already installed", "gd-devel-2.0.33-9.4.el5_4.2.i386 providing gd-devel is already installed", "make-3.81-3.el5.x86_64 providing make is already installed", "net-snmp-5.3.2.2-20.el5.x86_64 providing net-snmp is already installed", "openssl-devel-0.9.8e-40.el5_11.x86_64 providing openssl-devel is already installed", "unzip-5.52-3.el5.x86_64 providing unzip is already installed", "tar-1.15.1-32.el5_8.x86_64 providing tar is already installed", "gzip-1.3.5-13.el5.centos.x86_64 providing gzip is already installed", "xinetd-2.3.14-20.el5_10.x86_64 providing xinetd is already installed"]} TASK [Prep and configure for installation | Make nagios group] ***************** ok: [server2] => {"changed": false, "gid": 20002, "name": "nagios", "state": "present", "system": false} TASK [Prep and configure for installation | Make nagios user] ****************** ok: [server6] => {"append": false, "changed": false, "comment": "User for Nagios NRPE", "group": 20002, "home": "/home/nagios", "move_home": false, "name": "nagios", "shell": "/bin/bash", "state": "present", "uid": 20002} TASK [debug] ******************************************************************* ok: [server2] => { "nrpe_installed.stat.exists": true } TASK [debug] ******************************************************************* ok: [server2] => { "force_install": true } TASK [debug] ******************************************************************* ok: [server2] => { "force_nrpe_install": false } TASK [Install NRPE] ************************************************************ skipping: [server2] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}

解决方案

您需要将变量转换为布尔值:

force_install|bool == true

我并不是说我了解其背后的逻辑.在python中,任何非空字符串都应该是真实的.但是,当直接在某种条件下使用时,它的评估结果为false.

布尔过滤器然后再次将字符串'yes','on','1','true'(不区分大小写)和1解释为true(请参见源).其他任何字符串都是false.

在未定义force_install的情况下,您可能还希望设置一个默认值,因为这将导致未定义变量错误:

force_install|default(false)|bool == true

I have the following tasks in a playbook I'm writing (results listed next to the debug statement in <>):

- debug: var=nrpe_installed.stat.exists <true> - debug: var=force_install <true> - debug: var=plugins_installed.stat.exists <true> - name: Run the prep include: prep.yml when: (nrpe_installed.stat.exists == false or plugins_installed.stat.exists == true or force_install == true) tags: ['prep'] - debug: var=nrpe_installed.stat.exists <true> - debug: var=force_install <true> - debug: var=force_nrpe_install <false> - name: Install NRPE include: install-nrpe.yml when: (nrpe_installed.stat.exists == false or force_install == true or force_nrpe_install == true) tags: ['install_nrpe'] vars: nrpe_url: 'url.goes.here' nrpe_md5: 3921ddc598312983f604541784b35a50 nrpe_version: 2.15 nrpe_artifact: nrpe-{{ nrpe_version }}.tar.gz nagios_ip: {{ nagios_ip }} config_dir: /home/ansible/config/

And I'm running it with the following command:

ansible-playbook install.yml -i $invFile --extra-vars="hosts=webservers force_install=True"

The first include runs, but the second skips with this output:

skipping: [server1] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}

I'm under the impression that the conditional check should pass for all of them as force_install == true evaluates to true which should make the whole when evaluate to true (since it's a series of 'OR's).

How do I get the when to run when the variables are set appropriately?

Edit:

Changing the second when for the Install NRPE include to the following works, but doesn't explain why the other one, Run the prep runs appropriately:

Working:

when: (not nrpe_installed.stat.exists or force_install or force_nrpe_install)

Also working:

when: (nrpe_installed.stat.exists == false or plugins_installed.stat.exists == true or force_install == true)

Not working:

when: (nrpe_installed.stat.exists == false or force_install == true or force_nrpe_install == true)

The truncated (duplicates removed) output of that particular section of the play is:

TASK [debug] ******************************************************************* ok: [server2] => { "nrpe_installed.stat.exists": true } TASK [debug] ******************************************************************* ok: [server2] => { "plugins_installed.stat.exists": true } TASK [debug] ******************************************************************* ok: [server2] => { "force_install": true } TASK [Run the prep] ************************************************************ included: /tasks/nrpe-install/prep.yml for server2, server3, server4, server5, server6, server7 TASK [Prep and configure for installation | Install yum packages] ************** ok: [server6] => (item=[u'gcc', u'glibc', u'glibc-common', u'gd', u'gd-devel', u'make', u'net-snmp', u'openssl-devel', u'unzip', u'tar', u'gzip', u'xinetd']) => {"changed": false, "item": ["gcc", "glibc", "glibc-common", "gd", "gd-devel", "make", "net-snmp", "openssl-devel", "unzip", "tar", "gzip", "xinetd"], "msg": "", "rc": 0, "results": ["gcc-4.1.2-55.el5.x86_64 providing gcc is already installed", "glibc-2.5-123.el5_11.3.i686 providing glibc is already installed", "glibc-common-2.5-123.el5_11.3.x86_64 providing glibc-common is already installed", "gd-2.0.33-9.4.el5_4.2.x86_64 providing gd is already installed", "gd-devel-2.0.33-9.4.el5_4.2.i386 providing gd-devel is already installed", "make-3.81-3.el5.x86_64 providing make is already installed", "net-snmp-5.3.2.2-20.el5.x86_64 providing net-snmp is already installed", "openssl-devel-0.9.8e-40.el5_11.x86_64 providing openssl-devel is already installed", "unzip-5.52-3.el5.x86_64 providing unzip is already installed", "tar-1.15.1-32.el5_8.x86_64 providing tar is already installed", "gzip-1.3.5-13.el5.centos.x86_64 providing gzip is already installed", "xinetd-2.3.14-20.el5_10.x86_64 providing xinetd is already installed"]} TASK [Prep and configure for installation | Make nagios group] ***************** ok: [server2] => {"changed": false, "gid": 20002, "name": "nagios", "state": "present", "system": false} TASK [Prep and configure for installation | Make nagios user] ****************** ok: [server6] => {"append": false, "changed": false, "comment": "User for Nagios NRPE", "group": 20002, "home": "/home/nagios", "move_home": false, "name": "nagios", "shell": "/bin/bash", "state": "present", "uid": 20002} TASK [debug] ******************************************************************* ok: [server2] => { "nrpe_installed.stat.exists": true } TASK [debug] ******************************************************************* ok: [server2] => { "force_install": true } TASK [debug] ******************************************************************* ok: [server2] => { "force_nrpe_install": false } TASK [Install NRPE] ************************************************************ skipping: [server2] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}

解决方案

You need to convert the variable to a boolean:

force_install|bool == true

I don't claim I understand the logic behind it. In python any non-empty string should be truthy. But when directly used in a condition it evaluates to false.

The bool filter then again interprets the strings 'yes', 'on', '1', 'true' (case-insensitive) and 1 as true (see source). Any other string is false.

You might want to also set a default value in case force_install is not defined, since it would result in an undefined variable error:

force_install|default(false)|bool == true

更多推荐

Ansible"when variable == true"表现不符合预期

本文发布于:2023-11-22 03:32:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1615817.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:不符合   quot   Ansible   true   variable

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!