Ich stand vor dem gleichen Problem. In meinem Fall befand sich ein Teil meiner Variablen in einem Wörterbuch, dh mit der Variablen with_dict (Schleife), und ich musste 3 Befehle für jeden item.key ausführen. Diese Lösung ist relevanter, wenn Sie das Wörterbuch with_dict verwenden müssen, um mehrere Befehle auszuführen ( ohne dass with_items erforderlich ist ).
Die Verwendung von with_dict und with_items in einer Aufgabe hat nicht geholfen, da die Variablen nicht aufgelöst wurden.
Meine Aufgabe war wie:
- name: Make install git source
command: "{{ item }}"
with_items:
- cd {{ tools_dir }}/{{ item.value.artifact_dir }}
- make prefix={{ tools_dir }}/{{ item.value.artifact_dir }} all
- make prefix={{ tools_dir }}/{{ item.value.artifact_dir }} install
with_dict: "{{ git_versions }}"
Rollen / git / defaults / main.yml war:
---
tool: git
default_git: git_2_6_3
git_versions:
git_2_6_3:
git_tar_name: git-2.6.3.tar.gz
git_tar_dir: git-2.6.3
git_tar_url: https://www.kernel.org/pub/software/scm/git/git-2.6.3.tar.gz
Das Obige führte zu einem Fehler ähnlich dem folgenden für jedes {{item}} (für 3 Befehle wie oben erwähnt). Wie Sie sehen, werden die Werte von tools_dir nicht ausgefüllt (tools_dir ist eine Variable, die in den Standardwerten / main.yml einer allgemeinen Rolle definiert ist, und der Wert item.value.git_tar_dir wurde nicht ausgefüllt / aufgelöst).
failed: [server01.poc.jenkins] => (item=cd {# tools_dir #}/{# item.value.git_tar_dir #}) => {"cmd": "cd '{#' tools_dir '#}/{#' item.value.git_tar_dir '#}'", "failed": true, "item": "cd {# tools_dir #}/{# item.value.git_tar_dir #}", "rc": 2}
msg: [Errno 2] No such file or directory
Die Lösung war einfach. Anstatt das "COMMAND" -Modul in Ansible zu verwenden, habe ich das "Shell" -Modul verwendet und eine Variable in den Rollen / git / defaults / main.yml erstellt
Nun sieht die Rolle / git / defaults / main.yml folgendermaßen aus:
---
tool: git
default_git: git_2_6_3
git_versions:
git_2_6_3:
git_tar_name: git-2.6.3.tar.gz
git_tar_dir: git-2.6.3
git_tar_url: https://www.kernel.org/pub/software/scm/git/git-2.6.3.tar.gz
#git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make prefix={{ tools_dir }}/{{ item.value.git_tar_dir }} all && make prefix={{ tools_dir }}/{{ item.value.git_tar_dir }} install"
#or use this if you want git installation to work in ~/tools/git-x.x.x
git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make prefix=`pwd` all && make prefix=`pwd` install"
#or use this if you want git installation to use the default prefix during make
#git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make all && make install"
und die Aufgabenrollen / git / task / main.yml sehen wie folgt aus:
- name: Make install from git source
shell: "{{ git_pre_requisites_install_cmds }}"
become_user: "{{ build_user }}"
with_dict: "{{ git_versions }}"
tags:
- koba
Dieses Mal wurden die Werte erfolgreich ersetzt, da das Modul "SHELL" war und die Ansible-Ausgabe die korrekten Werte wiedergab. Dies erforderte keine with_items: Schleife.
"cmd": "cd ~/tools/git-2.6.3 && make prefix=/home/giga/tools/git-2.6.3 all && make prefix=/home/giga/tools/git-2.6.3 install",
shell
Modul. Wenn Sie die Dokumente auf dem Befehlsmodul lesen, werden Sie sehen, warum es nicht funktioniert. (keine vollständige Antwort, da ich sie nicht getestet habe)