bertvv.dhcp

Ansible 角色 dhcp

Ansible 角色用于设置 ISC DHCPD。该角色的职责是安装包和管理配置文件(dhcpd.conf(5))。此角色不负责管理防火墙配置。您可以在本地剧本中执行此操作,或者使用其他角色(例如 bertvv.rh-base

有关每个版本中显著更改的信息,请参阅 变更日志

您是否在使用/喜欢此角色?请考虑给它一个星。如果您在 Ansible Galaxy 上 评分此角色,并发现某些方面不足,请考虑提交一个问题并提供可采取的反馈或拉取请求,以便我们改进它。谢谢!

要求

没有特定要求

角色变量

此角色能够设置全局选项,并指定子网声明。

请参阅 测试剧本 以获取基于 Vagrant 和 VirtualBox 的测试环境中 DHCP 服务器的工作示例。此部分是所有支持选项的参考。

全局选项

以下变量在设置时,将添加到 DHCP 配置文件的全局部分。如果没有指定默认值,则相应的设置将被省略 dhcpd.conf(5)

有关这些选项的更多信息,请查看 dhcp-options(5) 手册页面。

变量 注释
dhcp_global_authoritative 全局权威声明(authoritativenot authoritative
dhcp_global_booting 全局启动(allowdenyignore
dhcp_global_bootp 全局 bootp(allowdenyignore
dhcp_global_broadcast_address 全局广播地址
dhcp_global_classes 带有匹配语句的类定义(1)
dhcp_global_default_lease_time 默认租用时间(以秒为单位)
dhcp_global_domain_name_servers DNS 服务器的 IP 地址列表(2)
dhcp_global_domain_name 客户端在解析主机名时应使用的域名
dhcp_global_domain_search 客户端用于查找非完全限定域名(FQDN)的域名列表(1)
dhcp_global_failover 备用设置(3)
dhcp_global_failover_peer 备用对等体的名称(例如 foo
dhcp_global_filename 要请求的启动文件
dhcp_global_includes_missing 布尔值。如果角色文件中缺少 includes 文件则继续
dhcp_global_includes 要包含的配置文件列表(来自 dhcp_config_dir
dhcp_global_log_facility 全局日志设施(例如 daemonsysloguser,…)
dhcp_global_max_lease_time 最大租用时间(以秒为单位)
dhcp_global_next_server PXE 启动服务器的 IP
dhcp_global_ntp_servers NTP 服务器的 IP 地址列表
dhcp_global_omapi_port OMAPI 端口
dhcp_global_omapi_secret OMAPI 密钥
dhcp_global_other_options 任意其他全局选项的数组
dhcp_global_routers 路由器的 IP 地址
dhcp_global_server_name 发送给客户端的服务器名称
dhcp_global_server_state 服务状态(已启动,已停止)
dhcp_global_subnet_mask 全局子网掩码
dhcp_custom_includes 要包含的 jinja 配置文件列表(来自 dhcp_config_dir
dhcp_custom_includes_modes 目标自定义配置文件的模式列表

备注

(1)此角色支持使用匹配语句定义类,例如:

# 为 VirtualBox 虚拟机定义类
dhcp_global_classes:
  - name: vbox
    match: 'match if binary-to-ascii(16,8,":",substring(hardware, 1, 3)) = "8:0:27"'

类名称可以在地址池的定义中使用(见下文)。

(2)角色变量 dhcp_global_domain_name_servers 可以写为列表(当有多个项时)或字符串(当只有一个项时)。以下示例展示了这两种情况:

# 单个 DNS 服务器
dhcp_global_domain_name_servers: 8.8.8.8

# DNS 服务器列表
dhcp_global_domain_name_servers:
  - 8.8.8.8
  - 8.8.4.4

(3)此角色还支持定义备用对等体,例如:

# 备用对等体定义
dhcp_global_failover_peer: failover-group
dhcp_global_failover:
  role: primary # | secondary
  address: 192.168.222.2
  port: 647
  peer_address: 192.168.222.3
  peer_port: 647
  max_response_delay: 15
  max_unacked_updates: 10
  load_balance_max_seconds: 5
  split: 255
  mclt: 3600

变量 dhcp_global_failover_peer 包含配置对等体的名称,以便在每个池中使用。备用声明选项通过变量 dhcp_global_failover 指定,这是一个可能包含以下选项的字典:

选项 必需 注释
address 该服务器的 IP 地址
hba 冒号分隔的十六进制列表
load_balance_max_seconds 超过该时间后负载均衡将失效(建议 3 到 5 秒)
max-balance 备用池负载平衡声明
max-lease-misbalance 备用池负载平衡声明
max-lease-ownership 备用池负载平衡声明
max_response_delay 在进行备用之前最长无联系的秒数
max_unacked_updates 在接收到 BNDACK 之前可以发送的最大 BNDUPD(建议 10)
mclt 最大客户端主导时间
min-balance 备用池负载平衡声明
peer_address 备用对等体的 IP 地址
peer_port 该服务器的端口(通常是 519/520 或 647/847)
port 该服务器的端口(通常是 519/520 或 647/847)
role 主服务器、备用服务器
split 负载均衡分割(0-255)

备用对等体指令必须在地址池的定义中(见下文)。

子网声明

角色变量 dhcp_subnets 包含一个字典列表,指定要添加到 DHCP 配置文件的子网声明。每个子网声明应具有 ipnetmask,其他选项则不是必需的。我们用一个示例开始该部分,接下来是所有支持选项的完整概述。

dhcp_subnets:
  - ip: 192.168.222.0
    netmask: 255.255.255.128
    domain_name_servers:
      - 10.0.2.3
      - 10.0.2.4
    range_begin: 192.168.222.50
    range_end: 192.168.222.127
  - ip: 192.168.222.128
    default_lease_time: 3600
    max_lease_time: 7200
    netmask: 255.255.255.128
    domain_name_servers: 10.0.2.3
    routers: 192.168.222.129

子网声明中支持选项的按字母顺序列表:

选项 必需 注释
booting allow,deny,ignore
bootp allow,deny,ignore
default_lease_time 此子网的默认租用时间(以秒为单位)
domain_name_servers 此子网的域名服务器列表(1)
domain_search 用于解析非完全限定域名(FQDN)的域名列表(1)
filename 从引导服务器检索的文件名
hosts 每个子网的固定 IP 地址主机列表,类似于 dhcp_hosts
interface 替代子网声明的 interface
ip 必需。 子网的 IP 地址
max_lease_time 此子网的最大租用时间(以秒为单位)
netmask 必需。 子网的网络掩码(以点分十进制表示)
next_server 引导服务器的 IP 地址
ntp_servers 此子网的 NTP 服务器列表
range_begin 要分配的动态 IP 地址范围中的最低地址
range_end 要分配的动态 IP 地址范围中的最高地址
ranges 如果需要多个地址范围,可以指定为列表(2)
routers 此子网的网关 IP 地址
server_name 发送给客户端的服务器名称
subnet_mask 替代子网声明的 netmask
options 要添加到此子网的选项字典

您可以通过设置 pools 选项在子网内指定地址池。这样,您可以指定一组地址,该组地址将与同一网络段或子网中的其他地址池的处理方式不同。它是一个包含以下键的字典列表,所有键都是可选的:

选项 注释
allow 指定哪些主机被允许在此池中(1)
default_lease_time 该池的默认租用时间
deny 指定哪些主机不被允许在此池中
domain_name_servers 此池中使用的域名服务器(1)
failover_peer 指定一个备用服务器
max_lease_time 该池的最大租用时间
min_lease_time 该池的最小租用时间
range_begin 此池中的最低地址
range_end 此池中的最高地址
ranges 如果需要多个范围,可以指定为列表(2)

(1)关于 allowdeny 字段,选项在 dhcpd.conf(5) 中列出,但包括:

  • booting
  • bootp
  • client-updates
  • known-clients
  • members of "CLASS"
  • unknown-clients

(2)对于多个子网范围,可以这样指定:

ranges:
  - { begin: 192.168.222.50, end: 192.168.222.99 }
  - { begin: 192.168.222.110, end: 192.168.222.127 }

主机声明

您可以通过设置 dhcp_hosts 选项指定根据其 MAC 地址应获得固定 IP 地址的主机。这里是一个具有以下三个键的字典列表,其中 namemac 是必需的:

选项 注释
name 主机的名称
mac 主机的 MAC 地址
ip 要分配给主机的 IP 地址
hostname 通过 DHCP 分配的主机名(可选)
dhcp_hosts:
  - name: cl1
    mac: '00:11:22:33:44:55'
    ip: 192.168.222.150
  - name: cl2
    mac: '00:de:ad:be:ef:00'
    ip: 192.168.222.151

指定 PXEBoot 服务器

设置变量 dhcp_pxeboot_server 将会将 PXE 客户端重定向到指定的 PXEBoot 服务器,以便通过网络启动。指定的服务器应在预期位置上具有启动映像。使用例如 bertvv.pxeserver 来进行配置。

自定义包含

将变量 dhcp_custom_inludes 设置为 jinja 模板将允许使用自定义配置,这些配置随后将被包含到 dhcpd.conf 文件中。如果模板文件名带有 .j2 扩展名,则它将在目标文件名中被移除,否则将在目标中保留模板文件名。

dhcp_custom_includes:
  - custom-dhcp-config.conf[.j2]

目标自定义配置文件的默认模式为 0644。要修改此项,请设置变量 dhcp_custom_includes_modes。zip_longest 过滤器将与 dhcp_custom_includes 变量一起使用。

dhcp_custom_includes_modes:
  - '0600'

您可以创建自己的变量以在模板中使用,从而实现完全灵活性。为了避免变量冲突,请确保使用未在此角色中引用的变量,因为这将导致配置在多个 .conf 文件中重复。

    dhcp_custom_hosts:
      - name: Juniper1
        mac: 'de:ad:c0:de:ca:fe'
        ip: 192.168.35.160
        options:
          - name: tftp-server-name
            value: 192.168.35.152
          - name: host-name
            value: Juniper1
          - name: NEW_OP.transfer-mode
            value: "http"
          - name: NEW_OP.config-file-name
            value: "/configurations/j1-switch.config"

最后,jinja 模板必须包含有效的 ISC DHCPD 配置 (dhcpd.conf(5))。这是使用 bertvv.dhcp 进行 Juniper 零接触配置的示例。

option space NEW_OP;
option NEW_OP.image-file-name code 0 = text;
option NEW_OP.config-file-name code 1 = text;
option NEW_OP.image-file-type code 2 = text;
option NEW_OP.transfer-mode code 3 = text;
option NEW_OP.alt-image-file-name code 4= text;
option NEW_OP.http-port code 5= text;
option NEW_OP-encapsulation code 43 = encapsulate NEW_OP;

{% if dhcp_custom_hosts is defined %}

#
# 主机声明
#
{% for host in dhcp_custom_hosts %}
host {{ host.name | replace (" ","_") | replace ("'","_") | replace (":","_") }} {
  hardware ethernet {{ host.mac }};
{% if host.ip is defined %}
  fixed-address {{ host.ip }};
{% endif %}
{% if host.options is defined %}
{% for option in host.options %}
  {{ option.name }} "{{ option.value }}"
{% endfor %}
{% endif %}
}
{% endfor %}
{% endif %}

依赖关系

没有依赖关系。

示例剧本

请查看 测试剧本

测试

要运行此剧本的测试,您需要安装 Molecule、VirtualBox 和 Vagrant。运行命令 molecule converge 将创建一个具有 IP 地址 192.168.222.2 的仅主机接口的 VirtualBox VM。要测试,您可以使用 nmap dhcp-discover 脚本:

$ sudo nmap --script broadcast-dhcp-discover -e vboxnet7
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-30 11:32 CET
Pre-scan script results:
| broadcast-dhcp-discover: 
|   Response 1 of 2: 
|     Interface: vboxnet7
|     IP Offered: 192.168.222.50
|     DHCP Message Type: DHCPOFFER
|     Server Identifier: 192.168.222.2
|     IP Address Lease Time: 5m00s
|     Subnet Mask: 255.255.255.0
|     Domain Name Server: 10.0.2.3, 10.0.2.4
|     Domain Name: example.com
|     Broadcast Address: 192.168.222.255
|   Response 2 of 2: 
|     Interface: vboxnet7
|     IP Offered: 192.168.222.50
|     DHCP Message Type: DHCPOFFER
|     Server Identifier: 192.168.222.2
|     IP Address Lease Time: 5m00s
|     Subnet Mask: 255.255.255.0
|     Domain Name Server: 10.0.2.3, 10.0.2.4
|     Domain Name: example.com
|_    Broadcast Address: 192.168.222.255
WARNING: No targets were specified, so 0 hosts scanned.
Nmap done: 0 IP addresses (0 hosts up) scanned in 10.19 seconds

许可证

BSD

贡献

问题、功能请求、创意都是受欢迎的,可以在问题部分中发布。拉取请求也是非常欢迎的。理想情况下,请创建一个主题分支,并在提交时将您的提交压缩为一个(并附上描述性消息)。

贡献者

关于项目

Ansible role for setting up ISC DHCPD.

安装
ansible-galaxy install bertvv.dhcp
许可证
other
下载
124.4k
拥有者
Hi! My contribs are often related to my job (teaching Linux), but are mostly done in my free time. I can't always respond quickly to PRs and Issues. Sorry!