2021
Commentaire:
|
4151
|
Texte supprimé. | Texte ajouté. |
Ligne 24: | Ligne 24: |
== Structure == On présentera ici la structure générale du fichier main.py d'un service. C'est le fichier central d'un service et celui lancé par le cron. Il possède les parties suivantes: {{{ #!/usr/bin/env python3 from configparser import ConfigParser from re2oapi import Re2oAPIClient config = ConfigParser() config.read('config.ini') api_hostname = config.get('Re2o', 'hostname') api_password = config.get('Re2o', 'password') api_username = config.get('Re2o', 'username') api_client = Re2oAPIClient(api_hostname,api_username,api_password) }}} Récupération de la config dans le fichier config.ini présent dans le dossier d'au dessus et accessible via un simlink. {{{ for arg in sys.argv: if arg=="--force": plop(api_client) }}} Option permétant de forcer l'execution du service même si re2o ne le demande pas avec l'option --force {{{ def plop(api_client): """Fonction plop qui fait quelque chose d'utile """ }}} Ba la fonction présente dans le service pour qu'il fasse quelque chose. {{{ for service in api_client.list("services/regen/"): if service['hostname'] == client_hostname and \ service['service_name'] == 'mail' and \ service['need_regen']: plop(api_client) api_client.patch(service['api_url'], data={'need_regen': False}) }}} Enfin, la partie qui demande à re2o si le service doit être lancé via un appel à l'API. Ces appels sont la base des service car ils permettent de récuperer les infos nécéssaires pour que le service fonctionne. Ils suivent le fonctionement suivant: {{{ from re2oapi import Re2oAPIClient # Sous dépot commun à tout les services config = ConfigParser() config.read('config.ini') api_hostname = config.get('Re2o', 'hostname') api_password = config.get('Re2o', 'password') api_username = config.get('Re2o', 'username') api_client = Re2oAPIClient(api_hostname,api_username,api_password) # Création de l'utilisateur de l'API infos = api_client.list("categorie/endpoint") # Appel et récupération des infos }}} |
Re2o-services
Description générale
On appelle re2o-services le système général qui permet de générer les fichiers statiques des différents services qui dépendent de la base de donnée. À la base, il y a une API cliente qui permet de communiquer avec le serveur re2o via l'API rest. Plus de détails sont sur le wiki federez re2o. Ensuite, pour chaque service, on a un dépot spécifique, qui sont clonés sur les serveurs pertinents dans /var/local/re2o-services/nom_du_service. Il y a:
Génération des home sur zbee : git
Génération des lease DHCP : git
Génération du firewall : git
Génération des fichiers d'alias mail : git
Génération des zones DNS : git
- and more to come
On évolue un peu dans notre coin pour le moment, attention à être sur la branche crans, il faudra voir pour avoir une politique commune avec Federez, cf re2o.
Fonctionnement
On a un unique fichier config.ini installé et peuplé par bcfg2 sur /var/local/re2o-services/config.ini, puis on link le fichier dans le sous dossiers pertinents. Cf /var/lib/bcfg2/Bundler/re2o-services.xml. Un cron appelle les scripts de manière régulière, on peut set les timings dans /var/lib/bcfg2/Python/etc/cron.d/re2o-services, les dépots sont maj régulièrement par /var/lib/bcfg2/Python/etc/cron.d/pull-repo-re2o-services.
Les services sont régénérés que si il y a besoin, quand re2o leur dit. Si ils se régénèrent correctement, ils le signalent à re2o. On peut voir la gestion côté re2o des services ici.
== Structure == On présentera ici la structure générale du fichier main.py d'un service. C'est le fichier central d'un service et celui lancé par le cron. Il possède les parties suivantes:
from configparser import ConfigParser from re2oapi import Re2oAPIClient config = ConfigParser() config.read('config.ini') api_hostname = config.get('Re2o', 'hostname') api_password = config.get('Re2o', 'password') api_username = config.get('Re2o', 'username') api_client = Re2oAPIClient(api_hostname,api_username,api_password)
Récupération de la config dans le fichier config.ini présent dans le dossier d'au dessus et accessible via un simlink.
for arg in sys.argv: if arg=="--force": plop(api_client)
Option permétant de forcer l'execution du service même si re2o ne le demande pas avec l'option --force
def plop(api_client): """Fonction plop qui fait quelque chose d'utile """
Ba la fonction présente dans le service pour qu'il fasse quelque chose.
for service in api_client.list("services/regen/"): if service['hostname'] == client_hostname and \ service['service_name'] == 'mail' and \ service['need_regen']: plop(api_client) api_client.patch(service['api_url'], data={'need_regen': False})
Enfin, la partie qui demande à re2o si le service doit être lancé via un appel à l'API. Ces appels sont la base des service car ils permettent de récuperer les infos nécéssaires pour que le service fonctionne. Ils suivent le fonctionement suivant:
from re2oapi import Re2oAPIClient # Sous dépot commun à tout les services config = ConfigParser() config.read('config.ini') api_hostname = config.get('Re2o', 'hostname') api_password = config.get('Re2o', 'password') api_username = config.get('Re2o', 'username') api_client = Re2oAPIClient(api_hostname,api_username,api_password) # Création de l'utilisateur de l'API infos = api_client.list("categorie/endpoint") # Appel et récupération des infos