2016-06-17 11 views
8

Ich habe die folgenden Aufgaben in einem Textbuch ich schreibe (Ergebnisse in < neben der Debug-Anweisung aufgeführt>):ansible „wenn Variable == true“ nicht verhalten wie erwartet

- 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: '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/ 

Und ich m Lauf es mit dem folgenden Befehl:

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

der ersten Durchgänge umfassen, aber die zweite überspringt mit diesem Ausgang:

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

Ich habe den Eindruck, dass die bedingte Prüfung sollte für alle von ihnen als force_install == true ergibt true, die das ganze when bewerten sollte wahr (da es eine Reihe von 'OR's ist).

Wie bekomme ich den Zeitpunkt, wenn die Variablen richtig gesetzt sind?


Edit:

die zweite Änderung, wenn für die Install NRPE den folgenden Werken gehören, aber nicht erklären, warum die andere, Run the prep Läufe geeignet:

Arbeits:

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

Funktioniert auch:

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

Problem:

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

Die verkürzte Ausgabe des jeweiligen Abschnitts des Stückes (Duplikate entfernt) ist:

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} 

Antwort

30

Sie müssen die Variable auf einen boolean konvertieren:

force_install|bool == true 

Ich behaupte nicht, ich verstehe th Die Logik dahinter. In Python sollte jede nicht leere Zeichenfolge truthy sein. Wenn es jedoch direkt in einer Bedingung verwendet wird, wird es als falsch ausgewertet.

Der bool-Filter interpretiert dann die Strings "true" und "yes" (case-insensitive) als wahr. Jede andere Zeichenfolge ist falsch.

Vielleicht möchten Sie auch ein Standardwert für den Fall festgelegt force_install nicht definiert ist, da sie in eine undefinierte Variable Fehler führen würde:

force_install|default(false)|bool == true 
+4

ist nicht '== true' überflüssig? –

+4

Richtig, das können Sie natürlich weglassen. 'force_install | default (false) | bool' – udondan

+0

Und da' None', 'False',' 0' und '" '' (die leere Zeichenkette) falsche Werte sind und nicht-leere Zeichenketten wahre Werte sind, können Sie normalerweise weglassen die 'bool' Umwandlung und sag einfach zB 'force_install | default (Falsch)'. – akaihola

Verwandte Themen