Ответ 1
Ansible использует синтаксис YAML в своих playbooks. YAML имеет несколько блоков операторов:
-
>
- оператор блокировки. То есть, он объединяет несколько строк вместе пробелами. Следующий синтаксис:key: > This text has multiple lines
Назначит значение
This text has multiple lines\n
key
. -
Символ
|
- это оператор буквального блока. Это, вероятно, то, что вы хотите для многострочных сценариев оболочки. Следующий синтаксис:key: | This text has multiple lines
Назначит значение
This text\nhas multiple\nlines\n
key
.
Вы можете использовать это для многострочных сценариев оболочки следующим образом:
- name: iterate user groups
shell: |
groupmod -o -g {{ item['guid'] }} {{ item['username'] }}
do_some_stuff_here
and_some_other_stuff
with_items: "{{ users }}"
Существует одна оговорка: Ansible выполняет некоторые манипуляции с аргументами с помощью команды shell
, поэтому, хотя выше, как правило, работает как ожидалось, следующее не будет:
- shell: |
cat <<EOF
This is a test.
EOF
Ansible фактически отобразит этот текст с ведущими пробелами, что означает, что оболочка никогда не найдет строку EOF
в начале строки. Вы можете избежать Ansible unhelpful heuristics, используя параметр cmd
следующим образом:
- shell:
cmd: |
cat <<EOF
This is a test.
EOF