厨师食谱 - 用“'〜'红宝石变量

时间:2014-04-08 22:41:33

标签: ruby macos chef chef-recipe user-environment

好吧,让我们首先说我是一名厨师菜鸟,我正试图将这些代码哈希。

我在一家完整的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 个答案:

答案 0 :(得分:1)

是的,使用File.expand。它会将波形符~扩展为运行此cookbook的用户的主目录。或者,您可以这样做:

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

与之前的评论一样,这不是厨师DSL或ruby代码。这段代码的来源是什么,或者只是提出问题的伪代码?

此外,chef-client不常在Chef服务器部署中作为多个用户运行。它通常在sudo上下文中运行。那么也许你指的是--local-mode或chef-zero应用程序?

答案 1 :(得分:0)

您可能希望使用/dev/console的文件统计信息来获取当前用户。根据您的运营方式,客户Env[‘Home’]可能无法满足您的需求。试试这个:

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

您可以看到主厨launchd provider使用此方法来确定控制台用户

还有一种更简单的方法来完成您尝试使用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

为了增加安全性,您还应该包括校验和