shell - with_items - call script ansible




Como fazer o script de shell de múltiplas linhas no Ansible (2)

Adicionando um espaço antes do delimitador EOF permite evitar o cmd:

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

agora estou usando um script de shell em ansible que seria muito mais legível se estivesse em várias linhas

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

Apenas não sei como permitir o script de múltiplas linhas no módulo de shell Ansible


Ansible usa a sintaxe YAML em seus playbooks. O YAML possui vários operadores de bloqueio:

  • O > é um operador de bloco dobrável. Ou seja, ele une várias linhas por espaços. A seguinte sintaxe:

    key: >
      This text
      has multiple
      lines

    Atribuiria o valor This text has multiple lines\n para a key .

  • O | caractere é um operador de bloco literal. Isso é provavelmente o que você deseja para scripts de shell de várias linhas. A seguinte sintaxe:

    key: |
      This text
      has multiple
      lines

    Atribuiria o valor This text\nhas multiple\nlines\n para a key .

Você pode usar isso para scripts de shell multilinha como este:

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

Há uma ressalva: o Ansible faz alguma manipulação janky de argumentos para o comando shell , portanto, enquanto o acima geralmente funcionará como esperado, o seguinte não irá:

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

Ansible irá realmente renderizar esse texto com espaços iniciais, o que significa que o shell nunca encontrará a string EOF no início de uma linha. Você pode evitar a heurística inútil do Ansible usando o parâmetro cmd seguinte forma:

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




ansible