2017-02-23 15 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は次のように定義されています。私は以前Chef Environment not overriding recipe called inside a machine resourceとして質問を題していたが、私がいることを実感するようになった

を更新しました

node_name = node['myapp_provisioner']['node_name'] 

# The line below prints the value from default attributes "test" 
puts "cert path ---------------> #{node_name}" 

問題は環境に関連するものではなく、マシンリソース内でこれらの属性をオーバーライドして使用する属性に関するものです。私はここで何か非常に根本的な何かを見逃しているように感じる?

+0

不明'copy_tls_certs'レシピ。これは、慎重に行うつもりでない限り、物事を修正してはならない理由です。P – coderanger

+0

@coderanger、Thanskが帰ってきた、私は物事を修正することの意味に従わず、意図的に何かを修正しようとしていませんでした(私はあなたがredactによって何を意味するかによると思います)。とにかく、問題が環境を適用することではなく、マシンリソースの実行リスト内のオーバーライドされた属性を使用していることを認識した後で、私は質問を更新しました –

答えて

1

答えは簡単です。このレシピは実行リストにないため、myapp::dev_createレシピではnode['myapp_provisioner']['node_name']がオーバーライドされています。シェフ・クライアントがそのマシン上で何

は次のとおりです。

  1. は実行リストを展開します。

    のレシピと、reverse_proxyapp_serverの役割を果たすレシピを取得します。 (今は重要ではありません)

  2. すべて拡張された実行リストのcookbookの属性ファイルが読み込まれます。

    だから、myapp/attributes/default.rbを読み取り、node['myapp_provisioner']['node_name'] = 'test'

  3. のデフォルト値を取得し、それはリソースでなければ、それは、実行リスト内のレシピを経て、リソースのコレクションを作成したり、Rubyのコードを実行します。あなたのケースでは

    それはそれはあなたがオーバーライドされた属性がプロビジョニングEC2のマシンになりたい場合は、上書きラインを移動する必要があります:)

あるものだから、それは、myapp::copy_tls_certsを実行し、testを印刷します他のレシピに、machineリソースrecipe属性に含めることができます。または、私はこのmachineリソースの前にこれを見たことがないので、私は知らないかもしれません。このmachineリソースもまたattributeプロパティを持っているので、オーバーライド属性を渡すことができます。

+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 
関連する問題