2015-06-30 48 views
0

使用鍵我迭代數組,並希望使用密鑰作爲查找一個Ohai值的邏輯的一部分。在我的具體情況下,我試圖source每個定義的用戶的.bashrc如果從以前的資源觸發。迭代一個廚師陣列和Ohai查找

Ohai結構:

"etc": { "passwd": { "root": { "dir": "/root", "gid": 0, "uid": 0, "shell": "/bin/bash", "gecos": "root" }, ... "foo": { "dir": "/home/foo", "gid": 501, "uid": 501, "shell": "/bin/bash", "gecos": "" }, ...

因此,正如我通過,我試圖做類似循環:

node['my_cookbook']['managed_users'].each do |usr| bash 'reload_shell' do code "source #{node['etc']['passwd'][usr]['dir']}/.bashrc" action :nothing end end

我已經試過也在使用['usr'][#{usr}]["usr"]表示法,以及轉義引號。

回答

1

遍歷紅寶石散列並訪問你可以做的關鍵是:

node['my_cookbook']['managed_users'].each do |usr,props| 
    bash 'reload_shell' do 
    code "source #{node['etc']['passwd'][usr]['dir']}/.bashrc" 
    action :nothing 
    end 
end 

如果你不關心鍵或者下它的值,通過_即更換相應的變量案例:

node['my_cookbook']['managed_users'].each do |usr,_| 
    bash 'reload_shell' do 
    code "source #{node['etc']['passwd'][usr]['dir']}/.bashrc" 
    action :nothing 
    end 
end 

沒有這樣做,你得到充分的基礎散列,所以你usr var爲

{ 
    "root": { 
    "dir": "/root", 
    "gid": 0, 
    "uid": 0, 
    "shell": "/bin/bash", 
    "gecos": "root" 
} 

的而不是僅僅是「根」。

邊注:採購工作當前的外殼,一個bash資源的殼催生,命令執行內和外殼是封閉的。採購文件中不會有任何影響(除非有該.bash_rc內部複雜的突未做的事情,這不會影響系統也不是廚師運行)

+0

我upvoted您採購的解釋,謝謝!但是,我仍然看到一個問題:使用| usr,_ | nil:NilClass'的未定義方法[]。符號。 –

+0

這不是你原來的問題的一部分,這意味着有一個在屬性名若有所失或一個錯字或用戶your're目標不存在 – Tensibai

+0

剛剛結束對我的未定義的方法問題的循環,我需要包括ohai「重新加載」資源並使用懶惰歸因設置我的路徑。 https://docs.chef.io/resource_ohai.html https://docs.chef.io/resource_common.html#lazy-attribute-evaluation –