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