Поваренная книга повара - скопируйте файл локальному пользователю с переменной '~' 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

Для дополнительной безопасности вы также должны включить контрольную сумму

Другие вопросы по тегам