繁体   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