Indications pour la programmation
Certaines fonctions ont été intégrées sur les modules afin que les scripts puissent être écrits en tenant compte des spécificités des modules EOLE, que sont les variables et le mode conteneur.
Programmation bash
obtenir la valeur d'une variable (variables de conteneur comprises) :
CreoleGet <variable_name>
obtenir la valeur d'une variable ou une valeur prédéfinie en cas d'erreur :
CreoleGet <variable_name> <default_value>
modifier la valeur d'une variable :
CreoleSet <variable_name> <new_value>
exécution d'une commande dans un conteneur :
CreoleRun "<command>" <container>
redémarrage d'un service dans un conteneur :
CreoleService -c <container> <service_name> restart
ExemplePetit script bash
echo "mon adresse IP est $(CreoleGet adresse_ip_eth0)"
echo "La base Ldap est stockée dans $(CreoleGet container_path_annuaire)/var/lib/ldap"
echo "Le conteneur annuaire a l'adresse : $(CreoleGet container_ip_annuaire)"
CreoleRun "ls /var/lib/ldap" annuaire
CreoleService slapd restart -c annuaire
ExempleScript compatible EOLE 2.3 et supérieur
if [ -f /usr/bin/ParseDico ];then
RunCmd=RunCmd
. /usr/bin/ParseDico
. /etc/eole/containers.conf
. /usr/share/eole/FonctionsEoleNg
else
RunCmd=CreoleRun
# récupération des variables nécessaires
container_path_web=$(CreoleGet container_path_web)
nom_machine=$(CreoleGet nom_machine)
fi
touch "${container_path_web}/etc/${nom_machine}.conf"
$RunCmd "chown www-data /etc/${nom_machine}.conf" web
ls -al "${container_path_web}/etc/${nom_machine}.conf"
Truc & astuce
CreoleGet
permet également d'accéder aux variables "extra" :
CreoleGet schedule.schedule.hour
Programmation Python
obtenir la valeur d'une variable (variables de conteneur comprises) :
from creole.client import CreoleClient
CreoleClient().get_creole('<variable_name>')
obtenir la valeur d'une variable ou une valeur prédéfinie en cas d'erreur :
from creole.client import CreoleClient
CreoleClient().get_creole('<variable_name>', '<default_value>')
obtenir l'ensemble des variables dans un dictionnaire :
from creole.client import CreoleClient
dico = CreoleClient().get_creole()
adresse_ip_eth0 = dico['adresse_ip_eth0']
# cas particulier: pour les variables 'esclaves' d'un groupe, préfixer par la variable maître
sso_first_base_ldap = dico['eolesso_ldap.eolesso_base_ldap'][0]
obtenir la valeur d'une esclave correspond à une master :
master = client.get_creole('master')
slave = client.get_creole('slave')
for idx, var in enumerate(master):
print "master : {0}, slave : {1}".format(var, slave[idx])
exécution d'une commande dans un conteneur (affichage à l'écran) :
from pyeole.process import system_code
system_code([<commande_sous_forme de liste>], container='<conteneur>')
exécution d'une commande dans un conteneur (sorties dans un tuple) :
from pyeole.process import system_out
system_out([<commande_sous_forme de liste>], container='<conteneur>')
redémarrage d'un service dans un conteneur (avec affichage à l'écran)
from pyeole.log import init_logging
from pyeole.service import manage_service
init_logging(level='info')
manage_service('restart', '<service>', '<conteneur>')
ExemplePetit script Python
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from creole.client import CreoleClient
creole_client = CreoleClient()
print ("mon adresse IP est {0}".format(creole_client.get_creole('adresse_ip_eth0')))
print ("La base Ldap est stockée dans {0}/var/lib/ldap".format(creole_client.get_creole('container_path_annuaire')))
print ("Le conteneur annuaire a l'adresse : {0}".format(creole_client.get_creole('container_ip_annuaire')))
from pyeole.process import system_code
system_code(['ls', '/var/lib/ldap'], container='annuaire')
from pyeole.log import init_logging
from pyeole.service import manage_services
init_logging(level='info')
manage_services('restart', 'slapd', 'annuaire')
ExempleScript compatible EOLE 2.3 et supérieur (modulo le nom de l'interpréteur python)
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from pyeole.process import system_code
try:
from creole import parsedico
from creole.eosfunc import load_container_var
variables = parsedico.parse_dico()
variables.update(load_container_var())
except:
from creole.client import CreoleClient
variables = CreoleClient().get_creole()
fichier = open('{0}/etc/{1}.conf'.format(variables['container_path_web'], variables['nom_machine']), 'a')
fichier.close()
system_code(['chown', 'www-data', '/etc/{0}.conf'.format(variables['nom_machine'])], container='web')
Modification de variables
Du fait des dépendances entre variables certaines modifications ne sont pas réalisables avec la commande CreoleSet
.
C'est notamment le cas pour les variables groupées qui doivent impérativement posséder le même nombre d'éléments au moment de l'enregistrement ou pour des variables de type oui/non
qui permettent de débloquer des variables à caractère obligatoire.
L'exemple qui suit montre comment activer l'autorisation des connexion SSH pour un couple adresse IP / masque de sous-réseau.
Exemple
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from creole.loader import creole_loader, config_save_values
config = creole_loader(rw=True)
config.creole.interface_0.ssh_eth0 = u'oui'
config.creole.interface_0.ip_ssh_eth0.netmask_ssh_eth0[0] = u'255.255.255.255'
config.creole.interface_0.ip_ssh_eth0.ip_ssh_eth0[0] = u'192.168.1.1'
config_save_values(config, 'creole')
Remarque
Pour accéder à une variable esclave, il faut connaître le nom de sa famille et celui de la variable maître associée.
Les valeurs doivent être saisies en Unicode[1], qui en python se traduit par l'ajout du caractère u devant la chaîne de caractères.
Cette obligation ne concerne pas les variables de type number
qui attendent un nombre entier :
config.creole.systeme.bash_tmout = 3600