Chef - 在机器资源中应用的配方中使用override属性

时间:2017-02-23 18:33:18

标签: chef chef-zero chef-provisioning

我有一个配置ec2实例的方法,我尝试应用环境,我运行:

chef-client -z -o 'myapp::dev_create'

default.rb属性文件定义为:

default['myapp_provisioner'].tap do |myapp_provisioner|
  myapp_provisioner['node_name'] = 'test'
end    

myapp :: dev_create配方定义为:

require 'chef/provisioning'
Chef::Config.chef_provisioning({
  :machine_max_wait_time => 240
})

# Override environment specific configs
node.override['myapp_provisioner']['node_name'] = 'RULZ_DEV'

include_recipe 'myapp_provisioner::ec2_instance' # sets machine_options

# The line below prints "RULZ_DEV" 
# as it is overridden above
puts node['myapp_provisioner']['node_name'] 

machine node['myapp_provisioner']['node_name'] do
  chef_environment 'DEV'
  admin true # run as sudo
  recipe 'myapp::copy_tls_certs'
  role 'reverse_proxy'
  role 'app_server'
end

食谱myapp :: copy_tls_certs定义为:

node_name = node['myapp_provisioner']['node_name']

# The line below prints the value from default attributes "test"
puts "cert path ---------------> #{node_name}" 

更新

我之前将问题标题为 Chef Environment not overriding recipe called inside a machine resource ,但我已经意识到问题与环境无关,而只是关于属性覆盖并在内部使用这些属性机器资源。感觉我在这里缺少一些非常重要的东西,任何想法?

2 个答案:

答案 0 :(得分:1)

答案很简单。您的EC2机器不知道在node['myapp_provisioner']['node_name']配方中被覆盖myapp::dev_create,因为此配方不在其运行列表中。

这台机器上的主厨 - 客户是:

  1. 展开运行列表。

    获得myapp::copy_tls_certs食谱以及其他具有reverse_proxyapp_server角色的食谱。 (但现在它们并不重要)

  2. 它在扩展的运行列表中读取所有烹饪书的属性文件。

    因此它会显示myapp/attributes/default.rb并获取node['myapp_provisioner']['node_name'] = 'test'

    的默认值
  3. 它遍历运行列表中的配方并创建资源集合或执行ruby代码(如果它不是资源)。

    在你的情况下,它运行myapp::copy_tls_certs并打印test,因为它就是这样:)

  4. 如果您希望覆盖的属性位于配置的EC2计算机中,则必须将覆盖线移动到其他配方,然后可以将其包含在machine资源recipe属性中。或者可能是(我不知道,因为我之前从未见过这个machine资源)此machine资源也具有attribute属性,因此您可以通过它传递override属性。

答案 1 :(得分:0)

对于将会遇到类似问题的下一个人,这就是我最终的目标。

myapp :: create recipe定义为:

require 'chef/provisioning'

# Override attributes [I put these in an Environment file, much cleaner]
node.override['myapp_provisioner']['node_name'] = 'RULZ_DEV'

include_recipe 'myapp_provisioner::ec2_instance' # sets machine_options 

machine node['myapp_provisioner']['node_name'] do
  chef_environment 'DEV'
  admin true # run as sudo
  attributes node['myapp_provisioner'] # pulls all attributes
  role 'reverse_proxy'
  role 'app_server'
end

在chef-client运行期间,它会将重写属性拉入新创建的普通属性中。 如评论中所示,我将这些放在一个环境文件中以保持食谱清洁,我将其运行为:

chef-client -z -o 'brms::reate' -E DEV