bertvv.dhcp
Rol de Ansible dhcp
Rol de Ansible para configurar ISC DHCPD. Las responsabilidades de este rol incluyen instalar paquetes y gestionar la configuración (dhcpd.conf(5)). La gestión de la configuración del firewall NO es parte de este rol. Puedes hacerlo en tu playbook local o usar otro rol (por ejemplo, bertvv.rh-base).
Consulta el registro de cambios para conocer los cambios importantes en cada versión.
¿Te gusta este rol? Por favor, considera darle una estrella. Si evalúas este rol en Ansible Galaxy y encuentras que falta algo, por favor, considera abrir un problema con comentarios constructivos o un PR para que podamos mejorarlo. ¡Gracias!
Requisitos
No hay requisitos específicos.
Variables del Rol
Este rol puede establecer opciones globales y especificar declaraciones de subred.
Consulta el playbook de prueba para un ejemplo funcional de un servidor DHCP en un entorno de prueba basado en Vagrant y VirtualBox. Esta sección es una referencia de todas las opciones soportadas.
Opciones globales
Las siguientes variables, cuando se establecen, se agregarán a la sección global del archivo de configuración DHCP. Si no hay un valor predeterminado especificado, la configuración correspondiente se omitirá de dhcpd.conf(5)
.
Consulta la página del manual dhcp-options(5) para obtener más información sobre estas opciones.
Variable | Comentarios |
---|---|
dhcp_global_authoritative |
Declaración global autoritativa (authoritative , not authoritative ) |
dhcp_global_booting |
Arranque global (allow , deny , ignore ) |
dhcp_global_bootp |
Bootp global (allow , deny , ignore ) |
dhcp_global_broadcast_address |
Dirección de broadcast global |
dhcp_global_classes |
Definiciones de clases con una declaración de coincidencia (1) |
dhcp_global_default_lease_time |
Tiempo de arrendamiento predeterminado en segundos |
dhcp_global_domain_name_servers |
Lista de direcciones IP de servidores DNS (2) |
dhcp_global_domain_name |
El nombre de dominio que el cliente debe usar al resolver nombres de host |
dhcp_global_domain_search |
Lista de nombres de dominio que el cliente utilizará para localizar nombres no cualificados (1) |
dhcp_global_failover |
Configuraciones de par de conmutación por error (3) |
dhcp_global_failover_peer |
Nombre para el par de conmutación por error (por ejemplo, foo ) |
dhcp_global_filename |
Nombre de archivo a solicitar para arranque |
dhcp_global_includes_missing |
Booleano. Continuar si faltan archivos includes en los archivos del rol |
dhcp_global_includes |
Lista de archivos de configuración a incluir (desde dhcp_config_dir ) |
dhcp_global_log_facility |
Instalación de logs global (por ejemplo, daemon , syslog , user , ...) |
dhcp_global_max_lease_time |
Tiempo máximo de arrendamiento en segundos |
dhcp_global_next_server |
IP para el servidor PXEboot |
dhcp_global_ntp_servers |
Lista de direcciones IP de servidores NTP |
dhcp_global_omapi_port |
Puerto OMAPI |
dhcp_global_omapi_secret |
Secreto OMAPI |
dhcp_global_other_options |
Array de opciones globales adicionales arbitrarias |
dhcp_global_routers |
Dirección IP del router |
dhcp_global_server_name |
Nombre del servidor enviado al cliente |
dhcp_global_server_state |
Estado del servicio (iniciado, detenido) |
dhcp_global_subnet_mask |
Máscara de subred global |
dhcp_custom_includes |
Lista de archivos de configuración jinja que se incluirán (desde dhcp_config_dir ) |
dhcp_custom_includes_modes |
Lista de modos para el archivo de configuración personalizado de destino |
Notas
(1) Este rol admite la definición de clases con una declaración de coincidencia, por ejemplo:
# Clase para VMs de VirtualBox
dhcp_global_classes:
- name: vbox
match: 'match if binary-to-ascii(16,8,":",substring(hardware, 1, 3)) = "8:0:27"'
Los nombres de clase se pueden usar en la definición de grupos de direcciones (ver a continuación).
(2) La variable del rol dhcp_global_domain_name_servers
puede escribirse como una lista (cuando tienes más de un elemento) o como una cadena (cuando solo tienes uno). El siguiente fragmento muestra un ejemplo de ambos:
# Un solo servidor DNS
dhcp_global_domain_name_servers: 8.8.8.8
# Una lista de servidores DNS
dhcp_global_domain_name_servers:
- 8.8.8.8
- 8.8.4.4
(3) Este rol también admite la definición de un par de conmutación por error, por ejemplo:
# Definición de par de conmutación por error
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
La variable dhcp_global_failover_peer
contiene un nombre para el par configurado, que se utilizará por grupo. Las opciones de declaración de conmutación por error se especifican con la variable dhcp_global_failover
, un diccionario que puede contener las siguientes opciones:
Opción | Requerido | Comentario |
---|---|---|
address |
no | Dirección IP de este servidor |
hba |
no | lista de hexadecimales separados por dos puntos |
load_balance_max_seconds |
no | Límite después del cual se desactiva el balanceo de carga (3 a 5 recomendado) |
max-balance |
no | Declaración de balanceo de grupo de conmutación |
max-lease-misbalance |
no | Declaración de balanceo de grupo de conmutación |
max-lease-ownership |
no | Declaración de balanceo de grupo de conmutación |
max_response_delay |
no | Máximos segundos sin contacto antes de activar la conmutación |
max_unacked_updates |
no | Máximo BNDUPD que puede enviar antes de recibir un BNDACK (10 recomendado) |
mclt |
no | Máximo tiempo de lead del cliente |
min-balance |
no | Declaración de balanceo de grupo de conmutación |
peer_address |
no | Dirección IP del par de conmutación |
peer_port |
no | Puerto de este servidor (generalmente 519/520 o 647/847) |
port |
no | Puerto de este servidor (generalmente 519/520 o 647/847) |
role |
no | primary, secondary |
split |
no | División de balanceo de carga (0-255) |
La directiva de par de conmutación por error debe estar en la definición de grupos de direcciones (ver a continuación).
Declaraciones de subred
La variable del rol dhcp_subnets
contiene una lista de diccionarios que especifican las declaraciones de subred que se agregarán al archivo de configuración DHCP. Cada declaración de subred debe tener un ip
y una netmask
, otras opciones no son obligatorias. Comenzamos esta sección con un ejemplo, seguido de una descripción completa de las opciones soportadas.
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
Una lista alfabética de opciones soportadas en una declaración de subred:
Opción | Requerido | Comentario |
---|---|---|
booting |
no | allow, deny, ignore |
bootp |
no | allow, deny, ignore |
default_lease_time |
no | Tiempo de arrendamiento predeterminado para esta subred (en segundos) |
domain_name_servers |
no | Lista de servidores de nombres de dominio para esta subred (1) |
domain_search |
no | Lista de nombres de dominio para la resolución de nombres no cualificados (1) |
filename |
no | nombre del archivo a recuperar del servidor de arranque |
hosts |
no | Lista de hosts con direcciones IP fijas para cada subred, similar a dhcp_hosts |
interface |
no | Sobrescribe la interfaz de la declaración de subred |
ip |
sí | Requerido. Dirección IP de la subred |
max_lease_time |
no | Tiempo máximo de arrendamiento para esta subred (en segundos) |
netmask |
sí | Requerido. Máscara de red de la subred (en notación decimal con puntos) |
next_server |
no | Dirección IP del servidor de arranque |
ntp_servers |
no | Lista de servidores NTP para esta subred |
range_begin |
no | Dirección más baja en el rango de direcciones IP dinámicas que se asignarán |
range_end |
no | Dirección más alta en el rango de direcciones IP dinámicas que se asignarán |
ranges |
no | Si se necesitan múltiples rangos, pueden especificarse como una lista (2) |
routers |
no | Dirección IP de la puerta de enlace para esta subred |
server_name |
no | Nombre del servidor enviado al cliente |
subnet_mask |
no | Sobrescribe la netmask de la declaración de subred |
options |
no | Un diccionario de opciones que se agregarán a esta subred |
Puedes especificar grupos de direcciones dentro de una subred estableciendo las opciones de pools
. Esto te permite especificar un grupo de direcciones que se tratarán de manera diferente que otro grupo de direcciones, incluso en el mismo segmento de red o subred. Es una lista de diccionarios con las siguientes claves, todas opcionales:
Opción | Comentario |
---|---|
allow |
Especifica qué hosts están permitidos en este grupo (1) |
default_lease_time |
El tiempo de arrendamiento predeterminado para este grupo |
deny |
Especifica qué hosts no están permitidos en este grupo |
domain_name_servers |
Los servidores de nombre de dominio a utilizar para este grupo (1) |
failover_peer |
Especifica un servidor de conmutación por error |
max_lease_time |
El tiempo máximo de arrendamiento para este grupo |
min_lease_time |
El tiempo mínimo de arrendamiento para este grupo |
range_begin |
La dirección más baja en este grupo |
range_end |
La dirección más alta en este grupo |
ranges |
Si se necesitan múltiples rangos, pueden especificarse como una lista (2) |
(1) Para los campos allow
y deny
, las opciones están enumeradas en dhcpd.conf(5), y incluyen:
booting
bootp
client-updates
known-clients
members of "CLASS"
unknown-clients
(2) Para múltiples rangos de subred, pueden especificarse así:
ranges:
- { begin: 192.168.222.50, end: 192.168.222.99 }
- { begin: 192.168.222.110, end: 192.168.222.127 }
Declaraciones de hosts
Puedes especificar hosts que deben recibir una dirección IP fija basada en su MAC estableciendo la opción dhcp_hosts
. Esta es una lista de diccionarios con las siguientes tres claves, de las cuales name
y mac
son obligatorias:
Opción | Comentario |
---|---|
name |
El nombre del host |
mac |
La dirección MAC del host |
ip |
La dirección IP que se asignará al host |
hostname |
Nombre de host que se asignará a través de DHCP (opcional) |
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
Especifica el servidor PXEBoot
Establecer la variable dhcp_pxeboot_server
, redirigirá a los clientes PXE al servidor PXEBoot especificado para arrancar a través de la red. El servidor especificado debe tener imágenes de arranque en las ubicaciones esperadas. Usar por ejemplo bertvv.pxeserver para configurarlo.
Inclusiones personalizadas
Establecer la variable dhcp_custom_includes
a una plantilla jinja permitirá usar configuraciones personalizadas que se incluirán posteriormente en el archivo dhcpd.conf
. Si el nombre del archivo de plantilla tiene la extensión .j2
, se eliminará del nombre del archivo de destino, de lo contrario, se conservará el nombre del archivo de plantilla en el destino.
dhcp_custom_includes:
- custom-dhcp-config.conf[.j2]
El modo predeterminado para el archivo de configuración personalizado de destino es 0644. Para modificar esto, establece la variable dhcp_custom_includes_modes
. El filtro zip_longest se utilizará junto con la variable dhcp_custom_includes
.
dhcp_custom_includes_modes:
- '0600'
Puedes crear tus propias variables para usar dentro de la plantilla, lo que permite tener total flexibilidad. Para evitar conflictos de variables, asegúrate de utilizar variables que no estén referenciadas dentro de este rol, ya que esto duplicaría la configuración en múltiples archivos .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"
Finalmente, la plantilla jinja debe contener una configuración válida de ISC DHCPD (dhcpd.conf(5)). Este es un ejemplo de uso de bertvv.dhcp para la Aprovisionamiento Zero-Touch de 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 %}
#
# Declaraciones de Hosts
#
{% 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 %}
Dependencias
No hay dependencias.
Playbook de Ejemplo
Consulta el playbook de prueba.
Pruebas
Para ejecutar las pruebas de este playbook, necesitas tener instalados Molecule, VirtualBox y Vagrant. Ejecutar el comando molecule converge
creará una VM de VirtualBox con una interfaz solo para anfitriones con la dirección IP 192.168.222.2. Para probar, puedes usar el script de descubrimiento dhcp de nmap, por ejemplo:
$ sudo nmap --script broadcast-dhcp-discover -e vboxnet7
Iniciando Nmap 7.91 ( https://nmap.org ) a las 2021-11-30 11:32 CET
Resultados del script de pre-escaner:
| broadcast-dhcp-discover:
| Respuesta 1 de 2:
| Interfaz: vboxnet7
| IP Ofrecida: 192.168.222.50
| Tipo de Mensaje DHCP: DHCPOFFER
| Identificador del Servidor: 192.168.222.2
| Tiempo de Arrendamiento de IP: 5m00s
| Máscara de Subred: 255.255.255.0
| Servidor de Nombres de Dominio: 10.0.2.3, 10.0.2.4
| Nombre de Dominio: example.com
| Dirección de Broadcast: 192.168.222.255
| Respuesta 2 de 2:
| Interfaz: vboxnet7
| IP Ofrecida: 192.168.222.50
| Tipo de Mensaje DHCP: DHCPOFFER
| Identificador del Servidor: 192.168.222.2
| Tiempo de Arrendamiento de IP: 5m00s
| Máscara de Subred: 255.255.255.0
| Servidor de Nombres de Dominio: 10.0.2.3, 10.0.2.4
| Nombre de Dominio: example.com
|_ Dirección de Broadcast: 192.168.222.255
ADVERTENCIA: No se especificaron objetivos, por lo que no se escanearon hosts.
Nmap terminado: 0 direcciones IP (0 hosts activos) escaneadas en 10.19 segundos
Licencia
BSD
Contribuciones
Se agradecen problemas, solicitudes de características e ideas, que pueden ser publicadas en la sección de Problemas. También se agradecen mucho las solicitudes de extracción. Preferiblemente, crea una rama de tema y, al enviar, combina tus commits en una sola (con un mensaje descriptivo).
Contribuyentes
ansible-galaxy install bertvv.dhcp