• Les cookies assurent le bon fonctionnement de nos services. En poursuivant votre navigation, vous acceptez l'utilisation de cookies.

Kit de survie Creole 2.4
Cadoles , EOLE

Script

Creole 2.4.1 : Kit de survie

L'objectif de cet article est de vous montrer que les outils de base de la release 2.4.1 de EOLE peuvent être pris en main et être utilisés aussi facilement que ce qui existe pour les anciennes versions. Vous qui passez à la 2.4.1, vous allez pouvoir retrouver vos marques et faire du scripting sans soucis et de manière plus sûre qu'en 2.3.

De manière plus sûre, parce que Creole dispose dorénavant d'un backend de validation des options de configuration qui s'appelle Tiramisu. Tiramisu est un dessert italien rafraîchissant, c'est aussi un contrôleur d'options de configuration mis à disposition par la société Cadoles en tant que librairie python ici. (doc développeur).

Qu'est-ce qu'un contrôleur d'options ? Regardons ce que nous dit Wikipedia :

le contrôle d'options comprend une évaluation de tous les changements ou propositions de changements et les autorise ou les interdit suivant des contraintes données.
C'est pour ça que le end user developer, c'est-à-dire celui qui est amené à récupérer une variable Creole, à l'insérer dans des scripts, etc... Doit passer par une API pour accéder aux variables Creole.

Au prompt ou bien dans un script bash, pour récupérer une variable Creole, on procède de la manière suivante :

root@amon:~# CreoleGet MaVariable
mavaleur
root@amon:~#
Bien sûr, il faut que la variable Creole existe :
root@amon:~# CreoleGet toto
root - Variable inconnue toto
root@amon:~#
Par exemple, pour la variable Creole adresse_ip_eth0:
root@amon:~# CreoleGet adresse_ip_eth0
192.168.1.1
root@amon:~#
Cette commande CreoleGet utilise un contrôleur de configuration chargé par un démon qui s'appelle creoled. CreoleGet renvoie les valeurs des variables de dictionnaire Creole. Ce qui est fait en plus en background, c'est que ces valeurs sont validées et garanties cohérentes les unes par rapport aux autres. Par exemple, essayons de modifier une variable Creole alors que le serveur n'est pas instancié :
root@amon:~# CreoleSet type_amon 3zones
Erreur de propriété : La variable obligatoire 'adresse_ip_eth0' 
de la famille 'Interface_0' n'est pas renseignée !
La variable obligatoire 'ip_ssh_eth0' de la famille 'Interface_0' n'est pas renseignée !
...
Voilà. Tiramisu est derrière et il vérifie tout en just-in-time.

A partir de là, ces deux commandes CreoleGet et CreoleSet peuvent facilement être utilisées dans un script bash, exemple :

for container in $(ls /tmp/containers/iptables/); do
        container_name=${container%%.*}
        container_path=$(CreoleGet container_path_$container_name)
done
Mais il n'y a pas que le bash : python c'est bon. Mettez-vous au python, vous pourrez faire plus de choses et aller plus loin qu'avec le simple bash. Donc, si par hasard votre script est un script python, pour récupérer tout le dictionnaire Creole il suffit d'importer la fonction creole_loader comme ceci :
>>> from creole.loader import creole_loader 
>>> cfg = creole_loader()
>>> cfg
[creole]
[containers]
... 
Vous accédez ainsi à toute la configuration (qui ici a été placée dans la variables python cfg). Vous accédez par exemple aux familles Creole et aux groupes de variables Creole :
>>> cfg.creole
[containers]
[general]
[services]
[firewall]
[systeme]
...
Pour accéder à une variable Creole en python, tout est rangé dans des espaces de nommage correspondant aux groupes et aux "familles", et en python on accède aux espaces de nommages avec la notation pointée, exemple :
>>> cfg.creole.general.nom_machine
u'amon'
>>> 
La valeur de la variable nom_machine de la famille Creole "général" est amon. C'est l'équivalent du CreoleGet. Et voici pour l'équivalent du CreoleSet :
>>> cfg.creole.general.nom_machine = u'horus'
>>> cfg.creole.general.nom_machine
u'horus'
>>>
Constatons que c'est tout simplement l'affectation d'une valeur (signe =) en python. Mais avec creole_loader, contrairement à tout à l'heure avec CreoleGet et CreoleSet, nous chargeons un nouveau contrôleur de configuration. Une autre manière qui évite de charger toute la configuration est d'utiliser le client Creole :
>>> from creole.client import CreoleClient
>>> cli = CreoleClient()
>>> cli.get("/creole/general/nom_machine")
u'amonecole'
>>> 
C'est dans les templates Creole qu'on utilise plus le client Creole. Pour accéder au client, rajouter le préfixe %% habituel à la syntaxe Creole :
%%creole_client.get('creole.general.nom_machine')
permettra de récupérer le nom de la machine une fois le template instancié.

Mais on n'est pas obligé de passer par le python pour accéder à la structure arborescente des variables. Bien que les services d'accès aux variables Creole CreoleGet et CreoleSet "aplatissent" cette structure, il est possible d'accéder aux variables en spécifiant précisément leur path, leur chemin dans l'arborescence. Exemple:

CreoleGet creole.interface_0.adresse_ip_eth0
192.168.5.148
est équivalent à :
CreoleGet adresse_ip_eth0
192.168.5.148
Mais quel est l'intérêt ? On accède ainsi à plus de variables. Ce sont les extras :

Les variables externes à l'espace de nommage Creole (extras)

Prenons l'exemple de bacula : il y a des variables bacula dans les templates Creole, ces variables semblent ne pas être présentes dans les dictionnaires Creole :
CreoleGet bacula_mon_password
root - Variable inconnue bacula_mon_password
C'est normal. Cette variable bacula_mon_password n'est pas dans l'espace de nommage creole mais dans un autre espace de nommage (celui de bacula) :
CreoleGet bacula.monitor.bacula_mon_password
6ba18c42f8fc62d37d6bfc6f830a902dcc68300c27b05a76c01cddfd
On accède bien ici à une variable bacula_mon_password. Mais il faut passer par la notation pointée pour y accéder. Autre exemple :
CreoleGet mail_ok
root - Variable inconnue mail_ok
La variable mail_ok existe. Elle est juste présente dans un espace de nommage différent de celui de Creole :
CreoleGet bacula.mail.mail_ok

Par défaut la valeur de mail_ok est une chaine vide, ce qui est différent de "Variable inconnue", car ça veut dire que la variable en question existe bel et bien.

Ces variables ne sont pas accessible avec l'éditeur gen_config. Elles sont définies sur le serveur dans /usr/share/eole/creole/extra. Le mode de définition de ces variable se fait par fichier XML suivant la même DTD que les dictionnaire Creole, en fait ce sont des dictionnaires Creole mais la différence, rappelons le, est que les définitions issues de ces dictionnaires ne sont pas placées dans l'espace de nommage creole.

Accéder aux variables dans les templates Creole

Dans les templates Creole on peut accéder indifféremment aux variables Creole par leur nom en les préfixant de la notation Creole %%, par exemple dans le template Creole smb.conf, pour accéder à la variable adresse_ip_eth0 :
interfaces = 127.0.0.1 %%adresse_ip_eth0
C'est le plus fréquent. Mais il arrive qu'on veuille accéder à des variables qui sont dans un espace de nommage différent :
Console {
  Name = bacula-%%{nom_machine}-mon
  Password = %%creole_client.get('bacula.monitor.bacula_mon_password')
  CommandACL = status, .status
}
Dans cet exemple, pour pouvoir accéder à la variable bacula_mon_password, on utilise la fonction prédéfinie get du module creole_client avec comme paramètre le chemin complet d'accès à la variable en question.

Autres outils de base Creole

En plus de CreoleGet et de CreoleSet, d'autres outils sont mis à disposition, à savoir :
  • CreoleCat : permet de générer un template (instancier un template Creole) sans lancer le "reconfigure". Très pratique (faire un CreoleCat --help pour connaître les options d'usage)
  • CreoleLint : outil de validation des dictionnaires, templates... etc de Creole. Très utile, un peu trop verbeux parfois ;)

Commentaires

Aucun commentaire pour l'instant, soyez le premier !

Cadoles recrute !

Nous recherchons de nouveaux coopérateurs :