我有几台机器,每台都有多个网络接口:
lead$ ip addr
2: enp0s2: ...
inet 10.1.1.11/24 brd 10.1.1.255 scope global enp0s2
3: enp0s3: ...
inet 10.2.2.11/24 brd 10.2.2.255 scope global enp0s3
iron$ ip addr
2: enp0s99: ...
inet 10.1.1.12/24 brd 10.1.1.255 scope global enp0s99
3: enp0s3: ...
inet 10.2.2.12/24 brd 10.2.2.255 scope global enp0s3
请注意,在lead
上,10.1.1.0/24
位于enp0s2
,但已启用
iron
,10.1.1.0/24
位于enp0s99
。
在Puppet中,我如何获取IP地址(或接口名称)
对应于子网10.1.1.0/24
?使用$::ipaddress_enp0s2
显然不起作用,因为不同机器的接口名称是不同的。
我想要的是类似$::ipaddress_10_1_1_0
的东西(带有值)
10.1.1.11
上的lead
和10.1.1.12
上的值iron
。)
供参考:在Ansible中,我会做类似的事情:
- shell: "ip route get 10.1.1.0 | awk '{print $6}'"
register: ipaddr
- debug:
msg: "{{ ipaddr.stdout }} is my IP on 10.1.1.0/24"
答案 0 :(得分:2)
您需要在Puppet中使用相同的方法,使用custom facts创建自己的方法。
答案 1 :(得分:2)
Puppet Labs实际上实现了这个in their puppetlabs-openstack module:
require "ipaddr"
module Puppet::Parser::Functions
newfunction(:ip_for_network, :type => :rvalue, :doc => <<-EOS
Returns an ip address for the given network in cidr notation
ip_for_network("127.0.0.0/24") => 127.0.0.1
EOS
) do |args|
addresses_in_range = []
range = IPAddr.new(args[0])
facts = compiler.node.facts.values
ip_addresses = facts.select { |key, value| key.match /^ipaddress/ }
ip_addresses.each do |pair|
key = pair[0]
string_address = pair[1]
ip_address = IPAddr.new(string_address)
if range.include?(ip_address)
addresses_in_range.push(string_address)
end
end
return addresses_in_range.first
end
end
不是制作自定义事实,而是循环现有事实并找到看起来像IP地址的事实。