Я создал сценарий для запуска файла 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 не соболин и все быстро меняется, это другое решение?