在 Chef Recipe 中寻找类似于 .Net 字符串格式的内容,即。
string phone = String.format("phone: {0}",_phone);
我有一个 Chef Recipe ,我需要用其中的 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 的参数必须是字符串 任何提示表示赞赏
最佳答案
Chef 分两个阶段运行:
编译并执行(见 https://www.chef.io/blog/2013/09/04/demystifying-common-idioms-in-chef-recipes/ 了解更多细节)。
您对 a
的变量赋值发生在编译时,例如当 Chef 加载所有 Recipe 时。 ruby block 将在收敛时以执行模式执行,无法访问变量 a
.
所以最简单的解决方案可能是将属性放入 ruby block 中:
ruby_block "run command with argument #{node['some_var']}" do
block do
shell_out!("node mycommand.js #{node['some_var']}")
end
end
但是:
execute
或 bash
而是资源。 ruby_block "something unique per loop iteration" do ... end
中加入一些独特的东西。 shell_out!
如果退出代码 != 0 则抛出异常,参见 https://github.com/chef/chef/blob/master/lib/chef/mixin/shell_out.rb#L24-L28 ) 关于linux - Chef/Bash 配方中的 String.Format 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30617359/