node.run_state与ruby文件chef中的全局varibale之间的区别

时间:2017-03-29 01:54:08

标签: ruby chef chef-recipe

想知道全局变量与node.run_state

之间使用的差异和推荐方法

test.rb

dbpassword=''


ruby_block "load_databag_secret" do
  block do
    secret_key = Chef::EncryptedDataBagItem.load_secret("/home/test/db_key")
        db_keys = Chef::EncryptedDataBagItem.load("mydatabag", "mydatabagitem", secret_key) 
    end
    dbpassword=db_keys['DB_PASSWORD']
node.run_state['password']=db_keys['DB_PASSWORD']
      end
    end

execute "Enable on hosts" do

  command lazy { "echo #{node.run_state['password']} > /home/app/db.txt" }
end

    template "/config/properties" do
            source "properties.erb"
            variables(lazy {
                         :db_password => { node.run_state['password'] },

                      })

或使用node.run_state ['password']代替此.rb文件中的全局变量

现在执行命令工作得很好能够在回显文件db.txt上看到密码,就像我在模板变量中使用lazy一样,它在模板中输出为db_password的空值。

1 个答案:

答案 0 :(得分:2)

所以有几个问题,首先你所拥有的不是全局变量,它是一个局部变量。 Ruby中的Globals以$开头。其次,你不能从像Ruby那样的封闭范围中分配局部变量(或者实际上,在大多数语言中)。该赋值只创建一个作用于块的第二个dbpassword局部变量。但是,您可以使用变异而不是变量赋值(例如dbpassword << whatever)。第三,你实际上不能将lazy深深地用在变量哈希中,就像那样,它必须处于顶层。第四,如果你只使用你曾经喜欢的那个值,那么你可以直接进行所有这些:

template "/config/properties" do
  source "properties.erb"
  variables lazy { 
    secret_key = Chef::EncryptedDataBagItem.load_secret("/home/test/db_key")
    db_keys = Chef::EncryptedDataBagItem.load("mydatabag", "mydatabagitem", secret_key)
    {db_password: db_keys['DB_PASSWORD']}
  }
end

只是为了完整性以防其他人通过谷歌找到这个,真正的全局变量最大的区别是单元测试,运行状态与收敛相关联,所以单个单元测试不会看到彼此的值总是很好(尽管当然你可以在代码中解决这个问题。)