2017-03-05 2 views
2

Ich versuche, ein paar Ansible-Befehle abhängig von dem Ergebnis einer bedingten Überprüfung in meinen Aufgaben basierend auf dem Vorhandensein eines Boolean auszuführen und knüpfe mich in Knoten, um es zu bekommen Arbeit.Ansible 2 conditionals mit with_items in Schleife

Das gewünschte Ergebnis ist wie folgt, und sollte für jedes Element in dem hosts Array ausgeführt werden:

  • Überprüfen, ob das lynchburg Variable true oder false
  • Wenn die lynchburg variable true ist:
    • -Setup der Ordnerstruktur , wenn es nicht bereits exis t
    • erstellen gulpfile.js von der mitgelieferten Vorlagendatei , wenn es nicht bereits
  • vorhanden Wenn die lynchburg Variable false:
    • Sie die Ordnerstruktur nicht Setup
    • Don 't create gulpfile.js
  • Regar dless davon, ob die lynchburg ist true oder false, überspringt alle Aufgaben bei zukünftigen reprovisions, wie die Ordnerstruktur und gulpfile.js entweder dort oder nicht (obwohl diese Sorge in dem conditionals von der Logik genommen werden sollte)

von dem Code unten enthalten, da sehe ich die folgenden Ergebnisse:

  • Wenn lynchburgtrue ist, läuft die Bereitstellung wie erwartet durch beim ersten Mal und nachfolgende reprovisions auch als erwartet.
  • Wenn lynchburgfalse, die inc Ordnerstruktur ist ist erstellt, aber gulpfile.jsist nicht.

Die Hauptschleife die Aufgabe durchlaufen sollte, ist die folgende:

vhosts: 
    - site_name: sample 
    lynchburg: true 

und die Aufgaben sind wie folgt:

# Create variable to check whether Lynchburg has already been installed 
- name: Check if Lynchburg assets folders have been previously created 
    stat: 
    path: /var/www/{{ item.site_name }}/inc 
    with_items: "{{ vhosts }}" 
    when: item.lynchburg == true 
    register: lynchburg_assets 

- name: Check if Lynchburg gulpfile.js has been previously created 
    stat: 
    path: /var/www/{{ item.site_name }}/gulpfile.js 
    with_items: "{{ vhosts }}" 
    when: item.lynchburg == true 
    register: lynchburg_gulpfile 

- name: Create inc folder 
    with_items: "{{ lynchburg_assets.results }}" 
    file: 
    path: /var/www/{{ item.item.site_name }}/inc 
    state: directory 
    when: item.stat.isdir is undefined and item.item.lynchburg == true 

- name: Create scss folder 
    with_items: "{{ lynchburg_assets.results }}" 
    file: 
    path: /var/www/{{ item.item.site_name }}/inc/scss 
    state: directory 
    when: item.stat.isdir is undefined and item.item.lynchburg == true 

- name: Create js folder 
    with_items: "{{ lynchburg_assets.results }}" 
    file: 
    path: /var/www/{{ item.item.site_name }}/inc/js 
    state: directory 
    when: item.stat.isdir is undefined and item.item.lynchburg == true 

- name: Create img folder 
    with_items: "{{ lynchburg_assets.results }}" 
    file: 
    path: /var/www/{{ item.item.site_name }}/inc/img 
    state: directory 
    when: item.stat.isdir is undefined and item.item.lynchburg == true 

- name: Create fonts folder 
    with_items: "{{ lynchburg_assets.results }}" 
    file: 
    path: /var/www/{{ item.item.site_name }}/inc/fonts 
    state: directory 
    when: item.stat.isdir is undefined and item.item.lynchburg == true 

- name: Create gulpfile.js 
    with_items: "{{ lynchburg_gulpfile.results }}" 
    template: 
    src: gulpfile.js 
    dest: /var/www/{{ item.item.site_name }}/gulpfile.js 
    when: item.stat.exists is defined and item.stat.exists == false and item.item.lynchburg == true 

N.B. Wenn es eine andere Möglichkeit gibt, die vollständige Ordnerstruktur einfach zu erstellen, ohne fünf verschiedene Aufgaben auszuführen - eine für jeden Ordner/Unterordner - und jemand könnte Ihnen mitteilen, was das ist, würde das auch geschätzt werden!

Antwort

1

Wenn lynchburg ist false, die inc Ordnerstruktur ist erstellt, aber gulpfile.jsist nicht.

Ich weiß, wie es zu lösen, ich weiß es (noch) nicht, wie es zu erklären:

Ändern der Reihenfolge der Ausdrücke in der bedingten:

when: item.item.lynchburg == true and item.stat.isdir is undefined 

Für aus irgendeinem Grund:

when: dummy.key is undefined and false 

und

when: false and dummy.key is undefined 

geben andere Ergebnisse.

Es funktioniert wie erwartet nur beim Überprüfen der obersten Variablen (dummy is undefined).

+0

Danke! Ich habe mein ursprüngliches Problem gelöst (siehe meinen Kommentar), jedoch habe ich Ihre Lösung in einem anderen Bereich meines Ansible-Setups verwendet, bei dem ich aus genau den gleichen Gründen Probleme hatte und es hat perfekt funktioniert. –

+0

Dies liegt daran, dass das Schlüsselwort 'defined/undefined' etwas schmutziger verarbeitet wird (siehe [hier] (https://github.com/ansible/ansible/blob/ff20ab7d4439ad6e5ca099c428ac6d3f25a154e7/lib/ansible/playbook/conditional.py#L211))). Also bricht 'dummy.key' den Ausdruck jinja2, wenn nicht definiert, und der zweite Teil der Anweisung wird nicht getestet. Sie können tatsächlich alles schreiben, was Sie wollen, nach definierten/undefinierten, wie zum Beispiel: 'when: dummy.key ist undefiniert und alles und Sie und wollen'. Um dies zu umgehen, verwenden Sie den definierten/undefinierten Test als letzten oder ersetzen Sie ihn durch 'default' Werte. –

0

Ich habe das in einem Moment des blinden Experimentierens behoben. Ich habe die bedingte Überprüfung von den Ordnerstrukturtasks entfernt. Es wird also nur die rohe vhosts-Schleife überprüft, anstatt sie zuerst durchzulaufen und dann die Aufgaben für die Ergebnisse der Schleife auszuführen.

Meine Aufgaben sehen nun wie folgt aus, die genau zu funktionieren scheint, wie ich sie würden hoffen würde:

--- 
- name: Create inc folder 
    with_items: "{{ vhosts }}" 
    file: 
    path: /var/www/{{ item.site_name }}/inc 
    state: directory 
    when: item.lynchburg == true 

- name: Create scss folder 
    with_items: "{{ vhosts }}" 
    file: 
    path: /var/www/{{ item.site_name }}/inc/scss 
    state: directory 
    when: item.lynchburg == true 

- name: Create js folder 
    with_items: "{{ vhosts }}" 
    file: 
    path: /var/www/{{ item.site_name }}/inc/js 
    state: directory 
    when: item.lynchburg == true 

- name: Create img folder 
    with_items: "{{ vhosts }}" 
    file: 
    path: /var/www/{{ item.site_name }}/inc/img 
    state: directory 
    when: item.lynchburg == true 

- name: Create fonts folder 
    with_items: "{{ vhosts }}" 
    file: 
    path: /var/www/{{ item.site_name }}/inc/fonts 
    state: directory 
    when: item.lynchburg == true 

- name: Check if Lynchburg gulpfile.js has been previously created 
    stat: 
    path: /var/www/{{ item.site_name }}/gulpfile.js 
    with_items: "{{ vhosts }}" 
    when: item.lynchburg == true 
    register: lynchburg_gulpfile 

- name: Create gulpfile.js 
    with_items: "{{ lynchburg_gulpfile.results }}" 
    template: 
    src: gulpfile.js 
    dest: /var/www/{{ item.item.site_name }}/gulpfile.js 
    when: item.stat.exists is defined and item.stat.exists == false and item.item.lynchburg == true 

ich es in die Gemeinschaft verlassen werde mich zu sagen, ob dies aber richtig ist oder nicht, wie ich schon sagte, es scheint perfekt zu funktionieren.

Verwandte Themen