Solución:
Si un valor en YAML comienza con una llave ({
), el analizador YAML asume que es un diccionario. Entonces, para casos como este donde hay una variable (Jinja2) en el valor, se debe adoptar una de las siguientes dos estrategias para evitar confundir el analizador YAML:
Cite todo el comando:
- command: "{{ item }} chdir=/src/package/"
with_items:
- ./configure
- /usr/bin/make
- /usr/bin/make install
o cambiar el orden de los argumentos:
- command: chdir=/src/package/ {{ item }}
with_items:
- ./configure
- /usr/bin/make
- /usr/bin/make install
Gracias por la sugerencia alternativa de @RamondelaFuente.
Para ejecutar varios comandos de shell con ansible, puede usar el cascarón módulo con una cadena de varias líneas (tenga en cuenta el tubo después shell:
), como se muestra en este ejemplo:
- name: Build nginx
shell: |
cd nginx-1.11.13
sudo ./configure
sudo make
sudo make install
Me enfrenté al mismo problema. En mi caso, parte de mis variables estaban en un diccionario, es decir, con la variable with_dict (bucle) y tuve que ejecutar 3 comandos en cada item.key. Esta solución es más relevante cuando tiene que usar el diccionario with_dict con la ejecución de varios comandos (sin requerir with_items)
El uso de with_dict y with_items en una tarea no ayudó, ya que no resolvió las variables.
Mi tarea fue como:
- 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 }}"
roles / git / defaults / main.yml fue:
---
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
Lo anterior resultó en un error similar al siguiente para cada {{item}} (para 3 comandos como se mencionó anteriormente). Como puede ver, los valores de tools_dir no se completan (tools_dir es una variable que se define en los valores predeterminados de un rol común / main.yml y también el valor de item.value.git_tar_dir no se completó / resolvió).
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 solución fue fácil. En lugar de usar el módulo “COMMAND” en Ansible, usé el módulo “Shell” y creé una variable en roles / git / defaults / main.yml
Entonces, ahora roles / git / defaults / main.yml se ve así:
---
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"
y la tarea roles / git / tasks / main.yml parece:
- name: Make install from git source
shell: "{{ git_pre_requisites_install_cmds }}"
become_user: "{{ build_user }}"
with_dict: "{{ git_versions }}"
tags:
- koba
Esta vez, los valores se sustituyeron con éxito ya que el módulo era “SHELL” y la salida ansible hizo eco de los valores correctos. Esto no requirió with_items: círculo.
"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",