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 Requerido. Dirección IP de la subred
max_lease_time no Tiempo máximo de arrendamiento para esta subred (en segundos)
netmask 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

Acerca del proyecto

Ansible role for setting up ISC DHCPD.

Instalar
ansible-galaxy install bertvv.dhcp
Licencia
other
Descargas
124.4k
Propietario
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!