【问题标题】:In chef how to catch execute resource's command output in variable?在厨师中如何在变量中捕获执行资源的命令输出?
【发布时间】:2016-04-10 11:11:35
【问题描述】:

我想稍后在我的 Chef 食谱中使用私有 IP 地址,我如何才能在变量中捕获它。我的代码看起来像...

execute 'privateip' do
command 'curl http://169.254.169.254/latest/meta-data/local-ipv4'
action :run
end

我想在变量中捕获 curl 命令的输出,例如..

privip = 'curl http://169.254.169.254/latest/meta-data/local-ipv4'

然后在配置文件中使用该值,或者有什么方法可以获取 aws 实例的私有 IP 地址,因为 ohai 不支持 privateip 属性。任何帮助将不胜感激。

【问题讨论】:

标签: chef-infra aws-opsworks ohai-gem


【解决方案1】:

您可以在node['ec2']['local_ipv4'] 属性中读取local-ipv4 值。 IIRC 所有 EC2 meta-data 都包含在 node['ec2'] 下。

如果您仍然喜欢运行命令,可以使用 shell_out! 助手:

output = shell_out!('mycommand --some --arguments').stdout

正如他们在 cmets 中所说,对于这种特殊情况,您还可以使用 Chef::HTTP 类:

http = Chef::HTTP.new('http://169.254.169.254')
privip = http.get('/latest/meta-data/local-ipv4')

【讨论】:

  • 为什么不直接使用 ruby​​ 的 HTTP 库?
  • 所以有几个级别的“实际上不要这样做”。首先,如前所述,您应该将Chef::HTTP 用于HTTP 请求。其次,您应该尽可能使用shell_out! 包装器。我会编辑答案。
  • 使用 shell_out! 的唯一限制是它不适用于 Chef 11。您需要 Chef 12。但它看起来要简单得多。当然,在这种特殊情况下,如果您知道如何使用,最好使用 HTTP 库。谢谢诺亚!
  • 谢谢...我会在我的食谱中试试这个。
猜你喜欢
  • 2013-04-24
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 2013-07-15
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多