Saltar al contenido

ansible: cómo pasar varios comandos

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",
¡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 *