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 }}"
Juste pas sûr de savoir comment autoriser le script multiligne dans le module Ansible Shell
Ansible utilise la syntaxe YAML dans ses playbooks. YAML a un certain nombre d'opérateurs de bloc:
Le >
est un opérateur de bloc de pliage. C'est-à-dire qu'il joint plusieurs lignes ensemble par des espaces. La syntaxe suivante:
key: >
This text
has multiple
lines
Attribuerait 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
Attribuerait la valeur This text\nhas multiple\nlines\n
à key
.
Vous pouvez utiliser ceci pour des 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 effectue quelques manipulations janky des arguments de la commande Shell
. Ainsi, bien que l'opération ci-dessus fonctionne généralement comme prévu, les opérations suivantes ne fonctionneront pas:
- Shell: |
cat <<EOF
This is a test.
EOF
En fait, Ansible rendra ce texte avec des espaces, 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 de Ansible en utilisant le paramètre cmd
comme ceci:
- Shell:
cmd: |
cat <<EOF
This is a test.
EOF
mentionne les continuations de la ligne YAML.
A 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 réduite en une seule ligne, comme dans ls --color /home
Ajouter un espace avant le délimiteur EOF permet d’éviter cmd:
- Shell: |
cat <<' EOF'
This is a test.
EOF