1

我有一个配置 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,但我开始意识到这个问题与环境无关,而只是关于在机器资源中覆盖和使用这些属性的属性。感觉就像我在这里遗漏了一些非常基本的东西,有什么想法吗?

4

2 回答 2

1

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

chef-client 在该机器上所做的是:

  1. 展开运行列表。

    它得到了myapp::copy_tls_certs配方和其他制作reverse_proxyandapp_server角色的人。(但它们现在并不重要)

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

    所以它读取myapp/attributes/default.rb并获取默认值node['myapp_provisioner']['node_name'] = 'test'

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

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

如果您希望您的覆盖属性位于预置的 EC2 机器中,则必须将覆盖行移动到其他一些配方,然后您可以将其包含到machine资源recipe属性中。或者可能是(我不知道,因为我以前从未见过这个machine资源)这个machine资源也有attribute属性,所以你可以通过它传递覆盖属性。

于 2017-02-27T21:09:53.803 回答
0

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

myapp::create 配方定义为:

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
于 2017-02-28T14:01:08.953 回答