Назад | Перейти на главную страницу

Выполнение команд на хосте Ansible из обработчика

Я пытаюсь реализовать в Ansible (v1.9.1) следующий сценарий:

  1. Ansible подключается к удаленному хосту и использует su стать root.
  2. Ansible host получает удаленный файл конфигурации, который он собирается заткнуть.
  3. Хост-магазины Ansible добавляет только что загруженный файл в репозиторий Git, содержащий каталог назначения, используя git add ....
  4. Ansible host совершает только что полученный файл с использованием git commit ... и соответствующее сообщение фиксации.

Теперь (1) полностью поддерживается, так как v1.9.0.1 и (2) очень легко сделать с помощью модуль выборки - по умолчанию он даже хранит файлы в подкаталоге, зависящем от хоста.

Однако мне не удалось выяснить (3) и (4). В идеале я бы хотел, чтобы Ansible просто выполнял локальную команду от имени пользователя, который ее запустил. я мог создайте сценарий оболочки оболочки для этого, но это кажется совершенно противоположным способу работы Ansible.

В большинстве сообщений в Интернете предлагается использовать local_action модуль. local_actionОднако, похоже, для моей цели это совершенно излишне - он пытается получить доступ к хосту с надлежащим повышением привилегий. В результате не получается:

фатальный: [host00 -> 127.0.0.1] => Внутренняя ошибка: этот модуль не поддерживает выполнение команд через su

Вот как сейчас выглядит мой обработчик:

- name: stage-archive-file
  become: false
  su: false
  local_action: command git -C {{ playbook_dir }} add storage/archive
  notify: commit-archive-file

local_action похоже, полностью игнорирует мои попытки сделать это не использовать su, хотя я не уверен, связано ли это с этим конкретным модулем или с su метод в целом.

Есть ли более простой способ просто выполнить команду из доступного процесса? Как вариант можно как-то получить local_action работать?


Кажется, есть связанная проблема с Ansible это может мешать local_action от правильной работы в этом случае. По-видимому local_action и delegate_to сохранить некоторые настройки подключения из «родительской» задачи, даже если они полностью недопустимы для делегированного хоста.

Хотя я ожидаю, что основная причина Эта проблема будет исправлена ​​в будущей версии Ansible, я выкатил собственное решение. По сути, я модифицировал / взломал урезанный плагин подключения для Ansible, который просто выполняет команду на хосте. Процесс был следующим:

  • В каталоге playbook создайте подкаталог с именем connection_plugins.

  • Скопируйте local.py подключаемый модуль из установки Ansible (например, /usr/lib/python2.7/site-packages/ansible/runner/connection_plugins/local.py) во вновь созданный подкаталог с другим именем, например execute.py.

  • редактировать connection_plugins/execute.py и удалите разделы кода, относящиеся к методам повышения привилегий.

  • Добавить запись для localhost в файле инвентаря с параметром ansible_connection=execute.

Последний шаг нужно будет изменить, если local_action действительно, следует использовать метод повышения привилегий для некоторых задач. В этом случае можно оставить запись на localhost (если есть) без изменений, определите другой псевдоним с execute тип подключения, а затем используйте delegate_to: вместо того local_action: в определениях задач.