在Puppet中通过子网获取IP地址

时间:2014-07-17 04:53:08

标签: 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 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,但已启用 iron10.1.1.0/24位于enp0s99

在Puppet中,我如何获取IP地址(或接口名称) 对应于子网10.1.1.0/24?使用$::ipaddress_enp0s2 显然不起作用,因为不同机器的接口名称是不同的。 我想要的是类似$::ipaddress_10_1_1_0的东西(带有值) 10.1.1.11上的lead10.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"

2 个答案:

答案 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地址的事实。