我想向您展示我的用例,然后讨论可能的解决方案:
问题A:我有2个配方,“ a”和“ b” ..“ a”在我的文件系统上安装了一些程序(例如,在“ /usr/local/bin/stuff.sh”中,配方“ b”需要运行此程序并执行输出的东西。
所以配方“ a”看起来像:
execute "echo 'echo stuff' > /usr/local/bin/stuff.sh"
(脚本只是将“东西”回显到stdout)
和配方“ b”看起来像:
include_recipe "a"
var=`/usr/local/bin/stuff.sh`
((请注意反引号,var
应包含stuff
)] >>
现在,我需要对此进行处理,例如,使用该用户名创建一个用户。因此在脚本“ b”中我添加
user "#{node[:var]}"
碰巧,这是行不通的。显然,chef运行不是资源的所有内容,然后才运行资源,所以一旦我运行脚本,chef就会抱怨它无法编译,因为它首先尝试运行“配方“ b”处的var = ...”行失败,因为配方a处的“执行...”尚未运行,因此“ stuff.sh”脚本尚不存在。不用说,这非常烦人,因为它破坏了我开始使用时所承诺的“厨师从上到下按顺序运行所有内容”。但是,我不是很挑剔,所以我开始寻找解决此问题的替代方法,因此:
问题B:我遇到过“ ruby_block”的想法。显然,这是一种资源,因此将与其他资源一起进行评估。我说好,然后我想创建脚本,将输出保存在“ ruby_block”中,然后将其传递给“ user”。因此配方“ 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?
我想向您展示我的用例,然后讨论可能的解决方案:问题A:我有两个配方,“ a”和“ b”。“ a”在我的文件系统上安装了一些程序(例如,在“ / usr”中/local/bin/stuff.sh“和...
您已经用Ruby块解决了问题A。
实际上,有几种方法可以解决您遇到的问题。