Ansible ad-hoc 命令过滤器 JSON 按键输出或 属性
Ansible ad-hoc command filter JSON output by key or property
我想过滤 ad-hoc ansible 命令的 JSON 输出 - 例如抓取多个主机的“facts”长列表,并只显示一个可能有几个级别深的列表,例如 ansible_lsb.description
,这样我就可以快速比较它们的软件版本 运行,检查准确的时间或时区,等等。
这个有效:
ansible myserver -m setup -a 'filter=ansible_lsb'
myserver | SUCCESS => {
"ansible_facts": {
"ansible_lsb": {
"codename": "wheezy",
"description": "Debian GNU/Linux 7.11 (wheezy)",
"id": "Debian",
"major_release": "7",
"release": "7.11"
}
},
"changed": false
}
但是,由于 setup module docs 状态 "the filter option filters only the first level subkey below ansible_facts",所以失败了:
ansible myserver -m setup -a 'filter=ansible_lsb.description'
myserver | SUCCESS => {
"ansible_facts": {},
"changed": false
}
(虽然作为参考,您可以在其他地方使用点符号,例如任务的when conditional)
有没有办法在显示输出之前过滤 JSON 键?
标准 setup
模块只能对 "top-level" 个事实应用过滤器。
要实现您想要的效果,您可以制作一个名称为 setup
的动作插件来应用自定义过滤器。
工作示例./action_plugins/setup.py
:
from ansible.plugins.action import ActionBase
class ActionModule(ActionBase):
def run(self, tmp=None, task_vars=None):
def lookup(obj, path):
return reduce(dict.get, path.split('.'), obj)
result = super(ActionModule, self).run(tmp, task_vars)
myfilter = self._task.args.get('myfilter', None)
module_args = self._task.args.copy()
if myfilter:
module_args.pop('myfilter')
module_return = self._execute_module(module_name='setup', module_args=module_args, task_vars=task_vars, tmp=tmp)
if not module_return.get('failed') and myfilter:
return {"changed":False, myfilter:lookup(module_return['ansible_facts'], myfilter)}
else:
return module_return
它调用原始setup
模块剥离myfilter
参数,然后如果任务没有失败并且设置了myfilter,则使用简单的reduce实现过滤结果。查找功能非常简单,因此不适用于列表,只能用于对象。
结果:
$ ansible myserver -m setup -a "myfilter=ansible_lsb.description"
myserver | SUCCESS => {
"ansible_lsb.description": "Ubuntu 12.04.4 LTS",
"changed": false
}
我想过滤 ad-hoc ansible 命令的 JSON 输出 - 例如抓取多个主机的“facts”长列表,并只显示一个可能有几个级别深的列表,例如 ansible_lsb.description
,这样我就可以快速比较它们的软件版本 运行,检查准确的时间或时区,等等。
这个有效:
ansible myserver -m setup -a 'filter=ansible_lsb'
myserver | SUCCESS => {
"ansible_facts": {
"ansible_lsb": {
"codename": "wheezy",
"description": "Debian GNU/Linux 7.11 (wheezy)",
"id": "Debian",
"major_release": "7",
"release": "7.11"
}
},
"changed": false
}
但是,由于 setup module docs 状态 "the filter option filters only the first level subkey below ansible_facts",所以失败了:
ansible myserver -m setup -a 'filter=ansible_lsb.description'
myserver | SUCCESS => {
"ansible_facts": {},
"changed": false
}
(虽然作为参考,您可以在其他地方使用点符号,例如任务的when conditional)
有没有办法在显示输出之前过滤 JSON 键?
标准 setup
模块只能对 "top-level" 个事实应用过滤器。
要实现您想要的效果,您可以制作一个名称为 setup
的动作插件来应用自定义过滤器。
工作示例./action_plugins/setup.py
:
from ansible.plugins.action import ActionBase
class ActionModule(ActionBase):
def run(self, tmp=None, task_vars=None):
def lookup(obj, path):
return reduce(dict.get, path.split('.'), obj)
result = super(ActionModule, self).run(tmp, task_vars)
myfilter = self._task.args.get('myfilter', None)
module_args = self._task.args.copy()
if myfilter:
module_args.pop('myfilter')
module_return = self._execute_module(module_name='setup', module_args=module_args, task_vars=task_vars, tmp=tmp)
if not module_return.get('failed') and myfilter:
return {"changed":False, myfilter:lookup(module_return['ansible_facts'], myfilter)}
else:
return module_return
它调用原始setup
模块剥离myfilter
参数,然后如果任务没有失败并且设置了myfilter,则使用简单的reduce实现过滤结果。查找功能非常简单,因此不适用于列表,只能用于对象。
结果:
$ ansible myserver -m setup -a "myfilter=ansible_lsb.description"
myserver | SUCCESS => {
"ansible_lsb.description": "Ubuntu 12.04.4 LTS",
"changed": false
}