我是Chef和Ruby的新手
我需要在命令行上将两个变量传递给Chef,并在配方中提供这些变量。
我如何捕获这些值并在Chef中获取它们?
我需要这样的东西:
before_deploy command
execute param1 param2
deploy{ param1/param2}
param1
和param2
从命令行在运行时获取其值。
答案 0 :(得分:7)
通过运行
配置机器时chef-solo
或
chef-client
您不能为这些命令提供任何参数,这些参数对于食谱是可见的。厨师食谱仅适用于attributes。好的(或不太好)是可以从许多不同的地方设置属性:角色,节点,环境和json文件。
离您的请求最近的解决方法是
chef-client
或chef-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服务器。