无法使用项目列表(数组)读取自定义事实
can't read custom facts with list (array) of items
我已经创建了自定义事实 ---> /etc/ansible/facts.d/hdfs.fact
当我 运行 使用以下命令的剧本时
- 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.displayName
hdfs.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" : [ ]
}
} ]
}
感谢
在您的示例中,displayName
是 item
的 属性 而不是 item.config
。
所以 ansible_local.hdfs.items[0].displayName
在这种情况下会起作用。
items 是一个列表,它的每个元素都是一个字典。 items 的每个字典元素都有 displayName 属性。如果您想打印 items 列表中每个字典元素的 displayName,您可以使用以下代码:
- debug: msg="{{item.displayName}}"
with_items:
- "{{ansible_local.hdfs.items}}"
编辑:
正如您提到的,"{{ansible_local.hdfs.items}}" 正在打印 0x7f81f42b2c58 处的 dict 对象的内置方法项。
发生这种情况是因为名称 items 与某些内置方法的名称冲突。所以你只需要将名称更改为其他名称,你不能在 hdfs.fact 文件中使用 items 名称。
一点解析:
列表中的元素可以使用它们的位置作为索引来引用。
L=[1,2,3,4]
L[0] will give you 1.
L[1] will give you 2.
字典中的元素可以使用它们的 键 来引用,您可以使用 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.
原因
debug: var=ansible_local.hdfs.items.config.displayName
失败是 items
是保留字。
尝试
debug: var=ansible_local.hdfs['items'].config.displayName
相反。
我在 post 中的 lazartravica 中找到了解决方案
https://github.com/ansible/ansible/issues/10581
我已经创建了自定义事实 ---> /etc/ansible/facts.d/hdfs.fact
当我 运行 使用以下命令的剧本时
- 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.displayName
hdfs.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" : [ ]
}
} ]
}
感谢
在您的示例中,displayName
是 item
的 属性 而不是 item.config
。
所以 ansible_local.hdfs.items[0].displayName
在这种情况下会起作用。
items 是一个列表,它的每个元素都是一个字典。 items 的每个字典元素都有 displayName 属性。如果您想打印 items 列表中每个字典元素的 displayName,您可以使用以下代码:
- debug: msg="{{item.displayName}}"
with_items:
- "{{ansible_local.hdfs.items}}"
编辑:
正如您提到的,"{{ansible_local.hdfs.items}}" 正在打印 0x7f81f42b2c58 处的 dict 对象的内置方法项。
发生这种情况是因为名称 items 与某些内置方法的名称冲突。所以你只需要将名称更改为其他名称,你不能在 hdfs.fact 文件中使用 items 名称。
一点解析:
列表中的元素可以使用它们的位置作为索引来引用。
L=[1,2,3,4]
L[0] will give you 1.
L[1] will give you 2.
字典中的元素可以使用它们的 键 来引用,您可以使用 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.
原因
debug: var=ansible_local.hdfs.items.config.displayName
失败是 items
是保留字。
尝试
debug: var=ansible_local.hdfs['items'].config.displayName
相反。
我在 post 中的 lazartravica 中找到了解决方案 https://github.com/ansible/ansible/issues/10581