2012-10-12 4 views
10

sto usando chef per creare un file di risorsecuoco creare file nella directory home dell'utente

file "somefile" do 
    action :create_if_missing 
    end 

e voglio mettere questo nella directory home dell'utente. Sto avendo due questioni:

  1. Il file viene considerato relativo a /, in modo da utilizzare ~/finisce per mettere il file in/~/
  2. Sto lanciando questa ricetta lo chef attraverso vagabondo e questi file vengono creato da root. Quindi, anche se potessi ottenere ~/a lavorare, finirebbe nella casa di root. Non voglio usare il nome utente errato perché non sarà sempre così (potremmo eseguirli anche con lo chef client) e lo node[:user] sembra vuoto.

C'è un modo per creare un file nella directory principale dell'utente non root (in questo caso vagabondo)?

risposta

2

Questo perché le ricette dello chef sono gestite dall'utente root. Che ne dici di questa soluzione alternativa

if File.exists? "/vagrant" 
    user = "vagrant" 
else 
    user = "deployer" 
end 

file "/home/#{user}/foo" do 
    .. 
end 
+0

Sono d'accordo con questo approccio, ma vorrei utilizzare gli attributi dei nodi si passa in default. [: Chef_client] [: nome utente] – nictrix

+1

Poiché potrebbe non essere eseguito da vagabondo, non desidero codificare il nome nel file. È predefinito [: chef_client] [: username] un attributo? O c'è un attributo che posso usare per ottenere l'utente? –

+2

sembra che usando ENV ['PWD'] mi otterrà la directory di lavoro, che è la directory home dell'utente corrente –

0

Come ho capito la concezione dello Chef - ogni ricetta dovrebbe essere autonoma. Ciò significa che dovresti essere in grado di aggiungere solo una ricetta (nessuna di queste) in run_list e dovrebbe essere installata correttamente su una macchina vuota.

Cosa mi sembra nel tuo caso, si presume che il proprio utente non root esista già sulla macchina, il che è in contraddizione con la mia precedente affermazione. La tua ricetta dovrebbe includere un'altra ricetta, che configura il tuo utente non root. Se si utilizza un data_bag per la memorizzazione dell'utente (e la ricetta 'user :: my_user' dovrebbe configurare l'utente), la tua ricetta dovrebbe apparire in questo modo.

include_recipe 'user::my_user' 
my_user = data_bag_item('user', 'my_user') 

file ::File.join(my_user['home'], 'somefile') do 
    action :create_if_missing 
end 
18

Il thread è vecchio, ma ho affrontato questo problema un momento fa.

È possibile creare attributi per l'utente, ad esempio: default['mycookbook']['user']

Poi nella vostra ricetta:

user = node['mycookbook']['user'] # user set in cookbook attrubute 
# user = node['current_user'] # user running chef cookbook (on provisioned host) 

home = node['etc']['passwd'][user]['dir'] # Chef DSL 
# home = Dir.home(user) # It's Ruby 

file "#{home}/somefile" do 
    action :create_if_missing 
end