2016-07-17 70 views
0

我有這樣的一個YAML hiera文件。木偶:遍歷一個hiera_hash模板

reg_connection: 
    toronto: 
    - host: apple.net 
    - port: 701 
    - user: george 
    - ssl: true 
    - allowed: banana,orange 
    texas: 
    - host: pink.net 
    - port: 702 
    - user: joel 
    - ssl: false 
    - allowed: blue,gree,red 

我要訪問的主機,端口,用戶,SSL的值,並允許多倫多和得克薩斯州。

我有這個在我的清單:

$reg_connection= hiera_hash('reg_connection') 

我有這個在我的模板:

<% reg_connection.keys().sort.each do |location| -%> 
<%= location %>host=<%= location[host] %> 
<%= location %>port=<%= location[port] %> 
<%= location %>username=<%= location[user] %> 
<%= location %>ssl.enable=<%= location[ssl] %> 
<%= location %>allowed.list=<%= location[allowed] %> 
<% end -%> 

我想這對輸出配置的兩個街區在我的模板:一個是多倫多和一個爲得克薩斯。

我的木偶輸出表明,它並沒有對主機的值。我如何獲得該價值?

+0

請注意'hiera_hash()'的目的是執行* hash-merge *查找。數據和結果必然是哈希值,但僅僅因爲你的值被認爲是一個哈希值並不意味着你需要或想要'hiera_hash()'。普通的'hiera()'函數會執行一個標準的優先級查找,如果這實際上是它發現的值的類型,它將返回一個哈希值。 –

回答

6

您有許多問題。第一個是,在該代碼:

<%= location[host] %> 

... host是(正確地)解釋爲一個局部變量或方法的名稱。沒有變量或方法名爲host,因此錯誤。

您是否希望命名"host"關鍵,這是一個字符串來訪問值,所以你必須使用該字符串。

<%= location["host"] %> 

第二個問題是在你的YAML文件中。

reg_connection: 
    toronto: 
    - host: apple.net 
    - port: 701 
    - user: george 
    - ssl: true 
    - allowed: banana,orange 
    texas: 
    # ... 

在這裏你有一個鍵,reg_connection的映射(這就像和被解析成-一個Ruby的Hash)。與該密鑰相關的值本身就是一個映射,其中有兩個密鑰torontotexas。到現在爲止還挺好。但與toronto相關聯的值是一個序列(讀取:數組),而不是映射,因爲每行都以-開頭。該映射有五個項目,每個項目都有一個鍵和值。表示相同數據結構的另一種方式是,這可能有助於說明問題;

{ reg_connection: 
    { toronto: 
    [ { host: apple.net }, 
     { port: 701 }, 
     { user: george }, 
     # ... 
    ], 
    texas: 
     # ... 
    } 
} 

你想要什麼,我懷疑,是最內層的數據結構是一個映射,而不是一個序列:

reg_connection: 
    toronto: 
    host: apple.net 
    port: 701 
    user: george 
    ssl: true 
    allowed: banana,orange 
    texas: 
    # ... 

第三個問題是你想遍歷方式所產生的哈希值:

<% reg_connection.keys().sort.each do |location| -%> 
<%= location %>host=<%= location["host"] %> 
<%= location %>port=<%= location["port"] %> 
... 

你叫reg_connection.keys.sort.each(注:在慣用的紅寶石,括號裏的空的參數列表中省略),這意味着你沒有遍歷的位置,喲我正在迭代reg_connection散列的密鑰。換句話說,你正在遍歷數組["toronto", "texas"],所以後面的行相當於"toronto"["host"],這是行不通的。

可能替換location["host"]reg_connection[location]["host"],但這是矯枉過正。只是這樣做:

<% reg_connection.sort.each do |location, values| -%> 
<%= location %>host=<%= values["host"] %> 
<%= location %>port=<%= values["port"] %> 
... 

沒有必要呼籲sort - 你只需直接調用它散列之前得到reg_connection的鑰匙。實際上,這將把散列轉換爲一個鍵 - 值對(兩元素數組)的數組,這對Ruby來說排序沒有困難。然後,當我們呼叫each時,將兩個值傳遞給塊-(它們的密鑰,例如"toronto")和values,使用"host","port"等密鑰的散列值。

+0

非常教導。非常感謝你。 – RASG