ruby块不执行代码,只打印输出

ruby块不执行代码,只打印输出,ruby,chef-infra,chef-recipe,ruby-block,Ruby,Chef Infra,Chef Recipe,Ruby Block,我有两个厨师的食谱,我想在一个明确的顺序运行。首先是安装方法,然后是配置 以下是调用配方的代码: ruby_block "bowbridge_config" do block do run_context.include_recipe "ids::bowbridge_config" end action :nothing end ruby_block "bowbridge_install" do block do run_co

我有两个厨师的食谱,我想在一个明确的顺序运行。首先是安装方法,然后是配置

以下是调用配方的代码:

  ruby_block "bowbridge_config" do
    block do
      run_context.include_recipe "ids::bowbridge_config"
    end
    action :nothing
  end

  ruby_block "bowbridge_install" do
    block do
      run_context.include_recipe "sap-bowbridge::default"
    end
    notifies :run, 'ruby_block[bowbridge_config]', :delayed
  end
我在配置配方之前成功地执行了安装配方,但当配置配方执行时,仅打印打印

配置配方代码:

  mcaf_lib = find_file "/opt/bowbridge/libAVB*_mcaf.so"
  Chef::Log.info("==> bowbridge_config mcaf_lib is #{mcaf_lib}. Vsi file is #{vsi_file}")
  bb_cfg = File.basename(find_file "/opt/bowbridge/bbvsa*.cfg")
  Chef::Log.info("==> bowbridge_config recipe is triggered")

# Setup bowbridge config file
  directory "/etc/bowbridge" do
  end
  file "/etc/bowbridge/" + bb_cfg do
    owner 'root'
    group 'root'
    mode 0755
    content ::File.open("/opt/bowbridge/" + bb_cfg).read
    action :create
  end
  Chef::Log.info("==> bowbridge_config before link creation")
  link "/lib64/libvsa.so" do
    to "#{mcaf_lib}"
  end
上面的代码显示了此输出:

[2017-02-24T11:25:36+00:00] INFO: ruby_block[bowbridge_install] sending run action to ruby_block[bowbridge_config] (delayed) 
[2017-02-24T11:25:36+00:00] INFO: Processing ruby_block[bowbridge_config] action run (ids::default line 82) 
[2017-02-24T11:25:37+00:00] INFO: ==> bowbridge_config recipe is triggered 
[2017-02-24T11:25:37+00:00] INFO: ==> bowbridge_config before link creation 
[2017-02-24T11:25:37+00:00] INFO: ruby_block[bowbridge_config] called

没有创建/etc/bowbridge目录,也没有创建/lib64内的链接。我可能做错了什么?

从实际的两个ruby块移动到以下位置:

include_recipe "sap-bowbridge::default"
include_recipe "ids::bowbridge_config"
您将获得相同的效果,遵循运行列表顺序和包含顺序,因此不需要两个ruby_块的过于复杂


您的实际代码将在converge时间运行,由于通知延迟,配置配方在运行中运行得很晚。如果您需要,请编写一个运行列表,而不是围绕运行列表进行调整。

将实际的两个ruby块移动到以下位置:

include_recipe "sap-bowbridge::default"
include_recipe "ids::bowbridge_config"
您将获得相同的效果,遵循运行列表顺序和包含顺序,因此不需要两个ruby_块的过于复杂


您的实际代码将在converge时间运行,由于通知延迟,配置配方在运行中运行得很晚。如果您需要,请编写一个脚本,而不是围绕运行列表进行调整。

我不建议以这种方式使用ruby块,只需按照您希望Chef执行的顺序添加食谱即可。在这种情况下:

include_recipe 'sap-bowbridge::default'
include_recipe 'ids::bowbridge_config'
现在,如果您需要在Chef客户机执行期间获得一些值,那么可以使用延迟求值。厨师长的网站上有很多

例如,请检查以下内容:

link '/lib64/libvsa.so' do
    to lazy { find_file '/opt/bowbridge/libAVB*_mcaf.so' }
end
最后,尝试使用简单的引号,而不是双引号。如果不需要在文本中插入或添加变量,也与此相关,请使用:

"/etc/bowbridge/#{bb_cfg}"
而不是

"/etc/bowbridge/" + bb_cfg

我不建议以这种方式使用ruby块,只需按照您希望Chef执行的顺序添加食谱即可。在这种情况下:

include_recipe 'sap-bowbridge::default'
include_recipe 'ids::bowbridge_config'
现在,如果您需要在Chef客户机执行期间获得一些值,那么可以使用延迟求值。厨师长的网站上有很多

例如,请检查以下内容:

link '/lib64/libvsa.so' do
    to lazy { find_file '/opt/bowbridge/libAVB*_mcaf.so' }
end
最后,尝试使用简单的引号,而不是双引号。如果不需要在文本中插入或添加变量,也与此相关,请使用:

"/etc/bowbridge/#{bb_cfg}"
而不是

"/etc/bowbridge/" + bb_cfg


它遵循运行列表顺序,但bowbridge_配置配方的编译阶段将分配当时不存在的值,如“bb_cfg”。这里定义了这个问题。代码现在失败了,因为bb_cfg不存在,mcaf_lib为空。当然,它在ruby_块上下文中不存在。。。正如答案中所说的,如果您需要来自上一个配方的变量,请使用自定义资源(并且可能延迟其属性来填充值)。请看答案中的链接。(请不要添加文本,双引号中的文本插入就是为了:
“text#{variable}”
)这些变量不是以前配方的一部分。它们依赖于以前的配方来完成,以便能够正确分配。我编辑了我的问题以显示我是如何分配它们的。感谢您提供的关于文本插值的提示。这正是自定义资源的用途。从系统中获取系统状态/信息,并采取相应措施。在链接上点击一下,你会看到它会帮助你并消除一些麻烦。特别是在编译与收敛问题上。它尊重运行列表顺序,但bowbridge_配置配方的编译阶段将分配当时不存在的值,如“bb_cfg”。这里定义了这个问题。代码现在失败了,因为bb_cfg不存在,mcaf_lib为空。当然,它在ruby_块上下文中不存在。。。正如答案中所说的,如果您需要来自上一个配方的变量,请使用自定义资源(并且可能延迟其属性来填充值)。请看答案中的链接。(请不要添加文本,双引号中的文本插入就是为了:
“text#{variable}”
)这些变量不是以前配方的一部分。它们依赖于以前的配方来完成,以便能够正确分配。我编辑了我的问题以显示我是如何分配它们的。感谢您提供的关于文本插值的提示。这正是自定义资源的用途。从系统中获取系统状态/信息,并采取相应措施。在链接上点击一下,你会看到它会帮助你并消除一些麻烦。特别是在编译与收敛问题上。如果您不打算向资源添加任何特定选项,如目录'/etc/bowbridge',则不必添加do/end块,只需保留如下内容:
directory'/etc/bowbridge'
如果您不打算向资源添加任何特定选项,如目录'/etc/bowbridge',您不必添加do/end块,只需保留如下内容:
directory'/etc/bowbridge'
,这看起来是一种简洁的方法,但稍后我需要在bash模板中使用#{mcaf_lib}。我可以使用“lazy”来分配变量吗?例如,mcaf_lib lazy{find_file'/opt/bowbridge/libAVB*_mcaf.so'}这是我在评论中粘贴的链接中的一个示例<代码>模板'/tmp/canvey_island.txt'do source'canvey_island.txt.erb'变量(lazy{{{:canvey_island=>node.run_state['sea_power']}})结束谢谢@Navarro。很抱歉格式错误:
bash'Extract vsi.properties'do cwd“#{vsi_tmp}”变量(lazy{{{:mcaf_lib=>Dir['/opt/bowbridge/libAVB*.\u mcaf.so'][0]}代码当然这是一个无法识别的方法。对于
bash资源
,没有“
变量
”选项,如中所示。尽量不要在Chef中使用“bash your way”,并为此任务创建自定义资源/方法。这看起来是一种简洁的方法,但我需要稍后在bash模板中使用#{mcaf_lib}。我可以用“lazy”吗