机器友好的ansible输出

时间:2016-05-06 13:07:45

标签: shell ansible

我想以一种机器友好格式输出的方式运行ansible playbook,这意味着我可以以某种方式解析。

默认情况下,ansible playbook提供如下输出:

ansible-playbook playbooks/test.yml 

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [server]
ok: [foo]

并且它甚至不能保证永远保持这种风格。我需要能够解析输出,有没有办法用JSON或XML获取playbook的输出?

2 个答案:

答案 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发生变化后,它可能无法正常工作。