Оптимизируйте playbook, чтобы сделать его идемпотентным с модулем оболочки

Я автоматизирую развертывание стека с помощью ansible. Я использую «оболочку» или «командный» модуль для выполнения большей части задачи. Итак, чтобы сделать playbook идемпотентным с оболочкой и модулем, я модифицирую playbook следующим образом.

- name: Task1
  shell: 'source /etc/nova/openrc && heat stack-show myne01 | tee stack_show.log'
  args:
    creates: stack_show.log
  register: list
- debug: var=list.stdout_lines
  ignore_errors: yes

- name: Delete stack-show.log
  file: path=/home/wrsroot/stack_show.log state=absent
  when: "list.rc != 0"

- name: Failed the stack
  shell: "echo 'stack is failed'"
  when: "list.rc != 0"
  failed_when: "list.rc != 0"

Здесь поток:

1) Показать состояние стека
2) Если выполнение стека не удалось, игнорировать ошибки и удалить файл "stack_show.log", чтобы при повторном запуске anisble не пропустил эту задачу.
3) Если выполнение стека не удалось , Не удалось выполнить задание.

Пожалуйста, предложите, если есть лучший способ сделать это.

Чтобы добавить идемпотентность в playbook, я добавляю 9 строк кода для каждого модуля «оболочки». Это делает мою книгу игр очень большой.


person tgcloud    schedule 22.05.2016    source источник


Ответы (1)


Вам просто нужно, чтобы changed_when: false был идемпотентом. Также я думаю, что вы можете сделать это проще:

- name: Task1
  shell: bash -c 'set -o pipefail;source /etc/nova/openrc && heat stack-show myne01 | tee stack_show.log'
  changed_when: false
  args:
    creates: stack_show.log
  register: list

- name: Delete stack-show.log
  file: path=/home/wrsroot/stack_show.log state=absent
  changed_when: false
  # You don't need this because file will deleted if exists
  #  when: "list.rc != 0"

# You don't need it because command will failed 
# set -o pipefail
#- name: Failed the stack
#  shell: "echo 'stack is failed'"
#  when: "list.rc != 0"
#  failed_when: "list.rc != 0"

Попробуйте блоки Ansible 2.x

tasks:
     - block:
         - shell: bash -c 'set -o pipefail;source /etc/nova/openrc && heat stack-show myne01 | tee stack_show.log'
           changed_when: false
           args:
              creates: stack_show.log
            register: list

       always:
         - debug: msg="this always executes"    
         - name: Delete stack-show.log
              file: path=/home/wrsroot/stack_show.log state=absent
              changed_when: false
person Valeriy Solovyov    schedule 22.05.2016