Chef - использование переопределенных атрибутов внутри рецептов, применяемых внутри ресурса машины
У меня есть рецепт для подготовки экземпляра 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 ответа
Ответ прост. Ваша машина EC2 понятия не имеет о node['myapp_provisioner']['node_name']
переопределяется в myapp::dev_create
рецепт, потому что этот рецепт не находится в списке выполнения.
На этом компьютере chef-клиент делает:
Разверните список запуска.
Это получает
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 через него.
Для следующего человека, который столкнется с подобной проблемой, это то, с чем я в конечном итоге столкнулся.
Рецепт 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