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

我是Chef和Ruby的新手

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

我如何捕捉这些价值并将其送到厨师手中?

我需要这样的东西:

before_deploy command execute param1 param2 deploy{ param1/param2} 

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

通过运行配置机器时

 chef-solo 

要么

 chef-client 

您不能为这些命令提供任何参数,这些参数对于食谱是可见的。 厨师食谱仅适用于属性 。 好事(或不太好)是可以从许多不同的地方设置属性:角色,节点,环境和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] 

使用-j标志运行chef-clientchef-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服务器请求它。