• raw — посылает низкоуровневную команду напрямую через ssh
  • command — посылает команду в операционную систему
  • 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