User Tools

Site Tools


docs:tips_n_tricks:ansible:shell.html

Ansible - shell scripts

Task template capable of check mode and reporting changed state

This template assumes, that “CHANGED” and “FAILED” are on a line by itself, which isn't true if some other part of the script had some output not delimited by a newline
roles/templates/tasks/shell1.yml
- name: Shell scriptlet
  shell: |
    if echo "Fake check for need of change - always true"
    then
      echo 'CHANGED'
    fi
    if [ "False" == "{{ ansible_check_mode}}" ]
    then
      echo "Do the real thing here" || echo "FAILED" >&2
    fi
  check_mode: False
  register: my_result
  changed_when: "'CHANGED' in my_result.stdout_lines"
  failed_when: "'FAILED' in my_result.stderr_lines"

Task template executing always - even in check mode - and failing on any output to stderr

This might be useful when using a script to gather information about the target host

roles/templates/tasks/shell2.yml
- name: Collect information
  shell: |
    echo '{"name": "Test", "msg": "Do the real thing here"}' ||  echo "FAILED" >&2
  check_mode: False
  register: last_result
  changed_when: False
  failed_when: "last_result.stderr_lines | length > 0"

- name: Add to list if name does not exist
  set_fact:
    list_of_information: "{{ list_of_information + [ item ] }}"
  loop: "{{ last_result.stdout_lines | from_json }}"
  when: "item.name not in list_of_information | map(attribute='name')"

Ansible Shell

docs/tips_n_tricks/ansible/shell.html.txt · Last modified: 25.11.2023 15:45 CET by peter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki