Précédemment, je vous avais fait part de ma volonté de me lancer dans ansible et de vous partager cette expérience d’apprentissage.
Un précédent article vous présentait un script qui me permet de mettre en place un “centre serveur de poche” à partir de conteneurs (attention ce ne sont que des conteneurs pas de VM donc pas des serveurs… pas la peine de lancer des discussions à ce sujet). Bref, l’idée de cet article était de vous expliquer mon script pour mettre en place une infrastructure légère permettant de me faire la main sur ansible.
Et le bilan c’est que ça marche très bien et que c’est bien plus léger que tout ce qui est à partir de VM. C’est extrèmement pratique pour bosser sur son portable car on peut faire et réinitialiser les serveurs très vites.
Maintenant, il faut se former.
Le fichier inventory, la liste des serveurs
L’inventory est le fichier contenant la liste de référence de vos machines. Dans mon cas j’ai lancé deux conteneurs (machine) 172.17.0.2 et172.17.0.3. En avoir plusieurs c’est vraiment bien pour créer des variations au niveau des hosts et ainsi approfondir le fonctionnement de ansible.
Mon fichier se nomme hosts (comme souvent sur ansible) :
└─ $ ▶ cat hosts [web] 172.17.0.2 172.17.0.3
J’ai choisi le format init et non le yaml car je suis tombé avec un bug en lien avec python 3.5 (ansible ne lisait pas le yaml de l’inventory).
Pour tester votre inventory, vous pouvez lancer :
ansible -i hosts all --list-hosts
Ensuite, vous pouvez tester une commande linux sur votre parc, par exemple “uptime” :
00:07:33 - oki @ doki ~/autoform_ansible └─ $ ▶ ansible -i hosts all -u oki -m shell -a "uptime" 172.17.0.3 | SUCCESS | rc=0 >> 22:07:35 up 1:26, 1 user, load average: 1.00, 0.75, 0.66 172.17.0.2 | SUCCESS | rc=0 >> 22:07:35 up 1:26, 1 user, load average: 1.00, 0.75, 0.66
L’arborescence
Extrèmement importante cette arborescence dans un outil d’orchestration comme ansible. En effet, cela peut vite tourner au boxon tellement vous aller générer de fichiers.
De base si on ne rentre pas dans les roles :
.
├── group_vars
│ └── web
├── hosts
├── host_vars
│ ├── 172.17.0.2
│ └── 172.17.0.3
├── playbook-manip.yml
- group_vars : contient les variables des groupes (regroupement de serveur) par exemple “web” dans mon cas
- hosts : c’ets l’inventory de nos machines classées par groupe
- host_vars : contient les variables des machines (pour spécifier à la machine une variable)
- playbook.yml : les actions à réaliser
Les deux éléments centraux sont donc : la liste des machines et les actions à réaliser dessus.
Le playbook
On l’a dit le playbook contient les actions à réaliser (et par qui et sur qui). L’entête sert principalement à définir par qui et sur qui de cette manière :
--- - name: Lancement des actions hosts: web remote_user: oki become: yes tasks:
- hosts : pour dire sur quelles machines ou quel groupe on travaille (en l’occurence web dans mon exemple)
- remote_user : qui va exécuter les actions
- become : permet d’élever les privilèges si nécessaire pour faire les actions
- tasks : indique la liste des actions à venir
Le “- name:” est extrèment important. Il permet sera défini de nombreuse fois tout au long de notre code et permet au lancement du playbook de savoir où nous en sommes. C’est donc indispensable pour débugger.
La première action que nous allons réaliser c’est de copier un fichier présent au même niveau que notre playbook (c’est moche je sais mais c’est simple avant tout).
- name: Transfert de monfichier.txt copy: src: ./monfichier.txt dest: /tmp/monfichier.txt
Nous définissons donc le nom de l’action que nous allons lancer par “- name:”. Puis utilisons le module copy de ansible. Pour copier/coller un fichier il prend deux éléments :
- src: le fichier source
- dest: le fichier de destination
Dans une deuxième action nous allons modifier le contenu de mon fichier qui ne contient que “bonjour Xavier” pour le faire contenir “Remplacement salut Xavier”. Et pour cela nous allons utiliser le module lineinfile :
- name: Modification de monfichier.txt lineinfile: path: /tmp/monfichier.txt regexp: "^bonjour(.*)" line: 'Remplacement salut' backrefs: yes
Dans cette utilisation de lineinfile je transmets les éléments :
- path : la localisation de mon fichier à modifier
- regexp : un élément permettant de retrouver la ligne et capturer un motif (dans mon cas je capture “Xavier” par exemple
- line : la nouvelle ligne contenant mon texte et “\1” c’est à dire le motif capturé
- backrefs : pour utiliser la capture à partir du backslash
Mon playbook au final contient ceci (attention l’indentation doit être stricte, c’est un yaml) :
--- - name: Lancement des actions hosts: all remote_user: oki become: yes tasks: - name: Transfert de monfichier.txt copy: src: ./monfichier.txt dest: /tmp/monfichier.txt - name: Modification de monfichier.txt lineinfile: path: /tmp/monfichier.txt regexp: "^bonjour(.*)" line: 'Remplacement salut' backrefs: yes
Pour lancer votre playbook sur votre inventory passez :
ansible-playbook -i hosts --user=oki -D playbook-fichier.yml
Et en sortie le résultat du log ansible donne :
PLAY [Lancement des actions] ******************************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************************************** ok: [172.17.0.2] ok: [172.17.0.3] TASK [Transfert de monfichier.txt] ************************************************************************************************************************************************************** --- before: /tmp/monfichier.txt +++ after: /home/oki/autoform_ansible/monfichier.txt @@ -12,4 +12,4 @@ ############################################################### -Remplacement salut Xavier +bonjour Xavier changed: [172.17.0.3] --- before: /tmp/monfichier.txt +++ after: /home/oki/autoform_ansible/monfichier.txt @@ -12,4 +12,4 @@ ############################################################### -Remplacement salut Xavier +bonjour Xavier changed: [172.17.0.2] TASK [Modification de monfichier.txt] ****************************************** --- before: /tmp/monfichier.txt (content) +++ after: /tmp/monfichier.txt (content) @@ -12,4 +12,4 @@ ############################################################### -bonjour Xavier +Remplacement salut Xavier changed: [172.17.0.3] --- before: /tmp/monfichier.txt (content) +++ after: /tmp/monfichier.txt (content) @@ -12,4 +12,4 @@ ############################################################### -bonjour Xavier +Remplacement salut Xavier changed: [172.17.0.2] PLAY RECAP *************************************************** 172.17.0.2 : ok=3 changed=2 unreachable=0 failed=0 172.17.0.3 : ok=3 changed=2 unreachable=0 failed=0