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

时间:2017-05-18 14:29:34

标签: ruby path environment-variables 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

3 个答案:

答案 0 :(得分:1)

从问题来看,您似乎正在尝试在Windows服务器上添加PATH。在这种情况下,您可以使用名为windows_path的{​​{1}}食谱资源进行此类操作:

windows_path 'C:\Sysinternals' do
  action :add
end

https://github.com/chef-cookbooks/windows

https://supermarket.chef.io/cookbooks/windows

答案 1 :(得分:0)

我不能在chef中说明具体内容,但在ruby中,您可以使用ENV哈希访问环境变量。因此,对于PATH,您可以执行以下操作:

ENV["PATH"] = ENV["PATH"].split(":").push("/my/new/path").join(":")

这将在程序执行期间更新PATH。请记住:

  1. 这只会更新您的ruby脚本的PATH,并且只会暂时更新。永久更改PATH更复杂,并且依赖于操作系统。
  2. 此代码假设您使用的是linux。在Windows中,PATH分隔符为;而不是:,因此您应该相应地更新代码。

答案 2 :(得分:0)

我找到了答案:

   #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变量,然后它将附加D:/ Home / Apps / Notepad ++ / Notepad ++如果它当前不在PATH中。如果它已经存在,那么这将被跳过。