加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 在Chef资源之间传递变量

发布时间:2020-12-17 03:23:12 所属栏目:百科 来源:网络整理
导读:我想向您展示我的用例,然后讨论可能的解决方案: 问题A: 我有2个食谱,“a”和“b”..“a”在我的文件系统上安装一些程序(比如“/usr/local/bin/stuff.sh”,食谱“b”需要运行这个并做输出的东西. 所以食谱“a”看起来像: execute "echo 'echo stuff' /usr/
我想向您展示我的用例,然后讨论可能的解决方案:

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

所以食谱“a”看起来像:

execute "echo 'echo stuff' > /usr/local/bin/stuff.sh"

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

和食谱“b”看起来像:

include_recipe "a"
var=`/usr/local/bin/stuff.sh`

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

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

user "#{node[:var]}"

碰巧,这不起作用..显然厨师运行所有不是资源的东西,然后运行资源,所以一旦我运行脚本厨师抱怨它无法编译,因为它首先尝试运行“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]}"

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

给大厨/ruby大师们:我如何解决问题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

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

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

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

>在Chef的编译阶段存在/usr/local/bin;
>要么:

> stuff.sh是可执行的;要么>通过shell执行它(例如:var =`sh /usr/local/bin / stuff.sh`

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读