Исследовал проблему, искал в Inte rnet, документах (это действительно не очень хорошо, если вы расширяете Ansible, а не просто используете) и Ansible исходный код и нашел ответ самостоятельно.
Точно из модуля - невозможно. Модули выполняются на удаленных хостах и не имеют доступа к такой информации. Но для выполнения этих плагинов можно было бы использовать плагин действий, если быть точным. Базовая c информация о них доступна по адресу https://docs.ansible.com/ansible/latest/dev_guide/developing_plugins.html.
Плагины действий похожи на оболочки для выполнения модулей и, в отличие от них, выполняются на управляющем хосте, а не на удаленных.
Например, такой демонстрационный плагин добавит некоторую информацию о среде выполнения в мой пользовательский вывод vagrant
модуля (но в этом примере модуль не имеет значения, он может быть любым, мы обсуждаем только информацию о среде выполнения):
#!/usr/bin/python3
from ansible.plugins.action import ActionBase
class ActionModule(ActionBase):
def run(self, tmp=None, task_vars=None):
super(ActionModule, self).run(tmp, task_vars)
module_args = self._task.args.copy()
module_return = self._execute_module(module_name='vagrant',
module_args=module_args,
task_vars=task_vars,
tmp=tmp)
module_return['ansible_facts']['inventory_file'] = str(task_vars['inventory_file'])
module_return['ansible_facts']['inventory_hostname'] = str(task_vars['inventory_hostname'])
module_return['ansible_facts']['groups'] = str(task_vars['groups'])
return module_return
Это демонстрационный код, здесь желаемая информация только что напечатана. Если необходимо использовать его в модуле, module_args
следует обновить до вызова _execute_module
.
Если вы используете команду Ansible ansible 192.168.3.2 -m vagrant -a '...' -u vbox --ask-pass -i hosts
(-a
аргументы указаны c для моего Пользовательский модуль, не имеет значения для вопроса и опущен) вывод будет выглядеть следующим образом:
192.168.3.2 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python",
"groups": "{'all': ['192.168.3.1', '192.168.3.2', '192.168.3.3', '192.168.3.5', '192.168.3.6', '192.168.3.7', '192.168.3.11', '192.168.3.12', '192.168.3.21', '192.168.3.22', '192.168.3.23', '192.168.3.24', '192.168.3.31', '192.168.3.32', '192.168.3.33', '192.168.3.34', '192.168.3.35', '192.168.3.36', '192.168.3.37', '192.168.3.38', '192.168.3.39', '192.168.3.30', '192.168.3.51', '192.168.3.52', '192.168.3.61', '192.168.3.62', '192.168.3.71', '192.168.3.72'], 'ungrouped': [], 'ci_vm_servers': ['192.168.3.1', '192.168.3.2', '192.168.3.3', '192.168.3.5', '192.168.3.6', '192.168.3.7'], 'ci_vm_nodes': ['192.168.3.11', '192.168.3.12', '192.168.3.21', '192.168.3.22', '192.168.3.23', '192.168.3.24', '192.168.3.31', '192.168.3.32', '192.168.3.33', '192.168.3.34', '192.168.3.35', '192.168.3.36', '192.168.3.37', '192.168.3.38', '192.168.3.39', '192.168.3.30', '192.168.3.51', '192.168.3.52', '192.168.3.61', '192.168.3.62', '192.168.3.71', '192.168.3.72']}",
"inventory_file": "/home/dvinokurov/work/Avigdor-ansible/tools/ansible/hosts",
"inventory_hostname": "192.168.3.2"
},
"changed": true,
"command": "up",
"message": "OK",
"node_index": "2",
"original_message": "Execute \"up\"",
"remote_host": "192.168.3.2"
}
Наиболее важными здесь являются inventory_file
, inventory_hostname
(именно для какого вопроса был) и groups
, они это именно та информация среды выполнения, которую мы передали в коде плагина. Например, словарь groups
- это просто разобранная информация файла инвентаризации. У меня там ровно две группы (ci_vm_servers
и ci_vm_nodes
), а две группы создаются Ansible и являются специальными (all
и ungrouped
). ).
Примечание - Ansible должен знать пути как к вашим пользовательским модулям, так и к плагинам. Для этого я использовал переменную окружения ANSIBLE_LIBRARY
для своих модулей и ANSIBLE_ACTION_PLUGINS
для моих плагинов действий.