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

56
demandé sur Edgar Martinez 2016-10-25 04:55:40

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
117
répondu larsks 2017-11-01 18:18:06

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

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

10
répondu Marcello Romani 2016-10-25 02:21:58