Ansible “when variable == true” non si comporta come previsto

Ho le seguenti attività in un playbook che sto scrivendo (risultati elencati accanto all’istruzione debug in ):

- debug: var=nrpe_installed.stat.exists  - debug: var=force_install  - debug: var=plugins_installed.stat.exists  - 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  - debug: var=force_install  - debug: var=force_nrpe_install  - 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: 'http://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/ 

E lo sto eseguendo con il seguente comando:

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

Il primo include corre, ma il secondo salta con questo output:

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

Ho l’impressione che il controllo condizionale debba passare per tutti come force_install == true true che dovrebbe rendere il tutto when valuta su true (poiché si tratta di una serie di “OR”).

Come ottengo il momento in cui eseguire quando le variabili sono impostate in modo appropriato?


    Modificare:

    Modifica del secondo quando l’ Install NRPE include i seguenti lavori, ma non spiega perché l’altro, Run the prep in modo appropriato:

    Lavoro:

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

    Funzionando anche:

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

    Non funziona:

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

    L’output troncato (duplicato rimosso) di quella particolare sezione del gioco è:

     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} 

    Devi convertire la variabile in un booleano:

     force_install|bool == true 

    Non pretendo di capire la logica dietro. In Python qualsiasi stringa non vuota dovrebbe essere sincera. Ma se usato direttamente in una condizione, viene valutato come falso.

    Il filtro bool interpreta nuovamente le stringhe “true” e “yes” (case-insensitive) come true. Qualsiasi altra stringa è falsa.

    Si potrebbe anche voler impostare un valore predefinito nel caso in cui force_install non sia definito, poiché risulterebbe in un errore variabile non definito :

     force_install|default(false)|bool == true 

    Sì … certamente richiede test. io raccomando

    • | bool | bool va bene a meno che non ti aspetti un vde indefinito
    • var is defined and (var | bool) se ci si aspetta vars indefinite

    default(False) è OK per quanto tempo e sei felice che questi siano veri se l’input non viene analizzato da YAML. Cioè le variabili definite attraverso il parametro CLI --extra_vars sono stringhe.

      "false" "null" "defined string" 

    Spero che questo ti aiuti:

     #!/usr/bin/env ansible-playbook --- - name: Test truthiness hosts: localhost gather_facts: False vars: truthy_vars: # TRUE - True - 1 - "true" # FALSE - "false" - null - False - 0 # ERROR (invalid sytax error stops the loop of the first of these) - "null" - "defined string" # ERROR # truthy_var_undefined # FALSE truthy_var_defined: tasks: - name: Test truthy debug: msg: "is truthy" ignore_errors: True # beware, the loo when: item loop: "{{ truthy_vars }}" loop_control: label: Test {{ item }} - name: truthy_var_undefined debug: when: truthy_var_undefined ignore_errors: true - name: truthy_var_defined debug: when: truthy_var_defined - name: Test | default(False) hosts: localhost gather_facts: False vars: default_pipe_vars: # TRUE - True - 1 - "true" # beware these: - "false" - "null" - "defined string" # FALSE - null - False - 0 # FALSE # default_pipe_undefined # FALSE default_pipe_defined: tasks: - name: Test | default(False) debug: msg: "is not | default(False)" when: item | default(False) loop: "{{ default_pipe_vars }}" loop_control: label: Test {{ item }} - name: default_pipe_undefined | default(False) debug: when: default_pipe_undefined | default(False) - name: default_pipe_defined | default(False) debug: when: default_pipe_defined | default(False) - name: Test | bool hosts: localhost gather_facts: False vars: bool_vars: # TRUE - True - 1 - "true" # FALSE - "defined string" - "null" - "false" - null - False - 0 # ERROR # bool_undefined # FALSE bool_defined: tasks: - name: Test bool parsing debug: msg: "parsed as true booleans" when: item | bool loop: "{{ bool_vars }}" loop_control: label: Test {{ item }} - name: bool_undefined | bool debug: when: bool_undefined | bool ignore_errors: true - name: bool_defined var | bool debug: when: bool_defined | bool - name: Test is defined and | bool hosts: localhost gather_facts: False vars: defined_bool_vars: # TRUE - True - 1 - "true" # FALSE - "defined string" - "null" - "false" - null - False - 0 # FALSE # defined_bool_undefined # FALSE defined_bool_defined: tasks: - name: Test bool parsing debug: msg: "parsed as true booleans" when: - item is defined - item | bool loop: "{{ defined_bool_vars }}" loop_control: label: Test {{ item }} - name: defined_bool_undefined | bool debug: when: - defined_bool_undefined is defined - defined_bool_undefined | bool ignore_errors: true - name: defined_bool_defined var | bool debug: when: - defined_bool_defined is defined - defined_bool_defined | bool 

    https://gist.github.com/kcd83/4ea23d201c271b58f1c4ef7844408657