2016-10-11 1 views
0

melde ich mich eine Liste mit variabler lxcs_info.results in meinem ansible Textbuch, das mit folgenden LXC bezogenen Daten aufgefüllt wird:Wie kann man eine String-Bedingung tief in Ansible List-Variable testen?

ok: [webserver] => { 
    "lxcs_info": { 
     "changed": false, 
     "results": [ 
      { 
       "_ansible_item_result": true, 
       "changed": false, 
       "invocation": { 
        "module_args": { 
         "name": "cndev", 
         "state": "started", 
         "template": "ubuntu", 
        }, 
        "module_name": "lxc_container" 
       }, 
       "item": { 
        "backing_store": "dir", , 
        "container_config": [ 
         "lxc.group = dev", 
         "lxc.group = mdblxc", 
         "lxc.network.type = veth", 
         "lxc.network.link = lxcbr0" 
        ], 
        "name": "cndev", 
        "state": "started", 
        "template": "ubuntu", 
       }, 
       "lxc_container": { 
        "interfaces": [ 
         "eth0", 
         "lo" 
        ], 
        "ips": [ 
         "10.0.3.2" 
        ], 
        "name": "cndev", 
        "state": "running" 
       } 
      }, 
      { 
      # another result-item like the above 
      }, 
      { 
      # yet another item with same structure as above 
      } 
     ] 
    } 
} 

Wie ich bin interessiert an dem container_config -Abschnitt meist, ich brauche eine Aufgabe, die einen Befehl ausführt basierend auf der Bedingung des Inhalts dieser Elemente, insbesondere unter der Bedingung, dass Inhalt in der item.container_config ist genau lxc.group = mdblxc. Wie soll ich die when -Klausel dafür schreiben? Ich habe mit der untenen Aufgabe versucht,

- name: Test task 
    debug: msg="Found mdblxc in {{ item }}" 
    with_items: lxcs_info.results 
    when: item.item.container_config.0.lxc.group == "mdblxc" 

, aber es funktioniert nicht - ansible-Textbuch wird mit Fehler:

fatal: [webserver]: FAILED! => { 
    "failed": true, 
    "msg": "The conditional check '(item.item.container_config.0.lxc.group == \"mdblxc\")' failed. 
      The error was: error while evaluating conditional ((item.item.container_config.0.lxc.group == \"mdblxc\"): 'unicode object' has no attribute 'lxc' 

      The error appears to have been in 'mytask.yaml': line nnn, column 3, but may 
      be elsewhere in the file depending on the exact syntax problem. 

      The offending line appears to be: 
      with_items: lxcs_info.results 
      - name: Test task 
      ^here 
     " 
} 

Antwort

0

Wenn Sie aufmerksam auf container_config zahlen Sie feststellen, dass es sich um eine Liste von String-Elementen.
Sie können nicht auf lxc.group der Zeichenfolge "lxc.group = mdblxc" zugreifen.

So when Sie Anweisung sollte wie folgt aussehen:

when: '"lxc.group = mdblxc" in item.item.container_config' 
+0

Thanks @ konstantin-suvorov für Ihre richtige Antwort! Ich hatte bemerkt, dass die yaml/json-Liste diese String-Elemente tief in der Struktur hat, aber keine Möglichkeit gefunden hatte, diese in Vergleichsoperationen in Tasks anzusteuern, aber jetzt funktioniert dein A und in meinem Playbook habe ich es etwas erweitert (um auf meine Bedürfnisse bei der Aufgabenstellung eingehen zu können). So sieht die when-Klausel im Produktions-Playbook aus: –

+0

'when: '(" lxc.group = mdblxc "in item.container_config und" dbserver "== inventory_hostname) oder (" lxc.group = weblxc "in item. container_config und "webserver" == inventory_hostname) ' –

+0

Hmm. scheint, dass der Abschlag in diesen Kommentaren nicht funktioniert (die "at" und back-ticks haben in den obigen Kommentaren keine Auswirkung), weiß nicht warum;) –

Verwandte Themen