Industrialiser l’installation de BlueMind avec Ansible

L’installation standard d’une plate-forme BlueMind est simple et demande peu d’étapes, une fois l’architecture définie. Cependant il existe des cas ou une installation doit être industrialisée pour être rejouée de nombreuses fois. C’est le cas par exemple pour un hébergeur ou un client avec un très grand nombre d’utilisateurs et plusieurs plate-formes.

Ansible est un moteur d’automatisation qui permet ce type d’industrialisation. Ce billet détaille une mise en œuvre de BlueMind via Ansible mais il est tout à fait possible de s’appuyer sur d’autres outils tel que Saltstack, Puppet ou Chef.

Qu’est-ce qu’Ansible ?

Ansible est un outil d’automatisation informatique qui facilite le déploiement de vos applications et systèmes. Elle évite l’écriture de scripts ou de code personnalisé pour déployer ou mettre à jour une application.

Ansible a pour avantage de s’abstenir d’un agent de déploiement sur le serveur cible car l’ensemble des instructions d’installation et de configuration est exécuté à l’aide de l’agent SSH, largement déployé sur les serveurs linux.

Concrètement, Ansible peut automatiser trois types de tâches :

  • Le provisionning : mettre en place les différents serveurs dont vous avez besoin dans votre infrastructure.
  • La gestion de la configuration : modifier la configuration d’une application, d’un système d’exploitation ou d’un périphérique, démarrer et arrêter des services, installer ou mettre à jour des applications, mettre en œuvre une stratégie de sécurité, ou effectuer une grande variété d’autres tâches de configuration.
  • Le déploiement d’applications : faciliter le développement en automatisant le déploiement d’applications développées en interne sur vos systèmes de production.

Dans ce billet nous ferons le point sur l’utilisation d’Ansible par BlueMind au travers de l’automatisation des tâches d’administration système répétitives. Pour en savoir plus sur la façon d’utiliser Ansible, nous recommandons le nouveau parcours d’apprentissage « Introduction à Ansible » de Cloud Academy.

Ansible et BlueMind

Notre objectif n’est pas de vous familiariser avec Ansible, mais de vous faire découvrir nos méthodes de déploiement au travers de ce produit.

  • Respect des règles de déploiement

Il existe différentes méthodes pour aborder un déploiement au travers d’Ansible. La méthode présentée s’appuie sur un fichier d’inventaire, qui contient le ou les serveurs BlueMind à installer, des rôles propres à BlueMind mis à disposition par nos équipes à l’aide de dépôts git, et enfin, des playbooks exemples pour ordonner les opérations.

  • Harmonisation des installations

L’usage d’Ansible présente de nombreux avantages. Si vous déployez de nombreuses instances BlueMind pour différents clients, cela vous fera économiser du temps. Vous pourrez notamment harmoniser les configurations en fonction des clients et des usages, de manière à industrialiser le déploiement des installations, limitant ainsi les disparités entre les instances BlueMind.

Aussi, dans un autre contexte, vous pouvez vous appuyer sur Ansible pour déployer vos environnements de développement, qualification, pré-production et de production, de manière à garantir des configurations identiques. Cela permet notamment de maximiser la réussite de vos projets de déploiement ou de mise à jour.

Pour la suite de l’article, nous nous intéresserons au déploiement d’un simple serveur BlueMind pouvant accueillir plusieurs centaines d’utilisateurs. Dans un second temps, nous verrons qu’il est possible de déployer une instance BlueMind composée de deux serveurs BlueMind, un serveur core et un serveur back end de données qui contiendra les données des utilisateurs. 

Enfin, nous verrons les perspectives d’évolution et qu’il est tout à fait possible de s’inspirer des rôles existants pour déployer un serveur elasticsearch dédié ou encore un serveur bm-edge. On pourrait aussi envisager un mécanisme de disaster recovery, qui se chargerait de remonter un serveur complet en cas de perte totale du serveur, et en s’appuyant sur les sauvegardes.

Environnement : 

Pré-requis : un serveur Ansible installé. Dans notre cas, il ne s’agit pas de la dernière version mais les rôles sont tout à fait compatibles : 

root@nmc-Ansible:~# Ansible --version 
Ansible 2.7.5 
  config file = /etc/Ansible/Ansible.cfg 
  configured module search path = [u'/root/.Ansible/plugins/modules', u'/usr/share/Ansible/plugins/modules'] 
  Ansible python module location = /usr/lib/python2.7/dist-packages/Ansible 
  executable location = /usr/bin/Ansible 
  python version = 2.7.13 (default, Sep 26 2018, 18:42:22) [GCC 6.3.0 20170516] 

Installation d’un serveur BlueMind: 

Ansible-galaxy install -r u500_requirements.yml 
- extracting bluemind_requirements to /etc/Ansible/roles/bluemind_requirements 
- bluemind_requirements (master) was installed successfully 
- extracting bluemind_single_server to /etc/Ansible/roles/bluemind_single_server 
- bluemind_single_server (master) was installed successfully 

La commande Ansible-galaxy permet de télécharger tous les rôles mis à disposition sur git. A noter que de nouvelles versions pourraient voir le jour à court et moyen terme.

  • Créer le playbook de cette manière : 
root@nmc-Ansible:/etc/Ansible# cat playbooks/bm/bluemind_single_server.yml 
--- 
- name: Configuring BlueMind requirements 
  hosts: all 
  become: yes 
  become_method: su 
  
  roles: 
    - bluemind_requirements 
    - bluemind_single_server 
  • Créer votre fichier d’inventaire. Dans notre cas, on s’appuie sur un fichier yml, disponible dans /etc/Ansible/inventory 

cat inventory/bluemind_single_server.yml

bluemind_single_server: 
  hosts: 
    nmc-core.blue-mind.loc: 
      Ansible_host: 192.168.0.15 
      Ansible_become_password: « SET_ROOT_PASSWORD_HERE" 
      Ansible_ssh_common_args: '-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' 
      Ansible_user: bluemind 
  vars: 
    sw_password: "admin" 
    external_url: "mail.blue-mind.loc" 
    subscription_contact: "admin@blue-mind.loc" 
    local_works_directory: "/usr/local/bluemind/" 
    email_domain: "blue-mind.loc" 
    subscription_file: "/usr/local/bluemind/subscribe.bmz" 

Quelques explications ici : 

On désigne des variables globales, nécessaires pour renseigner :

  •  L’adresse publique d’accès au serveur représenté par vars.external_url
  •  Le nom du contact pour recevoir les notifications liés à la souscription via vars.subscription_contact
  •  Email_domain qui représente le domaine par défaut que vous souhaitez créer.
  • Sw_password qui désigne le mot de passe à renseigner pour le /setup et pour l’accès à la console tick, si vous choisissez de l’installer.
  • Local_works_directory est un emplacement permettant de stocker des informations nécessaires dans l’exécution des rôles Ansible. On vous recommandera de créer un dossier par client par exemple.
  • subscription_file est l’emplacement du fichier de souscription, nécessaire à l’installation par Ansible.

Lancer l’installation : 

Ansible-playbook -l bluemind_single_server playbooks/bm/bluemind_single_server.yml 
  
PLAY [Configuring BlueMind requirements] 
*********************

TASK [Gathering Facts] 
*********************

ok: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements :  Load Operating System : Debian 9] 
*********************

ok: [nmc-core.blue-mind.loc] => (item=/etc/Ansible/roles/bluemind_requirements/vars/debian_family.yml) 
  
TASK [bluemind_requirements : include_tasks] 
*********************

skipping: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : include_tasks] 
*********************

included: /etc/Ansible/roles/bluemind_requirements/tasks/debian.yml for nmc-core.blue-mind.loc 
  
TASK [bluemind_requirements : assert] 
*********************
 
ok: [nmc-core.blue-mind.loc] => { 
    "changed": false, 
    "msg": "All assertions passed" 
} 
  
TASK [bluemind_requirements : set /etc/hostname] 
*********************

ok: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Ensure en_US.UTF-8 locale exists] 
*********************

changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Set LC_ALL] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Set LANG] 
*********************

changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Install apt Packages] 
*********************

changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Update] 
*********************

ok: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Upgrade apt packages] 
*********************
 
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Install your subscribe file] 
*********************

changed: [nmc-core.blue-mind.loc -> localhost] 
  
TASK [bluemind_requirements : Copy BlueMind repository file into the server] 
*********************

changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Adding BlueMind Public Key] 
*********************

changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Configure BM repository priority] 
*********************
 
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : apt_repository] 
*********************

skipping: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Update repositories] 
*********************

changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_single_server : include_tasks] 
*********************

skipping: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_single_server : include_tasks] 
*********************

included: /etc/Ansible/roles/bluemind_single_server/tasks/debian.yml for nmc-core.blue-mind.loc 
  
TASK [bluemind_single_server : Install BlueMind Packages] 
*********************

changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_single_server : Install BlueMind] 
*********************

changed: [nmc-core.blue-mind.loc] 
  
PLAY RECAP 
*********************

nmc-core.blue-mind.loc     : ok=19   changed=12   unreachable=0    failed=0 

Une fois l’installation terminée, il ne vous reste plus qu’à configurer votre serveur.

Le rôle bluemind_requirements permet de pousser la souscription sur le ou les serveurs bluemind. La souscription est récupérée d’après le fichier de souscription bmz qui doit être renseigné dans les variables du groupe « bluemind_single_server ».

Il permet également de vérifier que la configuration du système est celle attendue par BlueMind.

Depuis BlueMind 4.1, il est aussi possible de lancer les mises à jour de BlueMind en ligne de commande. Ainsi, pour une mise à jour, il ne vous restera plus qu’à lancer un playbook pour que les paquets BlueMind soient mis à jour et pour que le /setup se joue, sans avoir à se connecter sur l’interface Web. 

Attention, n’oubliez pas de lancer ce type d’instruction dans un screen/tmux ou autre outil similaire.

Mise à jour du serveur BlueMind : 

root@nmc-Ansible:/etc/Ansible# Ansible-playbook -l bluemind_single_server playbooks/bm/bluemind_upgrade.yml 
  
PLAY [Configuring BlueMind requirements] 
*********************

TASK [Gathering Facts] 
*********************

ok: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_upgrade : include_tasks] 
*********************
skipping: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_upgrade : include_tasks] 
*********************
included: /etc/Ansible/roles/bluemind_upgrade/tasks/debian.yml for nmc-core.blue-mind.loc 
  
TASK [bluemind_upgrade : apt update cache] 
*********************
ok: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_upgrade : Verify aptitude package] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_upgrade : apt update & clean] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_upgrade : apt dist-upgrade] 
*********************
ok: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_upgrade : shell] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
PLAY RECAP 
*********************
nmc-core.blue-mind.loc     : ok=7    changed=3    unreachable=0    failed=0   

Installation d’un shard + d’un core : 

Dans ce second exemple, nous allons installer un serveur core BlueMind et déporter les données des messages, contacts, calendriers, etc, sur un serveur dédié (nommé shard dans le jargon BlueMind).

De la même manière, récupérer le fichier u1000_requirements.yml, mis à disposition sur ce lien

Ansible-galaxy install -r u1000_requirements.yml

De la même manière, on retrouve des variables : 

--- 
  
bluemind: 
  hosts: 
    nmc-core.blue-mind.loc: 
      Ansible_host: 192.168.0.15 
      Ansible_become_password: "SET_ROOT_PASSWORD_HERE" 
      Ansible_ssh_common_args: '-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' 
      Ansible_user: bluemind 
    nmc-data.blue-mind.loc: 
      Ansible_host: 192.168.0.16 
      Ansible_become_password: "SET_ROOT_PASSWORD_HERE" 
      Ansible_ssh_common_args: '-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' 
      Ansible_user: bluemind 
  vars: 
    sw_password: "admin" 
    external_url: "mail.blue-mind.loc" 
    tick_module: true 
    synchro_ldap_module: false 
    subscription_contact: "admin@blue-mind.loc" 
    synchro_ad_module: false 
    local_works_directory: "/usr/local/bluemind/" 
    email_domain: "blue-mind.loc" 
    subscription_file: "/usr/local/bluemind/subscribe.bmz" 
    shardip: "192.168.0.16" 
    export_ldap_module: false 
    core_server_fqdn: "nmc-core.blue-mind.loc" 

Dans ce cas, on embarque dans le rôle bluemind_core, la possibilité d’installer directement les modules tick, de synchronisation LDAP ou AD, ou encore l’export LDAP.

On pourrait très bien envisager l’apparition de nouveau module pour déployer bm-mapi ou encore la signature d’entreprises.

root@nmc-Ansible:/etc/Ansible# Ansible-playbook -l bluemind playbooks/bm/bluemind_core_cyrus.yml 
  
PLAY [Configuring BlueMind requirements] 
*********************
  
TASK [Gathering Facts] 
*********************
ok: [nmc-core.blue-mind.loc] 
ok: [nmc-data.blue-mind.loc] 
  
TASK [bluemind_requirements :  Load Operating System : Debian 9] 
*********************
ok: [nmc-data.blue-mind.loc] => (item=/etc/Ansible/roles/bluemind_requirements/vars/debian_family.yml) 
ok: [nmc-core.blue-mind.loc] => (item=/etc/Ansible/roles/bluemind_requirements/vars/debian_family.yml) 
  
TASK [bluemind_requirements : include_tasks] 
*********************
skipping: [nmc-data.blue-mind.loc] 
skipping: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : include_tasks] 
*********************
included: /etc/Ansible/roles/bluemind_requirements/tasks/debian.yml for nmc-data.blue-mind.loc, nmc-core.blue-mind.loc 
  
TASK [bluemind_requirements : assert] 
*********************
ok: [nmc-data.blue-mind.loc] => { 
    "changed": false, 
    "msg": "All assertions passed" 
} 
ok: [nmc-core.blue-mind.loc] => { 
    "changed": false, 
    "msg": "All assertions passed" 
} 
  
TASK [bluemind_requirements : set /etc/hostname] 
*********************
ok: [nmc-core.blue-mind.loc] 
ok: [nmc-data.blue-mind.loc] 
  
TASK [bluemind_requirements : Ensure en_US.UTF-8 locale exists] 
*********************
ok: [nmc- core.blue-mind.loc] 
changed: [nmc-data.blue-mind.loc] 
  
TASK [bluemind_requirements : Set LC_ALL] 
*********************
ok: [nmc-core.blue-mind.loc] 
changed: [nmc-data.blue-mind.loc] 
  
TASK [bluemind_requirements : Set LANG] 
*********************
changed: [nmc-data.blue-mind.loc] 
ok: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Install apt Packages] 
*********************
changed: [nmc-core.blue-mind.loc] 
changed: [nmc-data.blue-mind.loc] 
  
TASK [bluemind_requirements : Update] 
*********************
ok: [nmc-data.blue-mind.loc] 
ok: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Upgrade apt packages] 
*********************
changed: [nmc-data.blue-mind.loc] 
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Install your subscribe file] 
*********************
changed: [nmc-data.blue-mind.loc -> localhost] 
changed: [nmc-core.blue-mind.loc -> localhost] 
  
TASK [bluemind_requirements : Copy BlueMind repository file into the server] 
*********************
changed: [nmc-core.blue-mind.loc] 
changed: [nmc-data.blue-mind.loc] 
  
TASK [bluemind_requirements : Adding BlueMind Public Key] 
********************* 
changed: [nmc-data.blue-mind.loc] 
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Configure BM repository priority] 
*********************
changed: [nmc-data.blue-mind.loc] 
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : apt_repository] 
*********************
skipping: [nmc-data.blue-mind.loc] 
skipping: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_requirements : Update repositories] 
*********************
changed: [nmc-data.blue-mind.loc] 
changed: [nmc-core.blue-mind.loc] 
  
PLAY [Install BlueMind Data] 
*********************
  
TASK [Gathering Facts] 
*********************
ok: [nmc-data.blue-mind.loc] 
  
TASK [bluemind_cyrus : include_tasks] 
*********************
skipping: [nmc-data.blue-mind.loc] 
  
TASK [bluemind_cyrus : include_tasks] 
*********************
included: /etc/Ansible/roles/bluemind_cyrus/tasks/debian.yml for nmc-data.blue-mind.loc 
  
TASK [bluemind_cyrus : Install BlueMind Packages] 
*********************
changed: [nmc-data.blue-mind.loc] 
  
TASK [bluemind_cyrus : Install Tick Packages] 
*********************
changed: [nmc-data.blue-mind.loc] 
  
PLAY [Install BlueMind Core] 
*********************
  
TASK [Gathering Facts] 
********************* 
ok: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : include_tasks] 
*********************
skipping: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : include_tasks] 
*********************
included: /etc/Ansible/roles/bluemind_core/tasks/debian.yml for nmc-core.blue-mind.loc 
  
TASK [bluemind_core : Install BlueMind Packages] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : Install Tick Packages] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : Install Export LDAP Packages] 
*********************
skipping: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : Install Synhcro LDAP Packages] 
*********************
skipping: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : Install Synchro AD Packages] 
*********************
skipping: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : Install and configure Core Service with a shard server] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : Install and configure Core Service] 
*********************
skipping: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : Fetch mcast.id] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : Fetch bm-core.tok] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : Disabled bm-cyrus-imapd if shard is defined] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : Disabled bm-lmtpd if shard is defined] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
TASK [bluemind_core : Configure Tick] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
RUNNING HANDLER [bluemind_core : restart NGINX] 
********************* 
changed: [nmc-core.blue-mind.loc] 
  
RUNNING HANDLER [bluemind_core : stop bm-cyrus-imapd] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
RUNNING HANDLER [bluemind_core : stop bm-lmtpd] 
*********************
changed: [nmc-core.blue-mind.loc] 
  
PLAY RECAP 
*********************
nmc-core.blue-mind.loc     : ok=29   changed=18   unreachable=0    failed=0    
nmc-data.blue-mind.loc     : ok=20   changed=12   unreachable=0    failed=0    

Enfin, de la même manière, le déploiement d’une instance BlueMind composée d’un serveur core, d’un serveur back end de données et d’un serveur elasticsearch dédié, est possible au travers des exemples pour un déploiement de 3000 utilisateurs.

Pour conclure…

L’un des principaux défis de l’installation d’une nouvelle messagerie est de permettre une intégration et un déploiement continus sans temps d’arrêt. Traditionnellement, cela nécessite beaucoup de travail de codage avec de multiples outils, et donc beaucoup de temps et de ressources.

Ansible est un puissant outil d’automatisation open source qui réduit ce temps et ces ressources au minimum possible tout en garantissant la disponibilité du service. Sur des installations avec de nombreux utilisateurs BlueMind permet, avec Ansible, de diminuer les temps d’arrêts, minimiser les erreurs de manipulations humaines et de gagner un temps précieux.

De multiples rôles complémentaires verront le jour prochainement, permettant notamment de lancer une tâche planifiée, de configurer le système BlueMind ou de configurer la signature d’entreprise, la synchro LDAP, etc.

Ansible est utilisé dans cet article. Il est tout à fait possible de s’appuyer sur d’autres outils tel que Saltstack, Puppet ou Chef. BlueMind peut vous accompagner dans la transformation des exemples Ansible, vers un autre outil de déploiement.

Découvrez ici notre démarche DevOps et intégration continue.

Article rédigé par Manuel Guilley, Intégrateur BlueMind.

Image de Manuel Guilley

Manuel Guilley

Intégrateur BlueMind
Partagez cet article

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

2 + 7 =

A propos de BlueMind

Accessible depuis tous les clients mail, web et mobiles. BlueMind offre le meilleur support collaboratif disponible pour Thunderbird et est la seule solution du marché 100 % compatible Outlook sans connecteur.

Articles récents

Suivez-nous

Inscription à la newsletter

Un e-mail par mois pour rester au courant de toutes les nouveautés BlueMind