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

1
#!/bin/bash
2
echo "mon adresse IP est $(CreoleGet adresse_ip_eth0)"
3
echo "La base Ldap est stockée dans $(CreoleGet container_path_annuaire)/var/lib/ldap"
4
echo "Le conteneur annuaire a l'adresse : $(CreoleGet container_ip_annuaire)"
5
CreoleRun "ls /var/lib/ldap" annuaire
6
CreoleService slapd restart -c annuaire

ExempleScript compatible EOLE 2.3 et supérieur

1
#!/bin/bash
2
if [ -f /usr/bin/ParseDico ];then
3
RunCmd=RunCmd
4
  . /usr/bin/ParseDico
5
  . /etc/eole/containers.conf
6
  . /usr/share/eole/FonctionsEoleNg
7
else
8
RunCmd=CreoleRun
9
# récupération des variables nécessaires
10
container_path_web=$(CreoleGet container_path_web)
11
nom_machine=$(CreoleGet nom_machine)
12
fi
13
touch "${container_path_web}/etc/${nom_machine}.conf"
14
$RunCmd "chown www-data /etc/${nom_machine}.conf" web
15
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

1
#!/usr/bin/env python3
2
# -*- coding: UTF-8 -*-
3
from creole.client import CreoleClient
4
creole_client = CreoleClient()
5
print ("mon adresse IP est {0}".format(creole_client.get_creole('adresse_ip_eth0')))
6
print ("La base Ldap est stockée dans {0}/var/lib/ldap".format(creole_client.get_creole('container_path_annuaire')))
7
print ("Le conteneur annuaire a l'adresse : {0}".format(creole_client.get_creole('container_ip_annuaire')))
8
from pyeole.process import system_code
9
system_code(['ls', '/var/lib/ldap'], container='annuaire')
10
from pyeole.log import init_logging
11
from pyeole.service import manage_services
12
init_logging(level='info')
13
manage_services('restart', 'slapd', 'annuaire')

ExempleScript compatible EOLE 2.3 et supérieur (modulo le nom de l'interpréteur python)

1
#!/usr/bin/env python3
2
# -*- coding: UTF-8 -*-
3
from pyeole.process import system_code
4
try:
5
    from creole import parsedico
6
    from creole.eosfunc import load_container_var
7
    variables = parsedico.parse_dico()
8
    variables.update(load_container_var())
9
except:
10
    from creole.client import CreoleClient
11
    variables = CreoleClient().get_creole()
12
fichier = open('{0}/etc/{1}.conf'.format(variables['container_path_web'], variables['nom_machine']), 'a')
13
fichier.close()
14
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

1
#!/usr/bin/env python3
2
# -*- coding: UTF-8 -*-
3
from creole.loader import creole_loader, config_save_values
4
config = creole_loader(rw=True)
5
config.creole.interface_0.ssh_eth0 = u'oui'
6
config.creole.interface_0.ip_ssh_eth0.netmask_ssh_eth0[0] = u'255.255.255.255'
7
config.creole.interface_0.ip_ssh_eth0.ip_ssh_eth0[0] = u'192.168.1.1'
8
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