Created: 2023-03-28 mar. 13:50
PLMParty 2022 : il faut refaire la gestion des DNS Mathrice
ns1.math.cnrs.fr
Une zone DNS = un projet git
Gérer les autorisations sur la zone par les permissions sur le projet
L’intégration continue doit :
Gitlab, et en particulier :
À retenir :
main
Limpide non ? git push => ça réagit
Octobre 2022
Quelques évolutions depuis, mais mineure
dns <- Groupe Gitlab ├── ci <- scripts d'intégration continue ├── dns0 <- mise en place du serveur DNS └── zones <- Groupe Gitlab zones ├── lollipop.org <- projet zone └── mazone.math.cnrs.fr <- projet zone
Exemple de dépôt pour une zone :
lollipop.org/ ├── lollipop.org.data <- le fichier zone ├── metadata.json <- optionnel, pour des usages avancés └── README.md <- instructions pour utilisation
Pour proposer une nouvelle version d’une zone, le gestionnaire de zone doit :
Chaque projet zone est configuré pour interdire les push direct sur la branche main
.
groupe de runers quelconques : MR -> vérifier la zone -> accepter la MR
runner sur le serveur DNS : main mis à jour -> mise à jour du serveur DNS
Pipeline déclenché par la demande de MR
named-checkzone
fourni avec bind
pour vérifier la syntaxe de la zoneMR Result Pipelines : PREMIUM only
Il faut passer par l’API
GITLAB="https://plmlab.math.cnrs.fr/api/v4/" cat <<EOF > mr.json { "id": "${CI_PROJECT_ID}", "merge_request_iid": "${CI_MERGE_REQUEST_IID}", "merge_when_pipeline_succeeds": true } EOF curl -v --request PUT --header "PRIVATE-TOKEN: ${apiToken}" \ --header "Content-Type: application/json" --data @mr.json \ "${GITLAB}/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/merge"
J’ai appris pas mal de choses sur ce projet, voici un florilège
Le plus important : installer dès que possible un gitlab-runner local => accélère grandement le cycle de mise au point
Tous les projets de zone DNS partagent la même configuration.
Dans la config de chaque projet : Settings > CICD > General Pipelines
Principe : dans le .gitlab-ci.yml
, on rajoute des tags
à un ou plusieurs jobs.
check-zone-syntax: tags: [merge-zone] stage: test script: - /bin/check-zone-syntax only: - merge_request
Les runners doivent être lancés avec l’option adéquate pour ne prendre que les tags voulus.
dns
init-zones.sh
: génère /etc/bind/zones
en clonant tous les projets du groupe dns/zones
=> un répertoire est créé pour chaque zone
script update-conf.sh
génère /etc/bind/mathrice-zones
Ce fichier est à inclure dans la configuration du serveur, par exemple dans named.conf.local
:
# mathrice-zones is generated from all repositories # in plmlab:plmteam/services/dns/zones include "/etc/bind/mathrice-zones";
Exemple
zone gricad.cloud.math.cnrs.fr { type master; file "/etc/bind/zones/gricad.cloud.math.cnrs.fr/gricad.cloud.math.cnrs.fr.data"; allow-query { any; }; }; zone ijclab.cloud.math.cnrs.fr { type master; file "/etc/bind/zones/virtualdata.cloud.math.cnrs.fr/virtualdata.cloud.math.cnrs.fr.data"; allow-query { any; }; }; zone virtualdata.cloud.math.cnrs.fr { type master; file "/etc/bind/zones/virtualdata.cloud.math.cnrs.fr/virtualdata.cloud.math.cnrs.fr.data"; allow-query { any; }; };
Chaque projet de zone va déclencer le runner local :
update-master
uniquement les nouvelles versions sur la branche main
Le runner doit réaliser les actions suivantes :
git stash
pour les modifications locales sur le serialrdnc reload <zone name>
en cas d’échec, retour à la version du commit de départ, et récupération du git stash
Fichier de zone minimal
$TTL 86400 @ IN SOA ns1.example.com. hostmaster.example.com. ( 2022030901 ; serial <------ valeur à mettre à jour !!! 3600 ; refresh 1800 ; retry 604800 ; expire 86400 ; minimum TTL ) @ IN NS ns1.example.com. ns1 IN A 192.0.2.1
valeur maximale du serial : 2 147 483 647
Pour utiliser un classique codage YYYYMMDDHHSS
: on ne peut aller que jusqu’en 2038 :-(
Solution : utiliser une incrémentation classique, gérée par le serveur
Toujours par API, le runner du serveur va stocker dans chaque projet une variable contenant le SN courant
Cela permet de ne pas être limité sur le nombre d’incrémentations chaque jour.
script en haskell :
=> la syntaxe très lâche d’un fichier de zone a été pénible à gérer …
Rajout d’un fichier optionnel metadata.json
dans les dépôt de zones
=> gestion de cas avancées
un fichier pour gérer 2 zones identiques
metadata.json
:
{ "zones": [ "ijclab.cloud.math.cnrs.fr", "virtualdata.cloud.math.cnrs.fr" ] }
gestion de zones dynamiques
metadata.json
:
{ "dynamic": true }
Avancée: