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
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
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.
Durch das Hinzufügen eines Leerzeichens vor dem Trennzeichen EOF= kann cmd vermieden werden:
- Shell: |
cat <<' EOF'
This is a test.
EOF