我想以一种机器友好格式输出的方式运行ansible playbook,这意味着我可以以某种方式解析。
默认情况下,ansible playbook提供如下输出:
ansible-playbook playbooks/test.yml
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [server]
ok: [foo]
并且它甚至不能保证永远保持这种风格。我需要能够解析输出,有没有办法用JSON或XML获取playbook的输出?
答案 0 :(得分:3)
您可以使用python Ansible Callbacks。您只需要定义回调的位置,就可以使用结构化数据进行各种操作。
示例ansible.cfg:
[defaults]
callback_plugins = ~/your/path/to/callbacks
写一个非常简单的回调(log.py
):
class CallbackModule(object):
CALLBACK_VERSION = 2.0
CALLBACK_TYPE = 'notification'
CALLBACK_NAME = 'logs'
CALLBACK_NEEDS_WHITELIST = True
def __getattr__(self, item):
if item.startswith('runner_on_'):
def fn(*args, **kwargs):
self.on_runner(item[len('runner_on_'):], *args, **kwargs)
return fn
if item.startswith('v2_') and self.hasattr(item[len('v2_'):]):
# Making it compatible with Ansible 1.9 and 2.0 as well
return self.__getattr__(item[len('v2_'):])
def on_runner(self, status, host, payload=None, *args, **kwargs):
# Do something with the parameters here
# status is for example on of ['ok', 'changed', 'failed', 'skipped']
# host is the target where it runs
# payload is a dict with various parameters depending on the Ansibel module being played
print self.task.name, status, host, payload
此回调模块中有许多挂钩,因此您可以选择收集,处理和记录的方式和时间。
答案 1 :(得分:2)
您无法更改实施选项。但你可以自己实现它。从Ansible 2.0开始,Ansible的默认输出实现为一个回调插件,可以根据Ansible配置覆盖。
在Ansible配置点stdout_callback中自定义编写的插件。可以找到负责您所描述的输出的默认回调插件here。
或者你也可以保留默认输出,只需创建一个额外的插件,它将直接写入自定义日志文件,然后你可以解析它。
如果您仍然使用Ansible 1.x,则可以使用this plugin。在Ansible 2中,自插件API发生变化后,它可能无法正常工作。