web-dev-qa-db-fra.com

ansible: comment passer plusieurs commandes

J'ai essayé ceci:

- command: ./configure chdir=/src/package/
- command: /usr/bin/make chdir=/src/package/
- command: /usr/bin/make install chdir=/src/package/

ce qui fonctionne mais je suppose qu'il y a quelque chose de plus .. soigné.

Alors j'ai essayé ceci:

à partir de: https://stackoverflow.com/questions/24043561/multiple-commands-in-the-same-line-for-bruker-topspin qui me rend "aucun fichier ni répertoire de ce type"

- command: ./configure;/usr/bin/make;/usr/bin/make install chdir=/src/package/

J'ai aussi essayé ceci: https://u.osu.edu/hasnan.1/2013/12/16/ansible-run-multiple-commands-using-command-module-and-with-items/

mais je n'ai pas pu trouver la bonne syntaxe à mettre:

- command: "{{ item }}" chdir=/src/package/
  with_items:
      ./configure
      /usr/bin/make
      /usr/bin/make install

Cela ne fonctionne pas, en disant qu'il y a un problème de devis.

N'importe qui?

59
John Doe

Si une valeur en YAML commence par une accolade ({), l’analyseur YAML suppose qu’il s’agit de n dictionnaire . Ainsi, dans les cas où il existe une variable (Jinja2) dans la valeur, l'une des deux stratégies suivantes doit être adoptée pour éviter toute confusion avec l'analyseur YAML:

Citez toute la commande:

- command: "{{ item }} chdir=/src/package/"
  with_items:
  - ./configure
  - /usr/bin/make
  - /usr/bin/make install    

ou changez l'ordre des arguments:

- command: chdir=/src/package/ {{ item }}
  with_items:
  - ./configure
  - /usr/bin/make
  - /usr/bin/make install

Merci pour la suggestion alternative de @RamondelaFuente.

79
Pedro Romano

Pour exécuter plusieurs commandes Shell avec ansible, vous pouvez utiliser le module Shell avec une chaîne multiligne (notez le barre oblique verticale après Shell :), comme indiqué dans cet exemple:

  - name: Build nginx 
    Shell: |
      cd nginx-1.11.13
      Sudo ./configure
      Sudo make
      Sudo make install
48
Arvik

J'ai fait face au même problème. Dans mon cas, une partie de mes variables se trouvait dans un dictionnaire, c'est-à-dire une variable with_dict (en boucle) et je devais exécuter 3 commandes sur chaque item.key. Cette solution est plus pertinente lorsque vous devez utiliser le dictionnaire with_dict avec l'exécution de plusieurs commandes (sans avoir besoin de with_items)

Utiliser with_dict et with_items dans une tâche n'a pas aidé car cela ne résolvait pas les variables.

Ma tâche était comme:

- 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 était:

---
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

Ce qui précède a entraîné une erreur similaire à la suivante pour chaque {{item}} (pour 3 commandes mentionnées ci-dessus). Comme vous le voyez, les valeurs de tools_dir ne sont pas renseignées (tools_dir est une variable définie dans les valeurs par défaut de default/main.yml d'un rôle commun, ainsi que item.value.git_tar_dir n'a pas été renseignée ni résolue).

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 solution était facile. Au lieu d'utiliser le module "COMMAND" dans Ansible, j'ai utilisé le module "Shell" et créé une variable dans roles/git/defaults/main.yml

Donc, maintenant roles/git/defaults/main.yml ressemble à ceci:

---
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"

et la tâche rôles/git/tasks/main.yml se présente comme suit:

- name: Make install from git source
  Shell: "{{ git_pre_requisites_install_cmds }}"
  become_user: "{{ build_user }}"
  with_dict: "{{ git_versions }}"
  tags:
    - koba

Cette fois, les valeurs ont été substituées avec succès car le module était "Shell" et la sortie ansible faisait écho aux valeurs correctes. Cela ne nécessitait pas with_items: boucle.

"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",
5
Arun Sangal

Vous pouvez aussi faire comme ça:

- command: "{{ item }}"
  args:
    chdir: "/src/package/"
  with_items:
    - "./configure"
    - "/usr/bin/make"
    - "/usr/bin/make install"

J'espère que cela pourrait aider d'autres

4
Arbab Nazar