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?
您已经使用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是可执行的; 要么var=`sh /usr/local/bin/stuff.sh`