【发布时间】:2020-02-12 01:07:56
【问题描述】:
我正在编写一个厨师资源,它将生成一个密码,并且我在带有输入列表的食谱中调用该资源。
以下是我的场景:一旦我的资源被执行,一组新密码将在文件夹中生成,我想检索新生成的密码。但我无法检索该密码,因为我尝试检索的值是在收敛阶段执行的。
解释我的场景的简单代码块:
Chef::Log.info("Creating new keys")
create_password 'New Password is being generated' do
action :change_passwords
password_util_dir node[:password][:passwd_util_dir]
rgbu_chef node[:password][:rgbu_chef]
old_data_bags node[:password][:old_data_bags]
new_data_bags node[:password][:new_data_bags]
end
上面的代码将在文件夹中创建新密码。
稍后,我尝试通过 JSON 解析器获取密码:
text =::File.read("#{new_password_dir}")
data_hash = JSON.parse(text)
new_wls_password = data_hash['rase_wlsadmin_pwd']
#{new_password_dir} 是新创建的 password.json 文件的目录位置。
我正在尝试在另一个资源中使用“new_wls_password”的值,如下所示:
Chef::Log.info("Updating WLSADMIN Password")
passwd_backup 'Updating wlsadmin password' do
action :update_wlsadmin
osuser node[:password][:wls_config_user]
usergroup node[:password][:wls_install_group]
new_wls_password "#{new_wls_password}"
end
这里,我要找回的新密码是空的,因为首先执行了以下三行:
text =::File.read("#{new_password_dir}")
data_hash = JSON.parse(text)
new_wls_password = data_hash['rase_wlsadmin_pwd']
所以,到那时,新密码资源还没有运行。
我尝试了许多堆栈溢出建议,例如:
- 像这样将这三行放在一个 ruby_block 中
ruby_block "new_password" do
block do
text =::File.read("#{new_password_dir}")
data_hash = JSON.parse(text)
node.set[:new_wls_password] = data_hash['rase_wlsadmin_pwd']
end
end
然后我尝试将值提取到资源中,如下所示
Chef::Log.info("Updating WLSADMIN Password")
passwd_backup 'Updating wlsadmin password' do
action :update_wlsadmin
osuser node[:password][:wls_config_user]
usergroup node[:password][:wls_install_group]
new_wls_password "#{node[:new_wls_password]"
end
通过上述方法,值仍然为空
尝试使用惰性值并调用该值。
将值从一个 ruby 块传递到另一个 ruby 块,我可以这样做,但不能使用资源。
拜托,你能帮忙吗?
编辑#1: 我需要将资源中的值传递给模板。 运行以下资源后,类似这样:
Chef::Log.info("Creating new keys")
create_password 'New Password is being generated' do
action :change_passwords
password_util_dir node[:password][:passwd_util_dir]
rgbu_chef node[:password][:rgbu_chef]
old_data_bags node[:password][:old_data_bags]
new_data_bags node[:password][:new_data_bags]
end
将在文件夹中生成一组新密码,例如 /tmp/password.json 文件。
在上面的资源执行之后,我正在编写如下模板:
template "#{Chef::Config[:file_cache_path]}/domain.properties" do
source 'domain_properties.erb'
variables
({ :domain_name => "#{domain_name}",
:admin_url => "#{admin_url}",
:new_wls_password => "#{new_wls_password}" })
end
在这里,如何解析新创建的 "new_wls_password" 值?
【问题讨论】:
-
如果您得到空值,可能有几个原因。请同时发布“password.json”条目。另外,为您的资源
create_password创建一个带有密码的文件是否需要时间? -
@ Mrigesh Priyadarshi:password.json 文件具有如下值 { {“id”:“ris_credentials”,“mrep_rcu_pwd”:“dy_06nrJAIhUud”,“navteq_schema_pwd”:“xH#3zIS9Q4Hc#B” , "obiee_admin_pwd": "tY#98njEIIp6Ui", } 而且它从来没有花太多时间来生成密码。我理解的问题是执行顺序。在执行“create_password”资源之前,值是在编译阶段执行的- new_wls_password = data_hash['rase_wlsadmin_pwd']
标签: json ruby resources chef-recipe