我创建了自定义事实
当我使用以下命令运行剧本时
- debug: var=ansible_local.hdfs
run_once: true我得到了如下预期的答案:
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [cdh-2]
ok: [cdh-3]
ok: [cdh-1]
TASK [preparation : debug] *****************************************************
ok: [cdh-1] => {
"ansible_local.hdfs": {
"items": [
{
"base": true,
"config": {
"items": []
},
"displayName": "Failover Controller Default Group",
"name": "hdfs-FAILOVERCONTROLLER-BASE",
"roleType": "FAILOVERCONTROLLER",
"serviceRef": {
"clusterName": "cluster",
"serviceName": "hdfs"
}
},
{
"base": true,
"config": {
"items": [
{
"name": "balancer_java_heapsize",
"value": "491782144"
}
]
},
"displayName": "Balancer Default Group",
"name": "hdfs-BALANCER-BASE",
"roleType": "BALANCER",
"serviceRef": {
"clusterName": "cluster",
"serviceName": "hdfs"
}
},
{
"base": true,
"config": {
"items": []
},
"displayName": "HttpFS Default Group",
"name": "hdfs-HTTPFS-BASE",
"roleType": "HTTPFS",
"serviceRef": {
"clusterName": "cluster",
"serviceName": "hdfs"
}
}
]
}
}我的问题是如何解析那个json的特定值。我已经尝试了很多语法,但都没有成功。
debug: var=ansible_local.hdfs.items[0].config.displayName
debug: var=ansible_local.hdfs.items.config.displayNamehdfs.fact内容:
{
"items" : [ {
"name" : "hdfs-FAILOVERCONTROLLER-BASE",
"displayName" : "Failover Controller Default Group",
"roleType" : "FAILOVERCONTROLLER",
"base" : true,
"serviceRef" : {
"clusterName" : "cluster",
"serviceName" : "hdfs"
},
"config" : {
"items" : [ ]
}
}, {
"name" : "hdfs-BALANCER-BASE",
"displayName" : "Balancer Default Group",
"roleType" : "BALANCER",
"base" : true,
"serviceRef" : {
"clusterName" : "cluster",
"serviceName" : "hdfs"
},
"config" : {
"items" : [ {
"name" : "balancer_java_heapsize",
"value" : "491782144"
} ]
}
}, {
"name" : "hdfs-HTTPFS-BASE",
"displayName" : "HttpFS Default Group",
"roleType" : "HTTPFS",
"base" : true,
"serviceRef" : {
"clusterName" : "cluster",
"serviceName" : "hdfs"
},
"config" : {
"items" : [ ]
}
} ]
}谢谢
发布于 2016-10-27 12:47:34
items是一个列表,它的每个元素都是一个字典。items的每个字典元素都具有displayName属性。如果要打印每个字典元素的displayName,则可以使用以下代码:
- debug: msg="{{item.displayName}}"
with_items:
- "{{ansible_local.hdfs.items}}" 编辑:
正如您所提到的,"{{ansible_local.hdfs.items}}"正在0x7f81f42b2c58上打印dict对象的内置方法项。
这是因为名称items与某些内置方法的名称发生冲突。因此,您只需将名称更改为其他名称,就不能在您的文件中使用名称。
关于解析的一点:
可以使用元素的位置作为索引来引用列表中的元素。
L=[1,2,3,4]
L[0] will give you 1.
L[1] will give you 2.字典中的元素可以通过使用它们的键来引用,您可以使用以下两种约定:
D ={"one" : 1, "two" : 2, "three" : 3}
D["1"] will give you 1.
D.two will give you 2.
D.one will give you 1.
D["two"] will give you 2.发布于 2017-10-29 23:24:02
debug: var=ansible_local.hdfs.items.config.displayName失败的原因是items是一个保留字。
试一试
取而代之的是debug: var=ansible_local.hdfs['items'].config.displayName。
我在lazartravica here https://github.com/ansible/ansible/issues/10581的文章中找到了解决方案。
发布于 2016-10-27 10:22:10
在您的示例中,displayName是item的属性,而不是item.config的属性。因此,ansible_local.hdfs.items[0].displayName将在这种情况下起作用。
https://stackoverflow.com/questions/40281706
复制相似问题