Как получить текущее имя хоста из модуля Ansible? - PullRequest
0 голосов
/ 22 января 2020

Я разрабатываю пользовательский модуль Ansible для управления несколькими виртуальными узлами под управлением Vagrant на нескольких серверах виртуальных машин, следуя инструкциям https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html. Насколько я понимаю, Ansible перебирает все указанные целевые хосты и выполняет run_module на них, позволяя module.run_command на каждом хосте.

Но мне нужно знать, на каком хосте я выполняю текущий команда. Я могу добавить remote_host={{ inventory_hostname }} к MODULE_ARGS (-a опция ansible), а затем получить к нему доступ как module.params['remote_host'], но это не очень удобно. Есть ли другой способ получить имя хоста напрямую из Ansible модуля Python кода?

1 Ответ

0 голосов
/ 23 января 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...