如何在命令行中捕获值并添加到配方中?
Posted
技术标签:
【中文标题】如何在命令行中捕获值并添加到配方中?【英文标题】:How I can capture values in command line and add to recipe? 【发布时间】:2013-01-21 18:07:36 【问题描述】:我是 Chef 和 Ruby 的新手
我需要在命令行中将两个变量传递给 Chef,并让这些变量在配方中可用。
如何获取这些值并在 Chef 中获取它们?
我需要这样的东西:
before_deploy command
execute param1 param2
deploy param1/param2
param1
和 param2
在运行时从命令行获取它们的值。
【问题讨论】:
我需要这样的 before_deploy 命令执行 param1: getparam1, param2: getparam2。 deploy param1/param2 我不知道如何从命令行获取这些参数 【参考方案1】:如果你的文件名为 example.rb
ruby example.rb argument1 argument2
然后
ARGV.each do|a|
puts "Argument: #a"
end
输出:
Argument: argument1
Argument: argument2
【讨论】:
这实际上是一个可能的答案,我不明白为什么人们无缘无故地否决了这个。从我这边 +1。【参考方案2】:当您通过运行配置机器时
chef-solo
或
chef-client
您不能为这些命令提供任何对配方可见的参数。厨师食谱仅适用于attributes。好事(或不那么好)是可以从许多不同的地方设置属性:角色、节点、环境和 json 文件。
最接近您要求的解决方法是
在机器上创建一个 json 文件 运行chef-client
或chef-solo
时通过
在配方中使用属性
例如:apache 配置。
创建 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
【讨论】:
【参考方案3】:您可以通过调用命令在配方中设置变量
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 属性,而无需向厨师服务器询问。
【讨论】:
以上是关于如何在命令行中捕获值并添加到配方中?的主要内容,如果未能解决你的问题,请参考以下文章