如何使用 Ruby 和 Chef 更新环境变量



我知道如何为用户和机器设置变量。当我尝试添加到 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。请记住:

  1. 这只会更新 ruby 脚本的PATH,而且只是暂时更新。永久更改PATH更加复杂,并且取决于操作系统。
  2. 此代码假定您使用的是 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。如果它已经存在,那么这将被跳过。

相关内容

  • 没有找到相关文章

最新更新