2015-04-15 31 views
1

我使用廚師來管理Ubuntu服務器。我爲服務器上的每個用戶添加了一個控制檯工具箱,其中大部分用戶都是在首次Chef運行期間創建的。第一次運行Chef時,會創建用戶,但這段代碼不會將符號鏈接添加到工具包,也不會創建正確的.bashrc文件。我認爲這是因爲ruby Dir.open('/home')在創建用戶之前在運行開始時被編譯,因爲這些文件在下一次Chef運行中正確添加。獲取目錄中廚師運行列表

如何在實際運行此配方時獲取反映系統當前狀態的目錄列表?我認爲ruby_block可能是我需要看的,但我不確定如何在這裏應用它。

# Loop over all user folders 
Dir.open('/home').each do |user_dir| 
    next if user_dir.start_with?('.') 

    link "/home/#{user_dir}/.bash_it" do 
    to '/home/.bash_it/' 
    link_type :symbolic 
    end 

    template "/home/#{user_dir}/.bashrc" do 
    source 'bashrc.erb' 
    owner user_dir 
    group user_dir 
    mode '0644' 
    end 
end 
+0

你可以不喜歡它添加到/ etc/skel中的框,以便它創造自動作爲添加用戶的一部分? – Doon

+0

ruby​​_block可能是解決方案yes,定義或提供者,因爲它將在收斂時調用時進行編譯(因此您的dirs已經創建)。 (兩個廚師跑)是另一種方式來實現這 – Tensibai

回答

1

不能創建這些模板,並鏈接在同一個地方(環內),您創建用戶或使用這裏的確切同一迴路(我的意思是要通過你已經由廚師安裝用戶而不是通過現有的用戶)?這對我的頭腦來說是一個更好的解決方案。

但是,如果你仍然想使用它一樣,你必須使用ruby_block和申報模板和動態鏈接

ruby_block 'Creating link and template' do 
    block do 
    Dir.open('/home').each do |user_dir| 
     next if user_dir.start_with?('.') 

     link = Chef::Resource.Link.new "/home/#{user_dir}/.bash_it", run_context 
     link.to '/home/.bash_it/' 
     link.link_type :symbolic 
     link.run_action :create 

     tplt = Chef::Resource.Template.new "/home/#{user_dir}/.bashrc", run_context 
     tplt.source 'bashrc.erb' 
     tplt.owner user_dir 
     tplt.group user_dir 
     tplt.mode '0644' 
     tplt.run_action :create 
    end 
    end 
end 
+0

我正在使用廚師用戶lwrp從數據袋添加用戶,所以沒有循環,我可以找到處理這個。我有一直在用一些不同的方式來攻擊這個,但沒有任何運氣。由於這不是什麼關鍵,所以我想我只會接受2次運行才能完成所有設置。 – Rockstar04