modules - ansible: cómo pasar varios comandos
ansible roles (4)
Me enfrenté al mismo problema. En mi caso, parte de mis variables estaban en un diccionario, es decir, with_dict variable (looping) 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 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 {{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 una función 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 "COMANDO" 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 los roles de tareas / git / tasks / main.yml se parecen a:
- 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 requería with_items: loop.
"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",
Intenté esto:
- command: ./configure chdir=/src/package/
- command: /usr/bin/make chdir=/src/package/
- command: /usr/bin/make install chdir=/src/package/
Lo cual funciona pero supongo que hay algo más .. limpio.
Así que intenté esto:
de: https://stackoverflow.com/questions/24043561/multiple-commands-in-the-same-line-for-bruker-topspin que me devuelve "no existe tal archivo o directorio"
- command: ./configure;/usr/bin/make;/usr/bin/make install chdir=/src/package/
Intenté esto también: https://u.osu.edu/hasnan.1/2013/12/16/ansible-run-multiple-commands-using-command-module-and-with-items/
pero no pude encontrar la sintaxis correcta para poner:
- command: "{{ item }}" chdir=/src/package/
with_items:
./configure
/usr/bin/make
/usr/bin/make install
Eso no funciona, diciendo que hay un problema de cotización.
¿Nadie?
Para ejecutar varios comandos de shell con ansible, puede usar el módulo de shell con una cadena multilínea (observe la barra vertical después de shell :), como se muestra en este ejemplo:
- name: Build nginx
shell: |
cd nginx-1.11.13
sudo ./configure
sudo make
sudo make install
Si un valor en YAML comienza con una llave ( {
), el analizador YAML asume que es un diccionario . Por lo tanto, 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 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.
También puedes hacer esto:
- command: "{{ item }}"
args:
chdir: "/src/package/"
with_items:
- "./configure"
- "/usr/bin/make"
- "/usr/bin/make install"
Espero que pueda ayudar a otros.