bertvv.dhcp

Rôle Ansible dhcp

Rôle Ansible pour configurer ISC DHCPD. Les responsabilités de ce rôle sont d'installer des paquets et de gérer la configuration (dhcpd.conf(5)). La gestion de la configuration du pare-feu n'est PAS une préoccupation de ce rôle. Vous pouvez le faire dans votre playbook local ou utiliser un autre rôle (par exemple, bertvv.rh-base).

Référez-vous au journal des modifications pour les changements notables dans chaque version.

Vous utilisez/aimez ce rôle ? Merci de lui donner une étoile. Si vous évaluez ce rôle sur Ansible Galaxy et que vous le trouvez insuffisant à certains égards, veuillez envisager d'ouvrir une issue avec des retours constructifs ou une PR pour que nous puissions l'améliorer. Merci !

Prérequis

Pas d'exigences spécifiques.

Variables du rôle

Ce rôle peut définir des options globales et spécifier des déclarations de sous-réseau.

Voir le playbook de test pour un exemple fonctionnel d'un serveur DHCP dans un environnement de test basé sur Vagrant et VirtualBox. Cette section est une référence de toutes les options prises en charge.

Options globales

Les variables suivantes, lorsqu'elles sont définies, seront ajoutées à la section globale du fichier de configuration DHCP. S'il n'y a pas de valeur par défaut spécifiée, le paramètre correspondant sera omis de dhcpd.conf(5).

Voir la page de manuel dhcp-options(5) pour plus d'informations sur ces options.

Variable Commentaires
dhcp_global_authoritative Déclaration globale autoritaire (authoritative, not authoritative)
dhcp_global_booting Démarrage global (allow, deny, ignore)
dhcp_global_bootp Bootp global (allow, deny, ignore)
dhcp_global_broadcast_address Adresse de diffusion globale
dhcp_global_classes Définitions de classes avec une déclaration de correspondance (1)
dhcp_global_default_lease_time Temps de location par défaut en secondes
dhcp_global_domain_name_servers Liste d'adresses IP des serveurs DNS (2)
dhcp_global_domain_name Le nom de domaine que le client doit utiliser lors de la résolution des noms d'hôte
dhcp_global_domain_search Liste de noms de domaine à utiliser par le client pour localiser les noms non-FQDN (1)
dhcp_global_failover Paramètres de secours (3)
dhcp_global_failover_peer Nom du pair de secours (ex. foo)
dhcp_global_filename Nom de fichier à demander pour le démarrage
dhcp_global_includes_missing Booléen. Continuer si les fichiers includes manquent dans les fichiers du rôle
dhcp_global_includes Liste de fichiers de configuration à inclure (depuis dhcp_config_dir)
dhcp_global_log_facility Installation du journal global (ex. daemon, syslog, user, ...)
dhcp_global_max_lease_time Temps de location maximum en secondes
dhcp_global_next_server IP pour le serveur PXEboot
dhcp_global_ntp_servers Liste d'adresses IP des serveurs NTP
dhcp_global_omapi_port Port OMAPI
dhcp_global_omapi_secret Secret OMAPI
dhcp_global_other_options Tableau d'options globales additionnelles arbitraires
dhcp_global_routers Adresse IP du routeur
dhcp_global_server_name Nom du serveur envoyé au client
dhcp_global_server_state État du service (démarré, arrêté)
dhcp_global_subnet_mask Masque de sous-réseau global
dhcp_custom_includes Liste de fichiers de configuration jinja à inclure (depuis dhcp_config_dir)
dhcp_custom_includes_modes Liste des modes pour le fichier de configuration personnalisé de destination

Remarques

(1) Ce rôle prend en charge la définition de classes avec une déclaration de correspondance, ex. :

# Classe pour les machines virtuelles VirtualBox
dhcp_global_classes:
  - name: vbox
    match: 'match if binary-to-ascii(16,8,":",substring(hardware, 1, 3)) = "8:0:27"'

Les noms de classe peuvent être utilisés dans la définition des groupes d'adresses (voir ci-dessous).

(2) La variable de rôle dhcp_global_domain_name_servers peut être écrite soit comme une liste (lorsque vous avez plus d'un élément), soit comme une chaîne (lorsque vous n'en avez qu'un). Le snippet suivant montre un exemple des deux :

# Un seul serveur DNS
dhcp_global_domain_name_servers: 8.8.8.8

# Une liste de serveurs DNS
dhcp_global_domain_name_servers:
  - 8.8.8.8
  - 8.8.4.4

(3) Ce rôle prend également en charge la définition d'un pair de secours, ex. :

# Définition du pair de secours
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 contient un nom pour le pair configuré, à utiliser sur une base par groupe. Les options de déclaration de secours sont spécifiées avec la variable dhcp_global_failover, un dictionnaire qui peut contenir les options suivantes :

Option Obligatoire Commentaire
address non Adresse IP de ce serveur
hba non liste-hex-séparée-par-deux-points
load_balance_max_seconds non Coupure après laquelle l'équilibrage de charge est désactivé (3 à 5 recommandé)
max-balance non Déclaration d'équilibre des pools de secours
max-lease-misbalance non Déclaration d'équilibre des pools de secours
max-lease-ownership non Déclaration d'équilibre des pools de secours
max_response_delay non Maximum de secondes sans contact avant de faire intervenir le secours
max_unacked_updates non Nombre maximum de BNDUPD pouvant être envoyé avant de recevoir un BNDACK (10 recommandé)
mclt non Temps maximum de présence du client
min-balance non Déclaration d'équilibre des pools de secours
peer_address non Adresse IP du pair de secours
peer_port non Port de ce serveur (généralement 519/520 ou 647/847)
port non Port de ce serveur (généralement 519/520 ou 647/847)
role non primaire, secondaire
split non Répartition de charge (0-255)

La directive de pair de secours doit être dans la définition des groupes d'adresses (voir ci-dessous).

Déclarations de sous-réseau

La variable du rôle dhcp_subnets contient une liste de dictionnaires spécifiant les déclarations de sous-réseau à ajouter au fichier de configuration DHCP. Chaque déclaration de sous-réseau doit avoir une ip et un netmask, les autres options ne sont pas obligatoires. Nous commençons cette section avec un exemple, un aperçu complet des options prises en charge suit.

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

Une liste alphabétique des options prises en charge dans une déclaration de sous-réseau :

Option Obligatoire Commentaire
booting non allow,deny,ignore
bootp non allow,deny,ignore
default_lease_time non Temps de location par défaut pour ce sous-réseau (en secondes)
domain_name_servers non Liste de serveurs de noms de domaine pour ce sous-réseau (1)
domain_search non Liste de noms de domaine pour la résolution des non-FQDN (1)
filename non nom de fichier à récupérer depuis le serveur de démarrage
hosts non Liste d'adresses IP fixes pour chaque sous-réseau, similaire à dhcp_hosts
interface non Remplace l'interface de la déclaration de sous-réseau
ip oui Obligatoire. Adresse IP du sous-réseau
max_lease_time non Temps de location maximum pour ce sous-réseau (en secondes)
netmask oui Obligatoire. Masque de réseau du sous-réseau (en notation décimale pointée)
next_server non Adresse IP du serveur de démarrage
ntp_servers non Liste de serveurs NTP pour ce sous-réseau
range_begin non Plus basse adresse dans la plage d'adresses IP dynamiques à attribuer
range_end non Plus haute adresse dans la plage d'adresses IP dynamiques à attribuer
ranges non Si plusieurs plages sont nécessaires, elles peuvent être spécifiées sous forme de liste (2)
routers non Adresse IP de la passerelle pour ce sous-réseau
server_name non Nom du serveur envoyé au client
subnet_mask non Remplace le netmask de la déclaration de sous-réseau
options non Dictionnaire d'options à ajouter à ce sous-réseau

Vous pouvez spécifier des pools d'adresses dans un sous-réseau en définissant les options pools. Cela vous permet de spécifier un pool d'adresses qui sera traité différemment d'un autre pool, même sur le même segment ou sous-réseau. C'est une liste de dictionnaires avec les clés suivantes, toutes optionnelles :

Option Commentaire
allow Spécifie quels hôtes sont autorisés dans ce pool (1)
default_lease_time Le temps de location par défaut pour ce pool
deny Spécifie quels hôtes ne sont pas autorisés dans ce pool
domain_name_servers Les serveurs de noms de domaine à utiliser pour ce pool (1)
failover_peer Spécifie un serveur de secours
max_lease_time Le temps de location maximum pour ce pool
min_lease_time Le temps de location minimum pour ce pool
range_begin L'adresse la plus basse dans ce pool
range_end L'adresse la plus élevée dans ce pool
ranges Si plusieurs plages sont nécessaires, elles peuvent être spécifiées sous forme de liste (2)

(1) Pour les champs allow et deny, les options sont énumérées dans dhcpd.conf(5), mais incluent :

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

(2) Pour des plages de sous-réseau multiples, elles peuvent être spécifiées comme suit :

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

Déclarations d'hôtes

Vous pouvez spécifier des hôtes qui doivent obtenir une adresse IP fixe en fonction de leur MAC en définissant l'option dhcp_hosts. C'est une liste de dictionnaires avec les trois clés suivantes, dont name et mac sont obligatoires :

Option Commentaire
name Le nom de l'hôte
mac L'adresse MAC de l'hôte
ip L'adresse IP à attribuer à l'hôte
hostname Nom d'hôte à attribuer via DHCP (optionnel)
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

Spécifier le serveur PXEBoot

En définissant la variable dhcp_pxeboot_server, vous redirigez les clients PXE vers le serveur PXEBoot spécifié afin de démarrer via le réseau. Le serveur spécifié doit avoir des images de démarrage aux emplacements attendus. Utilisez par exemple bertvv.pxeserver pour le configurer.

Inclusions personnalisées

En définissant la variable dhcp_custom_includes à un modèle jinja, vous pourrez utiliser des configurations personnalisées qui seront ensuite incluses dans le fichier dhcpd.conf. Si le nom du fichier modèle a l'extension .j2, cela sera supprimé du nom de fichier de destination, sinon cela conservera le nom du fichier modèle dans la destination.

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

Le mode par défaut pour le fichier de configuration personnalisé de destination est 0644. Pour le modifier, définissez la variable dhcp_custom_includes_modes. Le filtre zip_longest sera utilisé avec la variable dhcp_custom_includes.

dhcp_custom_includes_modes:
  - '0600'

Vous pouvez créer vos propres variables à utiliser à l'intérieur du modèle, permettant une flexibilité totale. Pour éviter les conflits de variables, assurez-vous d'utiliser des variables qui ne sont pas référencées dans ce rôle car cela dupliquerait la configuration dans plusieurs fichiers .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"

Enfin, le modèle jinja doit contenir une configuration valide ISC DHCPD (dhcpd.conf(5)). Voici un exemple utilisant bertvv.dhcp pour le Zero-Touch-Provisioning 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 %}

#
# Déclarations d'hôtes
#
{% 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 %}

Dépendances

Pas de dépendances.

Exemple de playbook

Voir le playbook de test.

Tests

Pour exécuter les tests de ce playbook, vous devez avoir Molecule, VirtualBox et Vagrant installés. Lancer la commande molecule converge créera une machine virtuelle VirtualBox avec une interface uniquement hôte avec l'adresse IP 192.168.222.2. Pour tester, vous pouvez par exemple utiliser le script nmap dhcp-discover :

$ sudo nmap --script broadcast-dhcp-discover -e vboxnet7
Lancement de Nmap 7.91 ( https://nmap.org ) à 2021-11-30 11:32 CET
Résultats du script pré-scanner :
| broadcast-dhcp-discover:
|   Réponse 1 de 2:
|     Interface: vboxnet7
|     IP Offerte: 192.168.222.50
|     Type de message DHCP: DHCPOFFER
|     Identifiant du serveur: 192.168.222.2
|     Temps de location de l'adresse IP: 5m00s
|     Masque de sous-réseau: 255.255.255.0
|     Serveur de noms de domaine: 10.0.2.3, 10.0.2.4
|     Nom de domaine: example.com
|     Adresse de diffusion: 192.168.222.255
|   Réponse 2 de 2:
|     Interface: vboxnet7
|     IP Offerte: 192.168.222.50
|     Type de message DHCP: DHCPOFFER
|     Identifiant du serveur: 192.168.222.2
|     Temps de location de l'adresse IP: 5m00s
|     Masque de sous-réseau: 255.255.255.0
|     Serveur de noms de domaine: 10.0.2.3, 10.0.2.4
|     Nom de domaine: example.com
|_    Adresse de diffusion: 192.168.222.255
AVERTISSEMENT : Aucun objectif spécifié, donc aucun hôte scanné.
Nmap terminé : 0 adresses IP (0 hôtes actifs) scannés en 10.19 secondes

Licence

BSD

Contribuer

Les problèmes, demandes de fonctionnalités, idées sont les bienvenus et peuvent être publiés dans la section des problèmes. Les demandes de tirage sont également très appréciées. Préférez créer une branche de topic et lors de la soumission, regroupez vos commits en un seul (avec un message descriptif).

Contributeurs

À propos du projet

Ansible role for setting up ISC DHCPD.

Installer
ansible-galaxy install bertvv.dhcp
Licence
other
Téléchargements
124.4k
Propriétaire
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!