[Ansible] : commençons simplement : copie de fichiers, modification/écriture avec copy et lineinfile

Print Friendly, PDF & Email

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.

Découvrez  Les boucles with avec ansible

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
Découvrez  [Ansible] : comment installer et configurer logrotate ? et trouver un rôle adapté

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