Ansible: как выполнить модуль set_fact из кода Python плагина ansible action

Я пишу собственный плагин действий для 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, похоже, не меняется.

Любая помощь, пожалуйста?

set_fact на самом деле является плагином действия, возможно, поэтому он не работает так, как вы ожидаете. Это подтверждается: 1/ модуль представляет собой пустой файл Python, за исключением его документации и примеров: github.com/ansible/ansible/blob/devel/lib/ansible/modules/… ; 1/ файл действия плагина: github.com/ansible/ansible/blob/devel/lib/ansible/plugins/…
β.εηοιτ.βε 13.04.2023 01:02

@ β.εηοιτ.βε да, это хорошее предостережение, которое я изначально не учел. Я отправил ответ сейчас.

hs14428 13.04.2023 17:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самое близкое, что я могу получить, — это вернуть 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)) (как в документах) сработал бы, если бы это не была переменная соединения, которую я пытался переопределить, я полагаю.

Другие вопросы по теме