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

标签 ruby variables chef-infra chef-solo

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

问题一: 我有 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/

相关文章:

linux - ~ 被 bash 中的变量值替换

chef-infra - 如何使用 Serverspec 测试其他用户安装的实用程序?

ruby - 如何将 shell 脚本评估为 Ruby 哈希?

ruby - 模块扩展 Ruby 中的其他模块

ruby - 将 MKStorekit 与 Rubymotion 结合使用

sql - 运算符不存在 : timestamp without time zone ~~* unknown ruby code

php - 显示动态结果 PHP mySQL

c - 在 C 中访问函数外部的结构变量

linux - Linux 下的curl命令报错

ruby - 将用户写入 Chef Recipe 中的 .htpasswd