Chef infra 我如何安装一个程序,然后在同一个Chef运行中执行它?

Chef infra 我如何安装一个程序,然后在同一个Chef运行中执行它?,chef-infra,Chef Infra,我正在使用Chef安装serf,然后我需要执行serf members-format=JSON。我的代码如下所示: include_recipe "mycookbook::serf" log `serf members -format=json` 但是,日志中没有打印任何内容。重新运行chef运行(安装serf后)会在日志中生成JSON输出 为什么它不能第一次得到信息?在调用serf成员之前,我们如何确保程序已安装?在Chef中计算代码的准确时间可能有点棘手。这是一个多重过程。First ch

我正在使用Chef安装serf,然后我需要执行
serf members-format=JSON
。我的代码如下所示:

include_recipe "mycookbook::serf"
log `serf members -format=json`
但是,日志中没有打印任何内容。重新运行chef运行(安装
serf
后)会在日志中生成JSON输出


为什么它不能第一次得到信息?在调用
serf成员之前,我们如何确保程序已安装?

在Chef中计算代码的准确时间可能有点棘手。这是一个多重过程。First chef评估其运行列表中的所有烹饪书,以建立一个要做的事情列表。如果您编写“原始ruby”,它将在这个阶段得到评估

因此,在您的情况下,当您向外抛出以运行serf二进制文件时,它还不可用

有两种方法可以处理这个问题,最简单的方法是在chef运行结束时将serf命令放入报表处理程序中

如果在运行期间需要serf结果,则需要指定运行serf命令依赖于资源。最简单的方法是将serf命令放在ruby_块资源中


这确保了ruby将在初始传递和serf安装cookbook之后执行

您想将其放入
ruby\u块中

include_recipe "mycookbook::serf"
ruby_block do
  block do
    Chef::Log.info `serf members -format=json`
  end
end

这是可行的,但是我遇到了在不同上下文中访问变量的问题。显然,
ruby_块
中的变量只是块本身的局部变量?我很确定情况并非如此。你能帮我寄密码吗?