2012-10-12 48 views
10

estoy usando chef para crear un archivo de recursoschef de crear el archivo en el directorio personal del usuario

file "somefile" do 
    action :create_if_missing 
    end 

Y Quiero poner esto en el directorio personal del usuario. Estoy teniendo dos cuestiones:

  1. El archivo se interpreta en relación a /, así que usar ~/acaba de poner el archivo en/~/
  2. Estoy lanzando esta receta cocinero través de vagabundo y estos archivos están siendo creado por root Así que incluso si pudiera obtener ~/para trabajar, terminaría en el hogar de root. No quiero utilizar el código difícil para usar el nombre de usuario vagabundo, ya que no siempre será así (podemos ejecutarlo también con el cliente chef), y node[:user] parece estar vacío.

¿Hay alguna manera de crear un archivo en el directorio principal del usuario no root (en este caso vago)?

Respuesta

2

Esto se debe a que las recetas del chef las ejecuta el usuario root. ¿Qué tal esta solución?

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

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

Estoy de acuerdo con este enfoque, pero me gustaría utilizar los atributos de nodo se pasa en forma predeterminada. [: Chef_client] [: nombre de usuario] – nictrix

+1

Dado que no puede ser ejecutado por vagabundo, no quiero codificarlo en el archivo. ¿Está por defecto [: chef_client] [: username] un atributo? ¿O hay un atributo que pueda usar para obtener al usuario? –

+2

parece que al usar ENV ['PWD'] obtendrá el directorio de trabajo, que es el directorio de inicio del usuario actual –

0

Según tengo entendido, la concepción del chef: cada receta debe ser independiente. Eso significa que debería poder agregar solo una receta (cualquiera de ellas) en run_list y debería instalarse con éxito en una máquina vacía.

Lo que me parece en su caso, usted supone que su usuario no root ya existe en la máquina, lo que está en contradicción con mi declaración anterior. Su receta debe incluir otra receta que configure a su usuario no root. Siempre que use un data_bag para almacenar al usuario (y la receta 'user :: my_user' debe configurar a su usuario), su receta debe tener un aspecto similar.

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

El hilo es viejo, pero me enfrenté a este problema hace un momento.

Puede crear atributo para el usuario, por ejemplo: default['mycookbook']['user']

Luego, en su receta:

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 
Cuestiones relacionadas