it-swarm.com.de

So erstellen Sie ein mehrzeiliges Shell-Skript in Ansible

im Moment verwende ich ein Shell-Skript in Ansible, das viel besser lesbar wäre, wenn es sich in mehreren Zeilen befinden würde

- name: iterate user groups
  Shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do
  with_items: "{{ users }}"

Nur nicht sicher, wie man mehrzeilige Skripte im Ansible Shell-Modul zulässt

94
Edgar Martinez

Ansible verwendet in seinen Playbooks die YAML-Syntax. YAML hat eine Reihe von Blockoperatoren:

  • Der > Ist ein Faltblockoperator. Das heißt, es werden mehrere Zeilen durch Leerzeichen miteinander verbunden. Die folgende Syntax:

    key: >
      This text
      has multiple
      lines
    

    Würde key den Wert This text has multiple lines\n Zuweisen.

  • Das Zeichen | Ist ein Literalblockoperator. Dies ist wahrscheinlich das, was Sie für mehrzeilige Shell-Skripte wollen. Die folgende Syntax:

    key: |
      This text
      has multiple
      lines
    

    Würde key den Wert This text\nhas multiple\nlines\n Zuweisen.

Sie können dies für mehrzeilige Shell-Skripte wie folgt verwenden:

- name: iterate user groups
  Shell: |
    groupmod -o -g {{ item['guid'] }} {{ item['username'] }} 
    do_some_stuff_here
    and_some_other_stuff
  with_items: "{{ users }}"

Es gibt eine Einschränkung: Ansible manipuliert einige Argumente mit dem Befehl Shell, sodass die oben genannten Funktionen zwar im Allgemeinen wie erwartet funktionieren, die folgenden jedoch nicht:

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

Ansible rendert den Text tatsächlich mit führenden Leerzeichen, was bedeutet, dass die Shell die Zeichenfolge EOF nie am Anfang einer Zeile findet. Sie können die nicht hilfreichen Heuristiken von Ansible vermeiden, indem Sie den Parameter cmd wie folgt verwenden:

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

erwähnt die Fortsetzung der YAML-Linie.

Als Beispiel (mit Ansible 2.0.0.2 ausprobiert):

---
- hosts: all
  tasks:
    - name: multiline Shell command
      Shell: >
        ls --color
        /home
      register: stdout

    - name: debug output
      debug: msg={{ stdout }}

Der Shell-Befehl wird wie in ls --color /home In einer einzigen Zeile zusammengefasst.

14
Marcello Romani

Durch das Hinzufügen eines Leerzeichens vor dem Trennzeichen EOF= kann cmd vermieden werden:

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