我想向您展示我的用例,然后讨论可能的解决方案:
问题 A:我有 2 个配方,“a”和“b”。“a”在我的文件系统上安装了一些程序(比如在“/usr/local/bin/stuff.sh”和配方“b”需要运行这并对输出做一些事情。
所以配方“a”看起来像:
execute "echo 'echo stuff' > /usr/local/bin/stuff.sh"
(脚本只是将“stuff”回显到标准输出)
配方“b”看起来像:
include_recipe "a"
var=`/usr/local/bin/stuff.sh`
(注意反引号,var
应该包含stuff
)
现在我需要用它做点什么,例如用这个用户名创建一个用户。所以在脚本“b”我添加
user "#{node[:var]}"
碰巧,这不起作用..显然厨师运行所有不是资源的东西,然后才运行资源,所以一旦我运行脚本厨师抱怨它无法编译,因为它首先尝试运行“var = ...” 配方“b”中的行并失败,因为配方 a 中的“执行 ...”尚未运行,因此“stuff.sh”脚本尚不存在。不用说,这非常烦人,因为它打破了我在开始使用它时承诺的“厨师从上到下按顺序运行一切”。但是,我不是很挑剔,所以我开始寻找这个问题的替代解决方案,所以:
问题 B:我遇到过“ruby_block”的想法。显然,这是一种资源,因此将与其他资源一起评估。我说好的,然后我想创建脚本,在“ruby_block”中获取输出,然后将其传递给“用户”。所以配方“b”现在看起来像:
include_recipe "a"
ruby_block "a_block" do
block do
node.default[:var] = `/usr/local/bin/stuff.sh`
end
end
user "#{node[:var]}"
然而,事实证明变量 ( var
) 没有从“ruby_block”传递到“user”,它仍然是空的。无论我试图用它做什么杂耍我都失败了(或者我只是没有找到正确的杂耍方法)
致周围的厨师/红宝石大师:我如何解决问题 A?如何解决问题 B?