Повар создать файл в домашней директории пользователя

Я использую шеф-повар для создания файлового ресурса

  file "somefile" do
     action :create_if_missing
  end

И я хочу поместить это в домашний каталог пользователя. У меня две проблемы:

  • Файл интерпретируется относительно /, поэтому использование ~/заканчивается помещением файла в /~/
  • Я запускаю этот рецепт шеф-повара через бродягу, и эти файлы создаются с помощью root. Поэтому, даже если бы я мог//работать, он оказался бы в корне. Я не хочу, чтобы жесткий код использовал имя пользователя vagrant, поскольку он не всегда будет таким (мы также можем запускать их с клиентом chef), а node[:user] кажется пустым.

Есть ли способ создать файл в домашнем каталоге, не являющемся пользователем root (в данном случае бродячем)?

Ответ 1

Тема старая, но я столкнулся с этой проблемой минуту назад.

Вы можете создать атрибут для пользователя, например: default['mycookbook']['user']

Затем в вашем рецепте:

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 Ruby

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

Ответ 2

Это потому, что рецепты шеф-повара выполняются пользователем root. Как об этом обходном пути

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

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

Ответ 3

Как я понимаю концепцию Chef - каждый рецепт должен быть самодостаточным. Это означает, что вы должны иметь возможность добавить только один рецепт (любой из них) в run_list, и он должен быть успешно установлен на пустой машине.

Что мне кажется в вашем случае, вы предполагаете, что ваш пользователь без полномочий root уже существует на машине, что противоречит моему предыдущему утверждению. Ваш рецепт должен содержать другой рецепт, который настраивает вашего пользователя без полномочий root. Если вы используете data_bag для хранения пользователя (а рецепт "user:: my_user" должен настроить вашего пользователя), ваш рецепт должен выглядеть примерно так.

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