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-клиент делает:

  1. Разверните список запуска.

    Это получает myapp::copy_tls_certs рецепт и те другие, которые делают reverse_proxy а также app_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 свойство, так что вы можете передать атрибут 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
Другие вопросы по тегам