Поваренная книга шеф-повара - скопируйте файл локальному пользователю с рубиновой переменной «~»

Что ж, начнем с того, что я нуб-повар и пытаюсь расшифровать этот код.

Я в полном магазине 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, но я действительно не уверен, какой код будет лучшим, чтобы сказать: «Эй, я хочу, чтобы текущий пользователь нуждался в этой заставке — поэтому установите среду как переменную, поэтому он работает на разных узлах».

В любом случае, спасибо за вашу помощь. Я надеюсь, что я имею смысл!


person E.Z.    schedule 08.04.2014    source источник
comment
::File.expand_path(~/Pictures/SCREEN SAVER NEW MACS) расширит путь для вас. Кстати, в приведенном вами примере я не вижу ни одного шеф-повара dsl.   -  person punkle    schedule 09.04.2014


Ответы (2)


Да, используйте File.expand. Он расширит тильду ~ до домашнего каталога пользователя, запускающего эту кулинарную книгу. В качестве альтернативы вы можете сделать:

"#{ENV['HOME']}/Pictures/SCREEN SAVER NEW MACS"

Как и в предыдущем комментарии, это не DSL шеф-повара или рубиновый код. Каков источник этого кода или это просто псевдокод, чтобы задать вопрос?

Кроме того, chef-client не часто запускается от имени нескольких пользователей при развертывании сервера шеф-повара. Обычно он запускается в контексте sudo. Итак, может быть, вы имеете в виду приложение --local-mode или chef-zero?

person jshort    schedule 09.04.2014
comment
Потрясающе-спасибо! Да, я сейчас просто ломаю голову над Шефом. - person E.Z.; 14.04.2014
comment
Упс, слишком быстро нажал Enter. Это почти тот же код, что и в файле default.rb кулинарной книги. Я не знаю, отвечает ли это на ваш вопрос (извините, если нет). Кстати, я НЕ знал о пользователе-клиенте шеф-повара, так как это СУПЕР полезно! - person E.Z.; 14.04.2014

Вы можете использовать статистику файла /dev/console, чтобы получить текущего пользователя. В зависимости от того, как вы работаете, шеф-клиент Env[‘Home’] может не дать вам желаемого. Попробуй это:

console_user = Etc.getpwuid(::File.stat("/dev/console").uid).name
home_dir = ::File.join(‘Users’, console_user)

Вы можете видеть, что шеф-повар запустил поставщика использует этот метод для определения пользователя консоли

Также есть гораздо более простой способ сделать то, что вы пытаетесь сделать с помощью ресурса 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

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

person Mike Dodge    schedule 23.11.2017