Bienvenido a nuestro sitio, en este sitio vas a hallar la resolución de lo que andabas buscando.
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:
Cita el comando completo:
- 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 múltiples comandos de shell con ansible, puede usar el cascarón módulo con multilínea string (nota la 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, la variable with_dict (bucle) y tuve que ejecutar 3 comandos en cada elemento.key. Esta solución es más relevante cuando tiene que usar el diccionario with_dict con la ejecución de múltiples comandos (sin requerir with_items)
El uso de with_dict y with_items en una tarea no ayudó, ya que no resolvía las variables.
Mi tarea era 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 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
Lo anterior resultó en un error similar al siguiente para cada elemento (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/main.yml de un rol común 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 de ansible repitió los valores correctos. Esto no requería with_items: lazo.
"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",
Ten en cuenta compartir este ensayo si lograste el éxito.