previous = Chef::Config[:http_proxy]
Chef::Config[:http_proxy] = 'http://proxy.example.net:8080'

remote_file '/var/tmp/package.zip' do
  source 'https://downloads.example.net/package.zip'
end

Chef::Config[:http_proxy] = previous

这条普通资源真正开始下载之前,那个临时值早已失效:

  1. Compile: 顶层 Ruby 保存原值、设置临时代理、声明 remote_file,随后把值还原。
  2. Converge: 资源才按届时可用的配置执行动作。

带有合适内部例外的稳定客户端代理可以避开这个时序问题。请使用已安装客户端文档中给出的例外写法,而不要假设 shell 通配符规则同样成立。在允许的公共线路上单独下载公共产物时,如果 Chef 客户端既没有配置也没有保留代理账号,HTTP 代理列表中的条目可以提供稳定的 HTTP 端点。请保留它的内部例外;换一个地址并不会改变 compile 与 converge 消费它的时机。

若某个操作需要特殊线路,就把它对配置的修改和执行放在同一作用域内。带合适 unified-mode 行为的自定义资源是一种选择,但 Chef::Config 仍然是全局的。下载失败时要还原,文件已是最新时同样要还原。更新通知不会无条件触发,而异常之后的清理资源可能永远不执行。

lazy source 属性延迟的是该属性本身的求值,而不是周围的 Ruby 赋值。当下载确实属于编译期时,编译期执行资源是另一条受支持的路径;它同样会改变依赖与通知的时序。应当按 HTTP 客户端何时读取代理设置来选择,而不是指望声明顺序带来隔离。

相关文章