Поваренная книга повара - скопируйте файл локальному пользователю с переменной '~' ruby
Что ж, давайте начнем с того, что я шеф-повар, и я пытаюсь прояснить этот код.
Я в полном магазине Mac. Я использую Chef для автоматизации общесистемных изменений. Поскольку я новичок, я выкатываю его на наши системы Mac AV.
По сути, на файловом сервере есть папка с каталогом MAC SCREEN SAVERS. Я копирую каталог сервера локально в каталог MAC OS X /User/user_name/Pictures.
Итак, вот что я получил от шеф-повара:
local_folder_modified = File.mtime("~/Pictures/SCREEN SAVER NEW MACS")
server_folder_modified = File.mtime("/Volumes/SERVER/SCREEN\ SAVER\ NEW\ MACS/")
if server_folder_modified != local_folder_modified
# file has changed
then
require 'fileutils'
FileUtils.cd('server_folder_modified') do
FileUtils.rm('local_folder_modified/*')
FileUtils.cp_r './*', 'local_folder_modified'
Else
end
end
В любом случае, я не могу понять, как установить '~', чтобы быть действующим пользователем этого рецепта. Итак, если у Comp_A есть пользователь Jim_Beam, а у Comp_B есть пользователь Jack_Daniels, я не хочу устанавливать код следующим образом: ENV[HOME] = /user/jimbeam, так как он не будет работать на Jack_Daniels. Правильно?
Я прочитал, что file.expand будет работать, или ENV, но я действительно не уверен, что будет лучшим кодом, чтобы сказать: "Эй, я хочу, чтобы текущий пользователь нуждался в этой заставке - так что установите среду как переменную так, это работает через разные узлы ".
В любом случае, спасибо за вашу помощь. Надеюсь, у меня есть смысл!
2 ответа
Да, используйте File.expand. Это расширит тильду ~
быть домашним каталогом пользователя, запустившего эту кулинарную книгу. В качестве альтернативы вы можете сделать:
"#{ENV['HOME']}/Pictures/SCREEN SAVER NEW MACS"
Как и предыдущий комментарий, это не шеф-повар DSL или код рубина. Каков источник этого кода или это просто псевдокод, чтобы задать вопрос?
Кроме того, chef-клиент не часто запускается как несколько пользователей при развертывании chef-сервера. Обычно он запускается в контексте sudo. Так, может быть, вы имеете в виду приложение --local-mode или chef-zero?
Вы можете использовать файл статистики /dev/console
чтобы получить текущего пользователя. В зависимости от того, как вы используете шеф-клиент Env[‘Home’]
может не дать вам хотеть вы хотите. Попробуй это:
console_user = Etc.getpwuid(::File.stat("/dev/console").uid).name
home_dir = ::File.join(‘Users’, console_user)
Вы можете видеть, что провайдер chef launchd использует этот метод для определения пользователя консоли
Также есть гораздо более простой способ сделать то, что вы пытаетесь сделать с помощью ресурса remote_file. Попробуй это:
console_user = Etc.getpwuid(::File.stat("/dev/console").uid).name
home_dir = ::File.join(‘Users’, console_user)
pics = ::File.join("#{home_dir}/Pictures/")
server_base_url = "https://PLACE_WHERE_STORE/Wallpapers")
[
‘Pic1’,
‘Pic2’,
].each do |pic|
remote_file ::File.join(pics, pic) do
source “#{server_base_url}/#{pic}”
owner console_user
group console_user
mode '0755'
action :create
end
end
Для дополнительной безопасности вы также должны включить контрольную сумму