将值从 ruby 块传递到 Chef 中的资源
Passing the value from a ruby block to a resource in chef
我正在编写一个 chef 资源,它将生成一个密码,我正在使用输入列表在食谱中调用该资源。
以下是我的场景:执行我的资源后,将在文件夹中生成一组新密码,我想检索新生成的密码。但是我无法检索该密码,因为我尝试检索的值正在收敛阶段执行。
解释我的场景的简单代码块:
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
使用上述方法,值仍然为空
尝试使用 lazy 值并调用该值。
将值从一个 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" 值?
您可以像下面这样使用惰性属性:-
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 lazy { JSON.parse(File.read("/tmp/password.json"))['rase_wlsadmin_pwd'] }
end
模板资源可以写成:-
template "#{Chef::Config[:file_cache_path]}/domain.properties" do
source 'domain_properties.erb'
variables (lazy{{ :domain_name => "#{domain_name}",
:admin_url => "#{admin_url}",
:new_wls_password => JSON.parse(File.read("/tmp/password.json"))['rase_wlsadmin_pwd'] }})
end
输出:-
* template[/tmp/kitchen/cache/domain.properties] action create
- create new file /tmp/kitchen/cache/domain.properties
- update content in file /tmp/kitchen/cache/domain.properties from none to fa22e0
--- /tmp/kitchen/cache/domain.properties 2017-01-12 03:30:13.002968715 +0000
+++ /tmp/kitchen/cache/.chef-domain20170112-11387-1ytkyk2.properties 2017-01-12 03:30:13.002968715 +0000
@@ -1 +1,4 @@
+domain_name= mmm
+admin_url= nnn
+new_wls_password= xH#3zIS9Q4Hc#B
我正在编写一个 chef 资源,它将生成一个密码,我正在使用输入列表在食谱中调用该资源。
以下是我的场景:执行我的资源后,将在文件夹中生成一组新密码,我想检索新生成的密码。但是我无法检索该密码,因为我尝试检索的值正在收敛阶段执行。
解释我的场景的简单代码块:
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
使用上述方法,值仍然为空
尝试使用 lazy 值并调用该值。
将值从一个 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" 值?
您可以像下面这样使用惰性属性:-
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 lazy { JSON.parse(File.read("/tmp/password.json"))['rase_wlsadmin_pwd'] }
end
模板资源可以写成:-
template "#{Chef::Config[:file_cache_path]}/domain.properties" do
source 'domain_properties.erb'
variables (lazy{{ :domain_name => "#{domain_name}",
:admin_url => "#{admin_url}",
:new_wls_password => JSON.parse(File.read("/tmp/password.json"))['rase_wlsadmin_pwd'] }})
end
输出:-
* template[/tmp/kitchen/cache/domain.properties] action create
- create new file /tmp/kitchen/cache/domain.properties
- update content in file /tmp/kitchen/cache/domain.properties from none to fa22e0
--- /tmp/kitchen/cache/domain.properties 2017-01-12 03:30:13.002968715 +0000
+++ /tmp/kitchen/cache/.chef-domain20170112-11387-1ytkyk2.properties 2017-01-12 03:30:13.002968715 +0000
@@ -1 +1,4 @@
+domain_name= mmm
+admin_url= nnn
+new_wls_password= xH#3zIS9Q4Hc#B