首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用项的列表(数组)读取自定义事实

无法使用项的列表(数组)读取自定义事实
EN

Stack Overflow用户
提问于 2016-10-27 10:01:38
回答 3查看 2.7K关注 0票数 5

我创建了自定义事实

当我使用以下命令运行剧本时

代码语言:javascript
复制
 - debug: var=ansible_local.hdfs
   run_once: true

我得到了如下预期的答案:

代码语言:javascript
复制
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的特定值。我已经尝试了很多语法,但都没有成功。

代码语言:javascript
复制
debug: var=ansible_local.hdfs.items[0].config.displayName
debug: var=ansible_local.hdfs.items.config.displayName

hdfs.fact内容:

代码语言:javascript
复制
{
  "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" : [ ]
    }
  } ]
}

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-27 12:47:34

items是一个列表,它的每个元素都是一个字典。items的每个字典元素都具有displayName属性。如果要打印每个字典元素的displayName,则可以使用以下代码:

代码语言:javascript
复制
- debug: msg="{{item.displayName}}"
  with_items:
    - "{{ansible_local.hdfs.items}}" 

编辑:

正如您所提到的,"{{ansible_local.hdfs.items}}"正在0x7f81f42b2c58上打印dict对象的内置方法项。

这是因为名称items与某些内置方法的名称发生冲突。因此,您只需将名称更改为其他名称,就不能在您的文件中使用名称。

关于解析的一点:

可以使用元素的位置作为索引来引用列表中的元素。

代码语言:javascript
复制
L=[1,2,3,4]


L[0] will give you 1.

L[1] will give you 2.

字典中的元素可以通过使用它们的键来引用,您可以使用以下两种约定:

代码语言:javascript
复制
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.
票数 3
EN

Stack Overflow用户

发布于 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的文章中找到了解决方案。

票数 8
EN

Stack Overflow用户

发布于 2016-10-27 10:22:10

在您的示例中,displayNameitem的属性,而不是item.config的属性。因此,ansible_local.hdfs.items[0].displayName将在这种情况下起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40281706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档