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?
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.
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
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",
, 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