raw— посылает низкоуровневную команду напрямую через sshcommand— посылает команду в операционную системуshell— посылает команду в оболочку операционной системы
raw следует использовать на удаленном хосте для того, чтобы установить python, либо для управления активным сетевым оборудованием без возможности установки python
shell следует использовать если нужны возможности оболочки (переменные окружения, неименованные каналы/pipe, перенаправление стандартных потоков и др.)
command же следует использовать во всех остальных случаях, поскольку использование shell медленнее command, а raw не имеет смысла при уже установленном python
Каждый из этих модулей не является идемпотентным и их использование допустимо лишь в том случае, если нет альтернативы в виде другого модуля
Но если все же вы решили использовать эти модули, то стоит следовать best-practice:
- Для модулей
shellиcommandобязательно определятьchanged_when: <условие>, которое будет определять когда модуль изменил состояние инфраструктуры (CHANGED), а когда изменение уже было произведено (OK) - Для модуля
shellпри использовании неименованных каналов (pipe,|) предварительно использоватьset -o pipefailдля правильной обработки ошибок
Пример:
- name: Get Kerberos ticket
ansible.builtin.shell:
cmd: |
set -o pipefail
echo {{ password }} | kinit admin
changed_when: false