Chef - 覆盖节点属性

Chef - override node attribute


我们有使用节点属性的配方:

python_pip 'request_proxy' do
  virtualenv '/opt/proxy/.env'
  version node.default['request-proxy']['version']
  Chef::Log.info('Auth request proxy #{version}')
  action :install
end

属性在节点级别设置,一切正常,但出于测试目的,我想在我的本地 (kitchen/vagrant) 节点中覆盖它。作为第一步,我将属性添加到我的 .kitchen.yml:

suites:
  - name: default
    run_list:
    - recipe[proxy_install]
    attributes: {request-proxy: {'version': '1.0.8'}}

不幸的是节点仍然使用"default"版本。一切正常,没有任何错误,并且完全忽略了我的属性。
后来我尝试将其添加到生产节点上的参数文件 (chef-client -j params.json) 中,结果是一样的。

我错过了什么?我做错了什么?

P.S。 Chef::Log.info('Auth request proxy #{version}')也被完全忽略了??

您可以尝试使用 YAML 吗? kitchen.yml 不是 JSON 文件,所以我不确定你嵌入其中的 JSON 是否有效。

attributes:
  request-proxy: 
    version: '1.0.8'

此外,您可能不应该使用 node.default,除非您只想选择默认值(而不是任何覆盖)。如果你想在 Chef 中使用属性优先级(默认、正常、覆盖、强制),你应该这样做:

node['request-proxy']['version']

最后,您还有一个带变量的单引号字符串。这将 永远不会 像你在 Ruby 中期望的那样工作(你是 运行 rubocop 吗?它会抓住这个)。尝试用双引号将其从资源中间删除:

Chef::Log.info("Auth request proxy #{version}")