Я пишу собственный плагин действий для Ansible, который я использую в своей книге воспроизведения, и я пытаюсь установить переменную, которая будет использоваться в следующей задаче в книге воспроизведения (настраиваемым) модулем.
По сути, плейбук, эквивалентный тому, что я пытаюсь имитировать, представляет собой задачу set_fact, например:
- name: set_fact task
set_fact:
ansible_python_interpreter: /path/to/python
В моем пользовательском плагине действий я использовал self._execute_module
раньше для выполнения других модулей (например, slurp) в коде плагина. Однако модуль set_fact
, похоже, не обновляет переменную ansible_python_interpreter
, как ожидалось.
Я пробовал следующее:
self._execute_module(module_name='ansible.builtin.set_fact',
module_args=dict(ansible_python_interpreter=/path/to/python),
task_vars=task_vars)
И я также пробовал разные варианты module_args
:
module_args=dict(key_value = {ansible_python_interpreter=/path/to/python})
module_args=dict(key_value='ansible_python_interpreter:/path/to/python')
Однако мой ansible_python_interpreter
, похоже, не меняется.
Любая помощь, пожалуйста?
@ β.εηοιτ.βε да, это хорошее предостережение, которое я изначально не учел. Я отправил ответ сейчас.
Самое близкое, что я могу получить, — это вернуть dict
, содержащий факты Ansible, которые я хочу установить для playbook, просто следуя руководству разработчика для подключаемых модулей действий в документах Ansible .
Итак, поскольку я также возвращаю вызов _execute_model()
в своем плагине, моя функция run()
в моем плагине будет выглядеть примерно так:
def run(self, tmp=None, task_vars=None):
# Plugin code here
facts = dict()
facts['ansible_python_interpreter'] = '/path/to/python'
return dict(self._execute_module(module_name='my_custom_module',
module_args=module_args,
task_vars=task_vars),
ansible_facts=dict(facts))
Однако, к сожалению, это выдает еще одно предупреждение/ошибку:
[WARNING]: Removed restricted key from module data: ansible_python_interpreter
И это, похоже, связано с механизмом безопасности для переопределения деталей подключения, поэтому я пошел другим путем для своего плагина.
В другом случае использования возврат dict(ansible_facts=dict(facts))
(как в документах) сработал бы, если бы это не была переменная соединения, которую я пытался переопределить, я полагаю.
set_fact
на самом деле является плагином действия, возможно, поэтому он не работает так, как вы ожидаете. Это подтверждается: 1/ модуль представляет собой пустой файл Python, за исключением его документации и примеров: github.com/ansible/ansible/blob/devel/lib/ansible/modules/… ; 1/ файл действия плагина: github.com/ansible/ansible/blob/devel/lib/ansible/plugins/…