如何在命令行中捕获值并添加到配方?

时间:2013-02-06 13:56:06

标签: ruby chef

我是Chef和Ruby的新手

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

我如何捕获这些值并在Chef中获取它们?

我需要这样的东西:

before_deploy command 
  execute param1 param2
deploy{ param1/param2}

param1param2从命令行在运行时获取其值。

3 个答案:

答案 0 :(得分:7)

通过运行

配置机器时
chef-solo

chef-client

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

离您的请求最近的解决方法是

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

例如:apache config。

创建json文件:my_attrs.json

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

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

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

使用chef-client标记运行chef-solo-j

chef-solo -j my_attrs.json

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

chef-solo -j http://remote.host/path/my_attrs.json

答案 1 :(得分:0)

如果您的文件名为example.rb

ruby example.rb argument1 argument2

然后

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

输出:

Argument: argument1
Argument: argument2

答案 2 :(得分: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属性,而不要求它到Chef服务器。