Ansible API 将剧本回调保存到日志文件
Ansible API save playbook callback to log file
我创建了一个脚本来执行 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
我正在尝试将剧本回调记录到我的日志文件中。
我看到一些线程在谈论使用 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 不是 sable 并且事情正在迅速变化,是否有不同的解决方案?
不知道我的方法对不对,不过还是要分享一下:
我只是继承自 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 记录器的简单打印结果,这是一个示例。
回调具有自我显示和转储功能,您可以为屏幕和日志分别格式化输出。
您还可以使用以下格式设置输出格式:
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 容器中。
我希望这些例子有意义。
我创建了一个脚本来执行 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
我正在尝试将剧本回调记录到我的日志文件中。
我看到一些线程在谈论使用 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 不是 sable 并且事情正在迅速变化,是否有不同的解决方案?
不知道我的方法对不对,不过还是要分享一下:
我只是继承自 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 记录器的简单打印结果,这是一个示例。 回调具有自我显示和转储功能,您可以为屏幕和日志分别格式化输出。 您还可以使用以下格式设置输出格式:
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 容器中。
我希望这些例子有意义。