Comment faire un script shell multiligne dans Ansible

125

en ce moment j'utilise un script shell en 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

Edgar Martinez
la source
1
Pensez également à utiliser la commande ansible 'script' et utilisez un fichier externe
Jason

Réponses:

273

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 pliant. Autrement dit, 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 l'utiliser pour les scripts shell multilignes comme celui-ci:

- 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 saccadée des arguments de la shellcommande, donc si ce qui précède fonctionnera généralement comme prévu, ce qui suit ne le sera pas:

- shell: |
    cat <<EOF
    This is a test.
    EOF

Ansible rendra ce texte avec des espaces EOFau début , ce qui signifie que le shell ne trouvera jamais la chaîne au début d'une ligne. Vous pouvez éviter les heuristiques inutiles d'Ansible en utilisant le cmdparamètre comme celui-ci:

- shell:
    cmd: |
      cat <<EOF
      This is a test.
      EOF
larsks
la source
27
Réponse fantastique
Bryan Hunt
18

https://support.ansible.com/hc/en-us/articles/201957837-How-do-I-split-an-action-into-a-multi-line-format-

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

Marcello Romani
la source
3
Ouais mais dans la coquille >a une signification très spécifique. J'ai essayé cela et cela n'a pas fonctionné comme prévu.
Edgar Martinez
6
C'est pourquoi c'est juste dans la première ligne, pas dans les suivantes. Cela a bien fonctionné pour moi avec ansible 2.0 comme je l'ai écrit, bien qu'il n'ait pas imprimé la sortie complète de ls avec ansible 1.9.4. Quelle version d'Ansible avez-vous utilisée?
Marcello Romani
Le lien est mort.
kenorb
C'est à partir de 2016, ces choses arrivent.
Marcello Romani
3

L'ajout d'un espace avant le délimiteur EOF permet d'éviter cmd:

- shell: |
    cat <<' EOF'
    This is a test.
    EOF
Id2ndR
la source