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 |
全局权威声明(authoritative ,not authoritative ) |
dhcp_global_booting |
全局启动(allow ,deny ,ignore ) |
dhcp_global_bootp |
全局 bootp(allow ,deny ,ignore ) |
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 |
全局日志设施(例如 daemon ,syslog ,user ,…) |
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 配置文件的子网声明。每个子网声明应具有 ip
和 netmask
,其他选项则不是必需的。我们用一个示例开始该部分,接下来是所有支持选项的完整概述。
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)关于 allow
和 deny
字段,选项在 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 地址的主机。这里是一个具有以下三个键的字典列表,其中 name
和 mac
是必需的:
选项 | 注释 |
---|---|
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-galaxy install bertvv.dhcp