web-dev-qa-db-fra.com

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 }}"

Juste pas sûr de savoir comment autoriser le script multiligne dans le module Ansible Shell

94
Edgar Martinez

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
190
larsks

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

14
Marcello Romani

Ajouter un espace avant le délimiteur EOF permet d’éviter cmd:

- Shell: |
    cat <<' EOF'
    This is a test.
    EOF
1
Id2ndR