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/

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

alors j'ai essayé ceci:

de: https://stackoverflow.com/questions/24043561/multiple-commands-in-the-same-line-for-bruker-topspin qui me donne dos "no such file or directory"

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

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

mais je n'ai pas trouvé la bonne syntaxe pour mettre:

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

cela ne fonctionne pas, disant qu'il y a un problème de citation.

Quelqu'un?

41
demandé sur slm 2014-07-20 18:42:43

4 réponses

si une valeur dans YAML commence avec une accolade bouclée ( { ), le YAML parser suppose qu'il est un dictionnaire . Ainsi, pour les cas comme celui-ci où il y a une variable (Jinja2) dans la valeur, l'une des deux stratégies suivantes doit être adoptée pour éviter de confondre L'analyseur YAML:

cite toute la commande:

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

ou modifier 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.

66
répondu Pedro Romano 2014-07-27 18:45:37

pour exécuter plusieurs commandes shell avec ansible, vous pouvez utiliser le module shell avec chaîne de caractères multilignes (notez le barre verticale après shell:), comme le montre cet exemple:

  - name: Build nginx 
    shell: |
      cd nginx-1.11.13
      sudo ./configure
      sudo make
      sudo make install
26
répondu Arvik 2017-04-21 13:02:16

j'ai fait face à la même question. Dans mon cas, une partie de mes variables étaient dans un dictionnaire i.e. with_dict variable (looping) et j'ai dû exécuter 3 commandes sur chaque élément.clé. Cette solution est plus pertinente lorsque vous devez utiliser le dictionnaire with_dict avec l'exécution de commandes multiples ( sans avoir besoin de with_items )

en utilisant with_dict et with_items dans une tâche n'a pas aidé car il 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 }}"

rôles/git/defaults/main.yml:

---
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 donné lieu à une erreur semblable à celle qui suit pour chaque {{ item }} (pour les 3 commandes mentionnées ci-dessus). Comme vous le voyez, les valeurs de tools_dir ne sont pas peuplées (tools_dir est une variable qui est définie dans le fichier defaults/main d'un rôle commun.yml et aussi le point.valeur.git_tar_dir valeur n'a pas été renseigné/résolu).

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 "commande" dans Ansible, j'ai utilisé le module "Shell" et j'ai créé une variable dans roles/git/defaults/main.yml

Alors, maintenant, rôles/git/defaults/main.yml ressemble à:

---
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 le groupe rôles/git/tâches/main.yml ressemble à:

- 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 fait écho aux valeurs correctes. Cela ne nécessitait pas la boucle with_items: .

"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
répondu Arun Sangal 2015-11-25 17:56:36

, Vous pouvez aussi faire comme ceci:

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

espoir qui pourrait aider les autres

2
répondu Arbab Nazar 2016-07-10 07:05:38