2014-07-10 31 views
5

我涉足Puppet以更新ASP.NET web.config中的任意appsetting列表(用於部署目的),我處於困境中,主要是因爲我'傀儡中真正的傀儡。在Puppet上迭代一個散列鍵/值

我有此YAML文件(hiera)

--- 
appSettings: 
    setting1: "hello" 
    setting2: "world!" 
    setting3: "lalala" 

setting[x]數目可以任意地跨越(一個appSetting),我想通過散列鍵/值對循環在web來更新對應appSetting/add .config(使用exec與powershell)問題是我已經搜索如何迭代

我碰到了create_resources,這當然會通過散列哈希與預定義的一組密鑰進行迭代。再一次,清單中的鍵名稱是未知的(因此迭代鍵/值對)。

任何指導表示讚賞。

編輯:看起來像是有一個keys()函數我可以使用通過散列和迭代,然後使用hiera_hash('appSettings')獲取散列並遍歷值。

+0

的方法聽起來有點濫用。將密鑰/值對寫入代理上的文件並讓一個*單個*單片式PowerShell腳本一次完成所有編輯操作會不會更經濟? –

+1

@FelixFrank對不起,我不明白爲什麼它是「辱罵」。 PowerShell腳本將一次更新web.config一個應用程序設置。你能詳細說明一個更好的方法是什麼嗎? –

+1

理想情況下,您可以創建一個[模板](http://docs.puppetlabs.com/guides/templating.html),爲您的文件發出完整內容。除此之外,最好只用兩個資源來管理事情 - 一個文件包含Hiera中找到的鍵/值對,另一個文件包含一個更強大的腳本來執行當前所有高管的工作並應用所有的鍵/值對。您可能需要額外的腳本來確定目標文件是否有工作要做,以形成「唯一」狀態。 - 取決於性能的重要性,這可能是挑剔的 –

回答

8

好吧,我剛剛確認,你可以在你的清單做什麼:

define updateAppSetting { 
    # get the hashes again because outside vars aren't visible here 
    $appSettings = hiera_hash('appSettings') 

    # $name is the key $appsettingValue is the value 
    $appsettingValue = $appSettings[$name] 

    # update the web.config here! 
} 

$appSettings = hiera_hash('appSettings')  

# the keys() function returns the array of hash keys 
$appSettingKeys = keys($appSettings) 

# iterate through each appSetting key 
updateAppSetting{$appSettingKeys:} 
+0

不應該使用'hiera_hash' **除非**您特別需要Hiera來合併來自不同層級的散列值。在幾乎所有的正常使用情況下,您應該使用常規的'hiera'函數檢索散列數據。 –

+1

'hiera_hash'的合併功能正是我所需要的。 –

+0

好問題和後續。不知道你爲什麼被低估。 – BillMan