按Puppet中的子网获取IP地址
我有两台机器,每台都有多个网络接口:按Puppet中的子网获取IP地址,puppet,Puppet,我有两台机器,每台都有多个网络接口: 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
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
处于启用状态,但处于启用状态
iron
,10.1.1.0/24
开启enp0s99
在Puppet中,如何获取IP地址(或接口名称)
对应于子网10.1.1.0/24
?使用$::ipaddress\u enp0s2
显然不起作用,因为不同机器的接口名称不同。
我想要的是类似于$::ipaddress\u 10\u 1\u 1\u 0
(带值
10.1.1.11
onlead
,值10.1.1.12
oniron
)
供参考:在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"
您需要在Puppet中使用相同的方法来创建您自己的。您需要在Puppet中使用相同的方法来创建您自己的。Puppet实验室实际上有一个实现:
需要“ipaddr”
模块木偶::解析器::函数
newfunction(:ip_for_network,:type=>:rvalue,:doc=>Puppet实验室实际上有一个实现,它正好实现了以下功能:
需要“ipaddr”
模块木偶::解析器::函数
newfunction(:ip\u用于网络,:type=>:rvalue,:doc=>
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