好吧,让我们首先说我是一名厨师菜鸟,我正试图将这些代码哈希。
我在一家完整的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,但我真的不确定什么是最好的代码说 "嘿,我想要当前用户需要这个屏幕保护程序 - 所以将环境设置为一个变量,以便它可以在不同的节点上工作"。
无论如何,谢谢你的帮助。我希望我有意义!
答案 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
为了增加安全性,您还应该包括校验和