将值从 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']

因此,到那时,新密码资源还没有 运行。

我尝试了很多堆栈溢出建议,例如:

  1. 将这三行放在 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

使用上述方法,值仍然为空

  1. 尝试使用 lazy 值并调用该值。

  2. 将值从一个 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