我有一个用例,我的大多数remote_file资源和yum资源直接从内部服务器下载文件。 但是,需要使用位于防火墙之外的remote_file下载一个或两个文件,这些文件必须通过HTTP代理。 如果我在/etc/chef/client.rb中设置了http_proxy设置,它将不利地影响配方从内部资源下载yum和其他文件的能力。 有没有办法让remote_file资源通过代理下载远程URL,而无需在/etc/chef/client.rb中设置http_proxy值?
在我的示例代码中,我正在从rubyforge.org下载一个redmine bundle,这需要我的服务器通过公司代理。 我在remote_file资源的前后创build了一个ruby_block,它设置了http_proxy并将其“解除”。 我正在寻找一个更干净的方式来做到这一点。
ruby_block "setenv-http_proxy" do block do Chef::Config.http_proxy = node['redmine']['http_proxy'] ENV['http_proxy'] = node['redmine']['http_proxy'] ENV['HTTP_PROXY'] = node['redmine']['http_proxy'] end action node['redmine']['rubyforge_use_proxy'] ? :create : :nothing notifies :create_if_missing, "remote_file[redmine-bundle.zip]", :immediately end remote_file "redmine-bundle.zip" do path "#{Dir.tmpdir}/redmine-#{attrs['version']}-bundle.zip" source attrs['download_url'] mode "0644" action :create_if_missing notifies :decompress, "zipp[redmine-bundle.zip]", :immediately notifies :create, "ruby_block[unsetenv-http_proxy]", :immediately end ruby_block "unsetenv-http_proxy" do block do Chef::Config.http_proxy = nil ENV['http_proxy'] = nil ENV['HTTP_PROXY'] = nil end action node['redmine']['rubyforge_use_proxy'] ? :create : :nothing end
您可以尝试在remote_file之前的配方中设置:http_proxy(并在之后取消设置),如下所示:
save_http_proxy = Chef::Config[:http_proxy] Chef::Config[:http_proxy] = "http://someproxyserver.com:8080" remote_file "redmine-bundle.zip" do path "#{Dir.tmpdir}/redmine-#{attrs['version']}-bundle.zip" source attrs['download_url'] mode "0644" action :create_if_missing notifies :decompress, "zipp[redmine-bundle.zip]", :immediately notifies :create, "ruby_block[unsetenv-http_proxy]", :immediately end Chef::Config[:http_proxy] = save_http_proxy
在你的client.rb中设置no_proxy像这样…从使用代理排除所有的内部地址。
no_proxy "chef-server,*.my.dom,192.168.*,10.*"