Ho affrontato lo stesso problema. Nel mio caso, parte delle mie variabili erano in un dizionario cioè con variabile_dict (looping) e dovevo eseguire 3 comandi su ogni item.key. Questa soluzione è più rilevante dove si deve utilizzare il dizionario with_dict con l'esecuzione di più comandi (senza richiedere with_items)
Utilizzando with_dict e with_items in un compito non ha aiutato in quanto non è stata risolvendo le variabili.
Il mio compito è stato come:
- 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 }}"
ruoli/git/default/main.yml era:
---
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
È possibile che questo ha provocato un errore simile a quanto segue per ogni {{oggetto} } (per 3 comandi come menzionato sopra). Come vedete, i valori di tools_dir non sono popolati (tools_dir è una variabile che è definita nel default di un ruolo comune/main.yml e anche il valore item.value.git_tar_dir non è stato popolato/risolto).
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
La soluzione è stata semplice. Invece di usare il modulo "COMANDO" in Ansible, ho usato il modulo "Shell" e ho creato una variabile in ruoli/git/defaults/main.yml
Quindi, ora ruoli/git/default/main.yml assomiglia:
---
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"
e il compito ruoli/git/attività/main.yml assomiglia:
- name: Make install from git source
shell: "{{ git_pre_requisites_install_cmds }}"
become_user: "{{ build_user }}"
with_dict: "{{ git_versions }}"
tags:
- koba
Questa volta, i valori ricevuti sostituiti con successo come il modulo è stato "SHELL" e l'output ansible ha fatto eco ai valori corretti. Questo non ha richiesto with_items: ciclo.
"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",
um, prova ad usare il modulo 'shell'. Se leggi [i documenti sul modulo di comando] (http://docs.ansible.com/command_module.html) vedrai perché non funziona. (non una risposta completa bc non l'ho ancora testata) – tedder42
Ben dispiaciuto, ma ho letto la shell e comando documenti prima e ancora non so perché non funziona. –