Подтвердить что ты не робот

Как сделать многострочную оболочку script в Ansible

прямо сейчас я использую оболочку script в недоступном, что было бы гораздо более читаемым, если бы оно было на нескольких строках

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

Просто не уверен, как разрешить многострочный script в Ansible shell module

4b9b3361

Ответ 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

Ответ 2

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

упоминает продолжение строки YAML.

В качестве примера (пробовал с помощью файла 2.0.0.2):

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

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

Команда оболочки сворачивается в одну строку, как в ls --color /home

Ответ 3

Добавление пробела перед разделителем EOF позволяет избежать cmd:

- shell: |
    cat <<' EOF'
    This is a test.
    EOF