如何在命令行中捕获值并添加到配方?
我是Chef和Ruby的新手
我需要在命令行上将两个变量传递给Chef,并在配方中提供这些变量。
我如何捕捉这些价值并将其送到厨师手中?
我需要这样的东西:
before_deploy command execute param1 param2 deploy{ param1/param2}
param1
和param2
在运行时从命令行获取其值。
通过运行配置机器时
chef-solo
要么
chef-client
您不能为这些命令提供任何参数,这些参数对于食谱是可见的。 厨师食谱仅适用于属性 。 好事(或不太好)是可以从许多不同的地方设置属性:角色,节点,环境和json文件。
与您的请求最接近的解决方法是
- 在机器上创建一个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]
使用-j
标志运行chef-client
或chef-solo
。
chef-solo -j my_attrs.json
如果my_attrs.json在某个远程服务器上,那么您可以提供一个URL。
chef-solo -j http://remote.host/path/my_attrs.json
如果您的文件名为example.rb
ruby example.rb argument1 argument2
然后
ARGV.each do|a| puts "Argument: #{a}" end
输出:
Argument: argument1 Argument: argument2
您可以通过调用命令在配方中设置变量
nodename = `cat /etc/chef/client.rb | grep "node_name" | sed -e 's/\//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服务器请求它。