Ansible API сохранить обратный вызов playbook в файл журнала - PullRequest
0 голосов
/ 16 октября 2019

Я создал сценарий для запуска файла Plays Ansible:

from StringIO import StringIO
from ansible import context
from ansible.cli import CLI
from ansible.module_utils.common.collections import ImmutableDict
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
from ansible.vars.manager import VariableManager
from ansible.module_utils.basic import AnsibleModule


def ansible_executor(playbook_path, user_extra_vars=()):

    loader = DataLoader()


    context.CLIARGS = ImmutableDict(tags={}, listtags=False, listtasks=False, listhosts=False, syntax=False,
                                    connection='ssh',
                                    module_path=None, forks=100, remote_user='root', private_key_file=None,
                                    ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None,
                                    scp_extra_args=None,
                                    become=True,
                                    become_method='sudo', become_user='root', verbosity=True, check=False,
                                    start_at_task=None,
                                    extra_vars=user_extra_vars)

    inventory = InventoryManager(loader=loader, sources=('/etc/ansible/hosts',))

    variable_manager = VariableManager(loader=loader, inventory=inventory, version_info=CLI.version_info(gitinfo=False))

    pbex = PlaybookExecutor(playbooks=[playbook_path], inventory=inventory, variable_manager=variable_manager,
                            loader=loader, passwords={})


    return pbex.run() == 0

Я пытаюсь записать обратный вызов playbook в мой файл журнала.

Я видел несколько потоков, говорящих об использовании API CallbackModule, но мне не удалось успешно реализовать это. Документация Ansible отсутствует.

Я нашел обходной путь, чтобы сохранить выходные данные в истинном и отправить его в мой журнал:

    old_stdout = sys.stdout
    result = StringIO()
    sys.stdout = result
    exit_code = pbex.run()
    sys.stdout = old_stdout
    log.info(result.getvalue())

, но я знаю, что это не правильный путь.

что мне не хватает в модуле обратного вызова?

Я знаю, что этот API не соболин и все быстро меняется, это другое решение?

1 Ответ

1 голос
/ 16 октября 2019

Я не знаю, является ли мой путь правильным, но в любом случае я поделюсь:

Я просто наследую от ansible.plugins.callback.CallbackBase и реализую агрегатор журналов:

class ResultCallback(CallbackBase):
    def v2_runner_on_ok(self, result, **kwargs):
        host = result._host
        logger.info(json.dumps({host.name: result._result}, indent=4))

    def v2_runner_item_on_failed(self, result):
        host = result._host
        logger.error(json.dumps({host.name: result._result}, indent=4))

    def v2_runner_on_unreachable(self, result):
        host = result._host
        logger.error(json.dumps({host.name: result._result}, indent=4))   

Это простые результаты печати в стандартный Python Logger, и это пример. Функция обратного вызова имеет функции автоматического отображения и дампа, и вы можете отформатировать вывод отдельно для экрана и для журнала. Вы также можете отформатировать вывод с помощью:

class ResultCallback(CallbackBase):
    def v2_runner_on_ok(self, result, **kwargs):
      text = "{0} success on host {1}".format(result._task.name, result._host)
      self._display.display(text, color=color, screen_only=True)
      self._display.display(self._dump_results(result._result), log_only=True)

Я пишу это в Python 3.6 и ansible 2.7 Это программное обеспечение было запущено в Docker-контейнере.

Я надеюсь, что эти примеры имеют смысл.

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