2017-02-23 50 views
1

我有供應EC2實例,我試圖以應用的環境,這是我作爲運行配方:廚師 - 使用內部機資源內應用的食譜被覆蓋的屬性

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

默認

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

的MyApp的:: dev_create配方被定義爲:

作爲.RB屬性文件中定義
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

還不清楚,如果這是一個新版本失敗,但你直上使用的不同的屬性'copy_tls_certs'配方。這就是爲什麼除非你要仔細去做,否則你不應該對它進行編輯:P – coderanger

+0

@coderanger,Thansk爲了迴歸,我不遵循你的意思是關於編輯事物,我並不是故意試圖編輯任何東西(我想你取決於你的意思是編輯)。無論如何,我已經更新了問題後,我意識到問題不是關於應用環境,而是關於在機器資源的運行列表中使用重寫的屬性 –

回答

1

答案很簡單。您的EC2機器不知道在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,因爲這是它是什麼:)

如果你希望你重寫屬性是在配置的EC2的機器,你必須移動覆蓋線到其他一些配方,然後您可以將其添加到machine資源recipe屬性中。或者可能是(我不知道,因爲我之前從未見過這個machine資源)這個machine資源也有attribute屬性,所以你可以通過override屬性來傳遞它。

+0

感謝回來,我看到機器上的屬性後有同樣的想法,我結束了將覆蓋屬性傳遞給機器的屬性屬性,該屬性使用這些覆蓋值創建新的正常屬性,不管這是否是正確的方式,我不知道 –

0

對於下一個會經歷類似問題的人來說,這就是我最終的結果。

的MYAPP ::創建配方定義爲:

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 -z -o 'brms::reate' -E DEV