4

我是 Chef 和 Ruby 的新手

我需要在命令行上将两个变量传递给 Chef,并让这些变量在配方中可用。

我如何捕获这些值并将它们放入 Chef 中?

我需要这样的东西:

before_deploy command 
  execute param1 param2
deploy{ param1/param2}

在运行时从命令行从何处获取它们param1的值。param2

4

3 回答 3

7

当您通过运行配置机器时

chef-solo

或者

chef-client

您不能为这些命令提供任何对配方可见的参数。厨师食谱仅适用于属性。好事(或不那么好)是可以从许多不同的地方设置属性:角色、节点、环境和 json 文件。

最接近您要求的解决方法是

  • 在机器上创建一个 json 文件
  • 运行时通过它chef-clientchef-solo
  • 在配方中使用属性

例如:apache 配置。

创建 json 文件:my_attrs.json

{ 
  "apache": {
    "listen_port": "81",
    "listen_path": "/myapp"
  }
}

然后在你的食谱中使用它们:

node[:apache][:listen_port]
node[:apache][:listen_path]

运行chef-clientchef-solo-j标志。

chef-solo -j my_attrs.json

如果 my_attrs.json 在某个远程服务器上,那么您可以提供一个 url。

chef-solo -j http://remote.host/path/my_attrs.json
于 2013-02-06T18:57:15.687 回答
0

如果您的文件名为 example.rb

ruby example.rb argument1 argument2

然后

ARGV.each do|a|
  puts "Argument: #{a}"
end

输出:

Argument: argument1
Argument: argument2
于 2013-02-06T14:04:36.147 回答
0

您可以通过调用命令在配方中设置变量

nodename = `cat /etc/chef/client.rb | grep "node_name" | sed -e 's/\<node_name\>//g' | sed '/^$/d;s/[[:blank:]]//g' | sed 's/\"//g'`

然后将变量用于其他厨师块

execute "echo nodename for node #{nodename}"
 command "echo #{nodename}"
 action :run
 only_if {nodename == "node1"}
end

这将从 client.rb 文件中获取 node.name 属性,而无需向厨师服务器询问。

于 2014-12-17T23:23:27.987 回答