2016-06-29 8 views
0

私は秘密の値を得るためにルビーブロックを使用しています。しかし、秘密がノード属性として保存されないように変更したい。それ以外の場合は、シェフの属性を表示するときに表示されます。シェフの秘密のデータバッグから秘密の値を取得する

ruby_block 'load_acl_master_token' do 
    block do 
    secret = Chef::EncryptedDataBagItem.load_secret("/etc/chef/app_encrypted_data_bag_secret") 
    acl_master_token = Chef::EncryptedDataBagItem.load("app_consul_secrets", "app_consul_acl_mastertoken", secret) 
    node.set['cluster']['acl_master_token'] = acl_master_token['keyval'] 
    end 
    only_if { node['cluster']['acl'] == true } 
end 

bootstrap_json = Chef::JSONCompat.to_json_pretty(node['consul']['config'].to_hash) 
rb_bootstrap_hash = JSON.parse(bootstrap_json) 

require "active_support/core_ext/hash" 

rb_cluster_hash_acl_master_token = rb_bootstrap_hash.deep_merge({ "acl_master_token" => acl_master_token['uuidgen'] }) 

もっと効率的な方法で同じコードを書くことができますか?

コードは、私が

NameError 
--------- 
No resource, method, or local variable named acl_master_token' for Chef::Recipe "server"' ` 

iがlazy attributeとしてacl_master_token['uuidgen']を行う必要があり、このエラーを取得し、

rb_cluster_hash_acl_master_token = rb_bootstrap_hash.deep_merge({ "acl_master_token" => acl_master_token['uuidgen'] }) 

以下のように見えます。はいの場合、どのように見えるでしょうか?

答えて

0

ラムダを使用して、シェフと任意の変数を遅延評価することができます。

rb_cluster_hash_acl_master_token = lambda { rb_cluster_hash_acl_policy.deep_merge({ "acl_master_token" => acl_master_token['uuidgen'] }) } 
0

代わりにデータバッグを使用するために現在ノード属性を使用しているコードを書き直すだけですか?効率は本当に問題ではなく、あなたが言ったことをするだけです。

+0

私が削除した場合、 'node.set [ 'クラスタ'] [ 'acl_master_token'] = acl_master_token [ 'KEYVAL']'と直接使う 'acl_master_token [ 'KEYVAL']'私は時エラーをコンパイルし得ます。何をすべきかを助けてください – meallhour

+0

変数にアクセスするスコープに変数が設定されていることを確認する必要があります。コードがどのように見えるかわからなければ、私はあまり言い表せません。 – coderanger

+0

コード なしリソース--------- NameError '私はこのエラーを取得し、({[ 'はuuidgen'] acl_master_token "acl_master_token"=>})' rb_cluster_hash_acl_master_token = rb_cluster_hash_acl_policy.deep_merge以下のように見えると ' '' Chef :: Recipe 'server "' ' – meallhour