我有一个配置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
,但我已经意识到问题与环境无关,而只是关于属性覆盖并在内部使用这些属性机器资源。感觉我在这里缺少一些非常重要的东西,任何想法?
答案 0 :(得分:1)
答案很简单。您的EC2机器不知道在node['myapp_provisioner']['node_name']
配方中被覆盖myapp::dev_create
,因为此配方不在其运行列表中。
这台机器上的主厨 - 客户是:
展开运行列表。
获得myapp::copy_tls_certs
食谱以及其他具有reverse_proxy
和app_server
角色的食谱。 (但现在它们并不重要)
它在扩展的运行列表中读取所有烹饪书的属性文件。
因此它会显示myapp/attributes/default.rb
并获取node['myapp_provisioner']['node_name'] = 'test'
它遍历运行列表中的配方并创建资源集合或执行ruby代码(如果它不是资源)。
在你的情况下,它运行myapp::copy_tls_certs
并打印test
,因为它就是这样:)
如果您希望覆盖的属性位于配置的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