如何使用 chef ifconfig 资源配置网络接口以获取在配方运行时确定的 IP

如何使用 chef ifconfig 资源配置网络接口以获取在配方运行时确定的 IP

我正在通过 Amazon Opsworks 使用 Chef,需要为我的一些服务器预置和配置额外的网络接口,但我无法弄清楚如何正确使用ifconfigchef 资源。主要问题是我在编写 chef 配方时不知道接口的 IP 地址。我看到的所有示例都显示目标 IP 地址在资源名称中以常量字符串表示,如下所示:

ifconfig '10.0.0.1' do
 eth1
end

但是,我在执行配方时配置了网络接口,因此我事先不知道配置的网络接口将在本地网络 (Amazon VPC) 中分配到哪个 IP 地址。我编写了一个 ruby​​_block 资源来配置接口并收集分配的 IP,但是当我尝试将其传递给资源时,我收到了 chef 资源的错误,ifconfig而文档似乎建议我应该这样做。我的代码类似于以下内容:

ruby_block 'provision_and_get_IP' do
  # Inside the following function the AWS CLI is called to provision
  # a network interface and return the assigned IP address
  assigned_ip = provision_and_get_ip()
  node["my_attributes"]["assigned_ip"] = assigned_ip
end

ifconfig 'setup_interface' do
  device 'eth1'  
  target lazy { node["my_attributes"]["assigned_ip"] }
end

我收到一条错误信息

[2016-03-30T19:15:21+00:00] ERROR: ifconfig[setup_interface] (my_cookbook::my_recipe line 66) had an error: Chef::Exceptions::Exec: ifconfig eth1 setup_interface returned 1, expected 0
---- Begin output of ifconfig eth1 setup_interface ----
STDOUT: STDERR: setup_interface: Unknown host
ifconfig: `--help' gives usage information.
---- End output of ifconfig eth1 setup_interface ----

ifconfig 资源的文档似乎表明目标属性只是默认为资源的名称,如果我设置它,它就会起作用,但事实似乎并非如此。我在这里做错了什么?

答案1

我认为你无法通过ifconfig此处的配方实现太多目标。当你为虚拟机请求额外的接口时,它由亚马逊分配,我认为寻址也由亚马逊管理。即使你能够更改接口的 IP 地址,亚马逊也很可能无法正确识别和路由它。

其中一个选项是使用私有静态 IP 地址,这样您实际上就可以提前知道接口将接收的地址。另一个选项是从元数据中提取新接口的地址。

相关内容