【问题标题】:How do you update an environment variable using Ruby and Chef?如何使用 Ruby 和 Chef 更新环境变量?
【发布时间】:2017-10-18 10:29:25
【问题描述】:

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

【问题讨论】:

  • 您希望环境变量只存在于 Ruby 进程(例如 Chef 脚本)的范围内,还是要更新它以便在脚本退出后保留它?

标签: ruby path environment-variables chef-infra


【解决方案1】:

Chef 中的细节我不能说,但在 ruby​​ 中,您可以使用 ENV 哈希访问环境变量。因此对于PATH,您可以执行以下操作:

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

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

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

【讨论】:

  • 对一般 Ruby 来说是正确的,但可能不是人们在 Chef 中的意思,因为这只会影响 Chef 进程中的本地环境。
  • @coderanger 好点子,我会在以后的 Chef 问题中记住这一点!
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    我找到了答案:

       #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++。如果它已经存在,那么这将被跳过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-30
      • 2011-09-11
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2015-02-16
      • 2018-08-29
      • 2017-07-11
      相关资源
      最近更新 更多