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