按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
on
lead
,值
10.1.1.12
on
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"

您需要在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