Comment faire un script shell multiligne dans Ansible
En ce moment, j'utilise un script shell dans ansible qui serait beaucoup plus lisible s'il était sur plusieurs lignes
- name: iterate user groups
shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do
with_items: "{{ users }}"
Je ne sais pas comment autoriser le script multiligne dans le module Shell Ansible
2 réponses
Ansible utilise la syntaxe YAML dans ses playbooks. YAML a un certain nombre d'opérateurs de blocs:
-
Le
>
est un opérateur de bloc pliant. C'est-à-dire qu'il joint plusieurs lignes par des espaces. La syntaxe suivante:key: > This text has multiple lines
Pourrait attribuer la valeur
This text has multiple lines\n
àkey
. -
Le caractère
|
est un opérateur de bloc littéral. C'est probablement ce que vous voulez pour les scripts shell multi-lignes. La syntaxe suivante:key: | This text has multiple lines
Affecterait la valeur
This text\nhas multiple\nlines\n
àkey
.
Vous pouvez l'utiliser pour les scripts shell multilignes comme ceci:
- name: iterate user groups
shell: |
groupmod -o -g {{ item['guid'] }} {{ item['username'] }}
do_some_stuff_here
and_some_other_stuff
with_items: "{{ users }}"
Il y a une mise en garde: Ansible fait une manipulation janky des arguments de la commande shell
, donc alors que ce qui précède fonctionnera généralement comme prévu, ce qui suit ne le fera pas:
- shell: |
cat <<EOF
This is a test.
EOF
Ansible rendra réellement ce texte avec des espaces de début, ce qui signifie que le shell ne trouvera jamais la chaîne EOF
Au début d'une ligne. Vous pouvez éviter les heuristiques inutiles D'Ansible en en utilisant le paramètre cmd
comme ceci:
- shell:
cmd: |
cat <<EOF
This is a test.
EOF
Mentionne les continuations de ligne YAML.
À titre d'exemple (essayé avec ansible 2.0.0.2):
---
- hosts: all
tasks:
- name: multiline shell command
shell: >
ls --color
/home
register: stdout
- name: debug output
debug: msg={{ stdout }}
La commande shell est effondré en une seule ligne, comme dans ls --color /home