在厨师食谱中寻找类似.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的参数必须是字符串任何提示
答案 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
<强>然而强>
如果您不需要执行Ruby代码,请考虑使用execute
或bash
资源。
请记住,如果要围绕它构建某种循环,则必须具有唯一的资源名称。一种简单的方法是在名称ruby_block "something unique per loop iteration" do ... end
我真正不理解的是您的退出代码2.这是一个错误代码。每次都会让厨师抛出异常。 (shell_out!
如果退出代码,则会抛出异常!= 0,请参阅https://github.com/chef/chef/blob/master/lib/chef/mixin/shell_out.rb#L24-L28)
资源将在每次厨师运行时执行。这可能不符合您的利益。考虑添加一个保护(测试),以防止不必要的执行,请参阅https://docs.chef.io/resource_common.html#guards