Ansible - l'orchestration facile (2/2)

07 Sep 2013


Cet article est la suite de l'article n°1 présentant Ansible. Celui-ci a pour but de créer notre premier playbook.

En route !

Mon premier Playbook

Objectifs


Maintenant que l'on dispose de notre structure de base, on va configurer la liste des tâches permettant d'installer Tomcat8 sur un Ubuntu 12.04 à savoir:

  1. Installer le paquet OpenJDK 7 (le paquet se nomme openjdk-7-jdk)
  2. Créer un dossier permettant le téléchargement de l'archive de tomcat8 (dans /home/vagrant/archives)
  3. Télécharger tomcat8 depuis le miroir suivant
  4. Créer le dossier /opt/apache-tomcat appartenant à l'utilisateur vagrant
  5. Décompresser notre archive
  6. Créer un lien symbolique de /opt/apache-tomcat/apache-tomcat-8.0.0-RC1 à /opt/apache-tomcat/tomcat8
  7. Modifier le fichier server.xml
  8. Redémarrer tomcat à chaque fois que le fichier catalina.properties est modifié

Résolution

Étape 1: installer un paquet

 

On va créer une tâche permettant l'installation d'un paquet sur notre Ubuntu dans le fichier roles/tomcat8/tasks/main.yml:


- name: install package openJDK 7
apt: pkg=openjdk-7-jdk update_cache=yes
sudo: yes

Toutes les tâches nécessitent un nom qui sera affiché lors de l'exécution d'Ansible.
La deuxième ligne précise le module a utiliser à savoir ici le module "apt", on lui passe deux paramètres pkg (qui indique le nom du paquet à installer) et update_cache (qui va déclencher un apt-get update avant l'installation). Mais il existe d'autres options.
Enfin la dernière ligne indique qu'il faut lancer cette commande via sudo.

Testons maintenant notre première tâche via la commande suivante qui va exécuter notre playbook site.yml sur l'ensemble des machines de notre fichier production:


$ ansible-playbook -i production site.yml

Et le résultat (ça peut prendre un peu de temps):

PLAY [application-server] *****************************************************

GATHERING FACTS ***************************************************************

ok: [127.0.0.1]

TASK: [install package openJDK 7] *********************************************

changed: [127.0.0.1]

PLAY RECAP ********************************************************************

127.0.0.1 : ok=2 changed=1 unreachable=0 failed=0

Si vous avez des vaches qui s'affichent vous pouvez soit désinstaller le paquer cowsay soit exécuter la commande suivante:
export ANSIBLE_NOCOWS=1

Étape 2: créer un dossier

 

Pour créer un dossier on ajoute juste une tâche à notre fichier main.yml en utilisant le module file:

- name: create archives folder
file: path=/home/vagrant/archives state=directory
On teste à nouveau et voilà le résultat:

PLAY [application-server] *****************************************************

GATHERING FACTS ***************************************************************

ok: [127.0.0.1]

TASK: [install package openJDK 7] *********************************************

ok: [127.0.0.1]

TASK: [create archives folder] ************************************************

changed: [127.0.0.1]

PLAY RECAP ********************************************************************

127.0.0.1 : ok=3 changed=1 unreachable=0 failed=0

On peut voir ici qu'Ansible ne ré-installe pas le package openJDK (statut: ok) mais créé par contre bien notre dossier (statut: changed).

Pour les étapes suivantes je vais vous laisser travailler en ne vous donnant que le nom des modules à utiliser. Le fichier final main est indiqué à la fin de l'article.

Étape 3: télécharger une archive

 

Utiliser pour cela le module get_url.

Étape 4: créer un dossier

 

Voir l'étape 2 en ajoutant les options qui vont bien.

Étape 5: décompresser une archive

 

Utiliser pour cela le module command. Attention à bien utiliser l'option creates pour ne pas décompresser l'archive à chaque exécution d'Ansible.

Étape 6: créer un lien symbolique

 

Encore et toujours le module file avec les options dest et src ce coup-ci.

Étape 7: Modifier le fichier server.xml

 

Pour copier un fichier depuis notre dossier roles/tomcat8/files il suffit d'utiliser le module copy. Pour l'exemple le fichier local copié sur le serveur distant est le fichier server.xml classique auquel ont été enlevé les commentaires:


- name: Copy server.xml
copy: dest=/opt/apache-tomcat/tomcat8/conf/server.xml owner=vagrant group=vagrant src=roles/tomcat8/files/server.xml

Étape 8: Redémarrer automatiquement Tomcat

 

L'étape précédente nous a permis de modifier facilement la configuration de nos serveurs Tomcat. Néanmoins il faut après une modification de la conf redémarrer le serveur.
Pour réaliser cela nous allons ajouter un handler, une action qui ne sera exécutée que sur notification d'une autre action. Ainsi si le fichier de conf n'est pas modifié Tomcat ne sera pas redémarré.
On ajoute une ligne à notre tâche de l'étape 7 pour notifier notre handler:


- name: Copy server.xml
copy: dest=/opt/apache-tomcat/tomcat8/conf/server.xml owner=vagrant group=vagrant src=roles/tomcat8/files/server.xml
notify: restart tomcat
Et on créé le fichier handler correspondant dans roles/tomcat8/handlers/main.yml:


- name: restart tomcat
shell: /opt/apache-tomcat/tomcat8/bin/shutdown.sh && /opt/apache-tomcat/tomcat8/bin/startup.sh
Voilà normalement lors de la prochaine modification du fichier server.xml notre tomcat sera redémarré. Pour tester nous pouvons rajouter une ligne vide dans le fichier roles/tomcat8/files/server.xml et relancer ansible-playbook:


PLAY [application-server] *****************************************************

GATHERING FACTS ***************************************************************

ok: [127.0.0.1]

TASK: [install package openJDK 7] *********************************************

ok: [127.0.0.1]

TASK: [create archives folder] ************************************************

ok: [127.0.0.1]

TASK: [Download Tomcat 8] *****************************************************

ok: [127.0.0.1]

TASK: [Create tomcat directory] ***********************************************

ok: [127.0.0.1]

TASK: [Unzip tomcat] **********************************************************

skipping: [127.0.0.1]

TASK: [Create Tomcat symlink] *************************************************

ok: [127.0.0.1]

TASK: [Copy server.xml] *******************************************************

changed: [127.0.0.1]

NOTIFIED: [restart tomcat] ****************************************************

changed: [127.0.0.1]

PLAY RECAP ********************************************************************

127.0.0.1 : ok=8 changed=2 unreachable=0 failed=0

Fichier Final

 

Aller plus loin

Il est possible de faire encore plus de chose avec Ansible comme par exemple :

Bref aller jeter un oeil à la doc qui bien qu'un peu fouillis contient l'essentiel.


Post 14/52