Я автоматизирую развертывание стека с помощью 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 строк кода для каждого модуля «оболочки». Это делает мою книгу игр очень большой.