Chef / Bash配方中String.Format的等价物

时间:2015-06-03 10:21:39

标签: linux chef

在厨师食谱中寻找类似.Net字符串格式的东西,即

string phone = String.format("phone: {0}",_phone);

我有一个厨师配方,我需要建立一个包含30个这些参数的命令字符串,所以希望有一个整洁的方式来构建字符串,原则上我这样做

a=node['some_var'].to_s
ruby_block "run command" do
  block do
    cmd = shell_out!("node mycommand.js #{a}; exit 2;")           
  end
end

当我尝试这个时,我收到了错误

对path.join的参数必须是字符串任何提示

1 个答案:

答案 0 :(得分:0)

Chef分两个阶段运行:

编译并执行(有关详细信息,请参阅https://www.chef.io/blog/2013/09/04/demystifying-common-idioms-in-chef-recipes/)。

您对a的变量分配发生在编译时,例如当厨师加载所有食谱。 ruby块将在收敛时以执行模式执行,无法访问变量a

所以最简单的解决方案可能是将属性放入ruby块中:

   ruby_block "run command with argument #{node['some_var']}" do
     block do
       shell_out!("node mycommand.js #{node['some_var']}")
     end
   end

<强>然而

  1. 如果您不需要执行Ruby代码,请考虑使用executebash资源。

  2. 请记住,如果要围绕它构建某种循环,则必须具有唯一的资源名称。一种简单的方法是在名称ruby_block "something unique per loop iteration" do ... end

  3. 中加入一些独特的东西
  4. 我真正不理解的是您的退出代码2.这是一个错误代码。每次都会让厨师抛出异常。 (shell_out!如果退出代码,则会抛出异常!= 0,请参阅https://github.com/chef/chef/blob/master/lib/chef/mixin/shell_out.rb#L24-L28

  5. 资源将在每次厨师运行时执行。这可能不符合您的利益。考虑添加一个保护(测试),以防止不必要的执行,请参阅https://docs.chef.io/resource_common.html#guards