我想向您展示我的用例,然后讨论可能的解决方案:
问题一: 我有 2 个 Recipe ,“a”和“b”..“a”在我的文件系统上安装了一些程序(比如在“/usr/local/bin/stuff.sh”和 Recipe “b”需要运行它并执行输出的东西。
所以 Recipe “a”看起来像这样:
execute "echo 'echo stuff' > /usr/local/bin/stuff.sh"
(脚本只是将“东西”回显到标准输出)
Recipe “b”看起来像这样:
include_recipe "a"
var=`/usr/local/bin/stuff.sh`
(注意反引号,var
应该包含stuff
)
现在我需要用它做点什么,例如用这个用户名创建一个用户。所以在脚本“b”我添加
user "#{node[:var]}"
碰巧,这是行不通的.. 显然 chef 运行了所有不是资源的东西,然后才运行资源,所以我一运行脚本 chef 就提示它无法编译,因为它首先尝试运行配方“b”中的“var=...”行失败,因为配方a 中的“执行...”尚未运行,因此“stuff.sh”脚本尚不存在。 不用说,这非常烦人,因为它打破了我开始使用它时 promise 的“Chef 从上到下按顺序运行所有内容”。 然而,我不是很挑剔,所以我开始寻找解决这个问题的替代方案,所以:
问题 B:我遇到过“ruby_block”的想法。显然,这是一种资源,因此将与其他资源一起进行评估。我说好的,然后我想创建脚本,在“ruby_block”中获取输出,然后将其传递给“用户”。所以 Recipe “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”,它仍然是空的。无论我尝试用它做什么杂耍,我都失败了(或者也许我只是没有找到正确的杂耍方法)
致周围的 Chef/ ruby 大师:我如何解决问题 A?我如何解决问题 B?
最佳答案
您已经用 Ruby block 解决了问题 A。
现在你必须用类似的方法解决问题 B:
ruby_block "create user" do
block do
user = Chef::Resource::User.new(node[:var], run_context)
user.shell '/bin/bash' # Set parameters using this syntax
user.run_action :create
user.run_action :manage # Run multiple actions (if needed) by declaring them sequentially
end
end
您还可以通过在编译阶段创建文件来解决问题 A:
execute "echo 'echo stuff' > /usr/local/bin/stuff.sh" do
action :nothing
end.run_action(:run)
如果遵循此操作过程,请确保:
/usr/local/bin
存在于Chef的编译阶段;- 要么:
stuff.sh
是可执行的;或者- 通过 shell 执行它(例如:
var=`sh/usr/local/bin/stuff.sh`
关于ruby - 在 Chef 资源之间传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17696991/