不能

2016-10-27 56 views
1

我已創建自定義的事實---> /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" : [ ] 
    } 
    } ] 
} 

感謝

+0

你能告訴我的輸出:ansible_local.hdfs.items – Shasha99

回答

0

項目是一個列表,它的每個元素都是一個字典。 項目的每個字典元素都有displayName屬性。在情況要打印出現在項目列表,你可以使用下面的代碼每個字典元素的顯示名

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

編輯:
正如你提到的「{{ansible_local.hdfs.items}}」正在打印字典對象的內置方法項,位於0x7f81f42b2c58

發生這種情況的原因是名稱項目與某些內置方法的名稱相沖突。因此,您只需將名稱更改爲其他名稱,則不能在您的hdfs.fact文件中使用項目名稱。


上解析一點:在一個列表

元素可以通過使用作爲索引它們的位置被稱作。在字典中

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. 
+0

可惜不是 – yoramshai

+0

- 調試:味精=「{{ansible_local.hdfs。項目}}「嘗試運行此命令 – Shasha99

+1

後,我已經改變根」項目「它按預期工作, 謝謝 – yoramshai

0

在您的例子displayNameitem一個屬性,而不是item.config。 所以ansible_local.hdfs.items[0].displayName將在這種情況下工作。

-1

原因 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