Як зробити багаторядковий скрипт оболонки в Ansible


125

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

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

Просто не впевнений, як дозволити багаторядковий скрипт у модулі оболонки Ansible


1
Також розгляньте можливість використання команди "скрипт", що відповідає ", і скористайтеся зовнішнім файлом
Jason

Відповіді:


273

Ansible використовує синтаксис YAML у своїх програмах. 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, використовуючи такий cmdпараметр:

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

27
Фантастична відповідь
полювання на Брайана

18

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

згадує продовження лінії YAML.

Як приклад (спробували з ansible 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
Так, але в оболонці >є дуже специфічне значення. Я спробував це, і не вийшло, як очікувалося.
Едгар Мартінес

6
Ось чому це просто в першому рядку, а не в наступних. Як я писав, він добре працював з ansible 2.0, хоча він не роздруковував повний висновок ls з ansible 1.9.4. Яку версію Ansible ви використовували?
Марчелло Романі

Посилання мертва.
kenorb

Це з 2016 року, такі речі трапляються.
Marcello Romani

3

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

- shell: |
    cat <<' EOF'
    This is a test.
    EOF
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.