我知道如何为用户和机器设置变量。当我尝试添加到 PATH 时出现问题。目前,我的代码将覆盖 PATH 中的内容。
execute 'set java_home2' do
command "setx -m PATH2 "D:\Home"
*only_if {"PATH2" == " "}*
end
这目前可确保 PATH 仅在没有 PATH 的情况下运行。删除only_if时,会出现覆盖问题。
编辑:我现在能够修改系统变量,但无法弄清楚如何对用户变量执行相同的操作
env 'path addition' do
key_name "PATH"
value (ENV["PATH"] + ";D:\Home\Apps\variable")
:modify
end
我不能在 chef 中说出细节,但在 ruby 中,您可以使用 ENV
哈希访问环境变量。因此,对于PATH
,您可以执行以下操作:
ENV["PATH"] = ENV["PATH"].split(":").push("/my/new/path").join(":")
这将在程序执行期间更新您的 PATH。请记住:
- 这只会更新 ruby 脚本的
PATH
,而且只是暂时更新。永久更改PATH
更加复杂,并且取决于操作系统。 - 此代码假定您使用的是 linux。在 Windows 中,
PATH
分隔符是;
而不是:
,因此您应该相应地更新代码。
从问题来看,您似乎正在尝试在Windows服务器上添加PATH。在这种情况下,您可以使用名为windows_path
windows
说明书资源进行此类操作:
windows_path 'C:Sysinternals' do
action :add
end
https://github.com/chef-cookbooks/windows
https://supermarket.chef.io/cookbooks/windows
我找到了答案:
#Append notepad to user PATH variable
registry_key "HKEY_CURRENT_USER\Environment" do
$path_name = ""
subkey_array = registry_get_values("HKEY_CURRENT_USER\Environment", :x86_64)
subkey_array.each{ |val|
case val[:name].include?("PATH")
when true
$path_name = val[:data]
print "n The User PATH is: #{$path_name}"
break
when false
print ':'
end
}
values [{
:name => "PATH",
:type => :string,
:data => "#{$path_name};D:\Home\Apps\Notepad++\Notepad++"
}]
action :create
#add a guard to prevent duplicates
not_if {
$path_name.include?("D:\Home\Apps\Notepad++\Notepad++")
}
end
从 CMD 行运行时,此代码将打印当前的用户 PATH 变量,然后如果当前不在 PATH 中,它将附加 D:/Home/Apps/Notepad++/Notepad++ U。如果它已经存在,那么这将被跳过。