我正在通过 Amazon Opsworks 使用 Chef,需要为我的一些服务器预置和配置额外的网络接口,但我无法弄清楚如何正确使用ifconfig
chef 资源。主要问题是我在编写 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 地址,这样您实际上就可以提前知道接口将接收的地址。另一个选项是从元数据中提取新接口的地址。