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
ansible-galaxy install bertvv.dhcp