在厨师资源之间传递变量

Shi*_*ude 5 ruby variables chef-infra chef-solo

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

问题A:我有2个食谱,"a"和"b".."a"在我的文件系统上安装一些程序(比如"/usr/local/bin/stuff.sh"和食谱"b"需要运行这和输出做了些什么.

所以食谱"a"看起来像:

execute "echo 'echo stuff' > /usr/local/bin/stuff.sh" 
Run Code Online (Sandbox Code Playgroud)

(该脚本只是回显(st)"stuff"到stdout)

和食谱"b"看起来像:

include_recipe "a"
var=`/usr/local/bin/stuff.sh` 
Run Code Online (Sandbox Code Playgroud)

(注意反引号,var应该包含stuff)

现在我需要用它做一些事情,例如用这个用户名创建一个用户.所以在脚本"b"我添加

user "#{node[:var]}"
Run Code Online (Sandbox Code Playgroud)

碰巧,这不起作用..显然厨师运行所有不是资源的东西,然后运行资源,所以一旦我运行脚本厨师抱怨它无法编译,因为它首先尝试运行"var = ..."在配方行"b"并失败,因为配方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]}"
Run Code Online (Sandbox Code Playgroud)

但是,事实证明变量(var)没有从"ruby_block"传递给"user"而且它仍然是空的.无论我试图用它做什么杂耍,我都失败了(或者我只是没找到正确的杂耍方法)

给大厨/红宝石大师们:我如何解决问题A?我如何解决问题B?

cas*_*eal 6

您已经使用Ruby块解决了问题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
Run Code Online (Sandbox Code Playgroud)

您还可以通过在编译阶段创建文件来解决问题A.

execute "echo 'echo stuff' > /usr/local/bin/stuff.sh" do
  action :nothing
end.run_action(:run)
Run Code Online (Sandbox Code Playgroud)

如果遵循此行动,请确保:

  • /usr/local/bin 在Chef的编译阶段存在;
  • 或者:
    • stuff.sh是可执行的; 要么
    • 通过shell执行它(例如: var=`sh /usr/local/bin/stuff.sh`