2013-12-23 16 views
1

我很努力地理解hiera使用數據的方式,在我看來,像使用frontmatter包含全局數據文件的普通yaml會更簡單和更強大。Puppet Hiera在更具體的文件中訪問全局對象

在任何情況下,我想完成這樣的事情:

# global.yaml 
collection1: &collection1 
    foo: 1 
collection2: &collection2 
    bar: 2 
collection3: &collection3 
    baz: 3 

# development_environment.yaml 
collection: 
    <<: *collection1 
    <<: *collection2 

# production_environment.yaml 
collection: 
    <<: *collection2 
    <<: *collection3 

從本質上講,這樣我就可以在一個地方保持了幾件事情列表,然後以不同的方式取決於它們組合環境。 Hiera有一個合併頂級密鑰和深度合併的選項,但是我找不到任何關於在層次結構中包含更高級別數據的任何問題(對於我的特殊問題,如果有一種方法可以覆蓋數據在全局文件中,而不是將其合併到更具體的文件中,但似乎也不可能)。

我該怎麼做?我是否在所有不同的環境中手動複製基礎數據?

我意識到我可以在傀儡代碼中放置一個環境案例語句來選擇要包含哪些基本集合,但是打破了在傀儡中保留hiera和代碼中的數據的擔憂。如果我必須這樣做,我不妨完全跳過hiera並將我的數據放入傀儡模塊中。

回答

1

您可以通過人工方式收集的列表,並遍歷它做到這一點:

# global.yaml 
collection1: 
    foo: 1 
collection2: 
    bar: 2 
collection3: 
    baz: 3 

# development_environment.yaml 
collection: 
    - collection1 
    - collection2 

# production_environment.yaml 
collection: 
    - collection2 
    - collection3 

現在你可以寫這樣的事情:

# this variable will contain something like ['collection1','collection2'] 
$collections = hiera('collection') 
# Now get all the corresponding values 
$hashparts = $collections.map |$r| { $x = hiera($r); $x } # [{"baz"=>3}, {"bar"=>2}] 
# Now we merge all the parts 
$hash = $hashparts.reduce |$a,$b| { $x = merge($a,$b); $x } # {"baz"=>3, "bar"=>2} 

這是醜陋的,但應該做的你的期望。關於$x = function(); $x的處理在這裏是因爲不幸的決定,所有的lambda函數都可以在任何上下文(語句或值)中使用,所以我們在解析時不知道我們是否期望最後一個「令牌」 「塊」是一個陳述或表達。

相關問題