[英]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.