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

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

param1param2 在运行时从命令行获取它们的值。

【问题讨论】:

我需要这样的 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-clientchef-solo时通过 在配方中使用属性

例如:apache 配置。

创建 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

【讨论】:

【参考方案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 属性,而无需向厨师服务器询问。

【讨论】:

以上是关于如何在命令行中捕获值并添加到配方中?的主要内容,如果未能解决你的问题,请参考以下文章

协助表格添加行中的值并使用按钮删除它们。使用 jQuery

Mac 命令行中添加命令直接调用可执行文件

在windows命令行中如何运行c程序的文本

如何在 Grub 中添加菜单项以在命令行中启动 Ubuntu [关闭]

在 Bash 中使用[方括号] | Linux 中国

如何在命令行中可靠地使用“rem”而不忽略相邻命令?