【问题标题】:Passing the value from a ruby block to a resource in chef将值从红宝石块传递到厨师中的资源
【发布时间】: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']

所以,到那时,新密码资源还没有运行。

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

  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. 尝试使用惰性值并调用该值。

  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" 值?

【问题讨论】:

  • 如果您得到空值,可能有几个原因。请同时发布“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


【解决方案1】:

你可以像下面这样使用惰性属性:-

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

【讨论】:

  • 这对我有用..!!!非常感谢@Mrigesh Priyadarshi。您能否帮助我了解如何对模板执行相同操作-> 我需要将相同的值传递给模板,如下模板“#{Chef::Config[:file_cache_path]}/domain.properties”做源'domain_properties.erb' 变量 ({ :domain_name => "#{domain_name}", :admin_url => "#{admin_url}", :new_wls_password => "#{new_wls_password}" }) --> 这里我想使用那个值来自同一个 json 文件的一些东西。请帮我解决这个问题。
  • 请更新问题,从评论中很难阅读
  • @HarishPC - 请也给答案投票,这样它也可以对其他人有所帮助。
  • 在尝试使用模板 TypeError 的方法后出现以下错误 --------- 没有将 nil 隐式转换为 String 后跟变量 #<:delayedevaluator:0x00000004a11c70>
  • 我已经测试了代码,我已经给出了,它工作正常(更新输出)。就错误而言,它需要更多的调试,但从表面上看,一些预期的字符串似乎是 NIL。
猜你喜欢
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2016-01-02
相关资源
最近更新 更多