Saltar al contenido

ansible: cómo pasar múltiples comandos

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *