在厨师资源之间传递变量

问题描述 投票:6回答:2

我想向您展示我的用例,然后讨论可能的解决方案:

问题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 variables chef chef-solo
2个回答
6
投票

您已经用Ruby块解决了问题A。


0
投票

实际上,有几种方法可以解决您遇到的问题。

© www.soinside.com 2019 - 2024. All rights reserved.