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
Variabletrue
oderfalse
- Wenn die
lynchburg
variabletrue
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
Variablefalse
:- Sie die Ordnerstruktur nicht Setup
- Don 't create
gulpfile.js
- Regar dless davon, ob die
lynchburg
isttrue
oderfalse
, überspringt alle Aufgaben bei zukünftigen reprovisions, wie die Ordnerstruktur undgulpfile.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
lynchburg
true
ist, läuft die Bereitstellung wie erwartet durch beim ersten Mal und nachfolgende reprovisions auch als erwartet. - Wenn
lynchburg
false
, dieinc
Ordnerstruktur ist ist erstellt, abergulpfile.js
ist 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!
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. –
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. –