簡體   English   中英

在廚師運行期間如何重新加載環境變量?

[英]How to reload environment variables during a chef run?

我正在使用Chef-solo在Windows上自動進行一些配置。 我遇到一個配方問題,該配方需要以前的配方間接設置環境(具體而言,我在配方1中安裝了Visual Studio,配方2需要在新的環境中啟動才能訪問配方1設置的變量)。

據我所知,有沒有辦法告訴廚師“重新加載環境”? 實現此目標的最佳方法是什么? 更糟糕的是,如果這樣做更容易,那么我也不介意重新啟動,只要重新啟動和繼續進行配置的廚師是完全自動化的即可。

您可以運行ruby塊並將新的環境變量添加到當前的環境變量中:

ruby_block "get new env variables" do
  block do
    new_env = `cmd.exe /C set`
    #do some parsing magic, then set the new_env
    ENV = parsed_env
  end
 end

我尚未對此進行測試,但這可能會讓您步入正軌。

Chocolatey將Refreshenv腳本用於同一任務,從Registry中重新加載環境變量。

我已將此腳本移植到Ruby(獲得Apache 2.0許可的許可):

require 'win32/registry'

def get_reg_env(hkey, subkey, &block)
  Win32::Registry.open(hkey, subkey) do |reg|
    reg.each_value do |name|
      value = reg.read_s_expand(name)
      if block && ENV.key?(name)
        ENV[name] = block.call(name, ENV[name], value)
      else
        ENV[name] = value
      end
    end
  end
end

def refresh_env
  get_reg_env(Win32::Registry::HKEY_LOCAL_MACHINE, 'System\CurrentControlSet\Control\Session Manager\Environment')
  get_reg_env(Win32::Registry::HKEY_CURRENT_USER, 'Environment') do |name, old_value, new_value|
    if name.upcase == 'PATH'
      old_value || File::PATH_SEPARATOR || new_value
    else
      new_value
    end
  end
end

您將其放在libraries目錄中,並在如下配方中使用它:

ruby_block 'refreshenv' do
  block do
    refresh_env
  end
  action :nothing
end

chocolatey_package 'visualstudio2017buildtools' do
  notifies :run, 'ruby_block[refreshenv]', :immediately
end

也許有人可以將其包裝在食譜中。

對於更多的跨平台方式,您還可以查看dotenv gem

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM