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

时间:2016-10-27 10:01:39

标签: ansible ansible-playbook ansible-2.x

我创造了自定义事实---> /etc/ansible/facts.d/hdfs.fact

当我使用以下命令运行playbook时

 - 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 content:

{
  "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" : [ ]
    }
  } ]
}

谢谢

3 个答案:

答案 0 :(得分:2)

原因 debug: var=ansible_local.hdfs.items.config.displayName 失败的是items是一个保留字。

尝试

debug: var=ansible_local.hdfs['items'].config.displayName 代替。

我在 lazartravica 的帖子中找到了解决方案 https://github.com/ansible/ansible/issues/10581

答案 1 :(得分:0)

在您的示例中,displayNameitem的属性,而不是item.config的属性。 因此ansible_local.hdfs.items[0].displayName将适用于此案例。

答案 2 :(得分:0)

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

- debug: msg="{{item.displayName}}"
  with_items:
    - "{{ansible_local.hdfs.items}}" 

修改
正如您所提到的那样" {{ansible_local.hdfs.items}}" 正在打印 dict对象的内置方法项目0x7f81f42b2c58

这种情况正在发生,因为名称与某些内置方法的名称发生冲突。因此,您只需将名称更改为其他名称,就不能在hdfs.fact文件中使用项目名称。

解析一点:

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

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.