Jacques Foucry bio photo

Jacques Foucry

IT, râleur et faiseur de pain

Email



Où l’on continue la découverte de Ansible.

Nous avons vu précédemment la mise en place du produit Ansible. Nous avons également réalisé un premier test en utilisant le module ping.

Nous allons maintenant distribuer un script1 sur la machine haddock. Pour ce faire, nous allons créer un fichier d’action Ansible, un playbook.

Les fichiers playbook

Les fichiers playbook sont des fichiers texte qui sont une succession de verbe ansible pour réaliser des actions sur les machines clientes. Ces fichiers sont écrits en YAML, un langage de descriptions facilement compréhensible par les humains et les machines.

Notre premier fichier playbook

Nous allons créer un répertoire puis y copier notre petit script.

1
2
3
4
5
6
7
8
9
---
- hosts: haddock
  remote_user: root
  tasks:
  - name: Create script folder
    command: mkdir /usr/local/scripts

  - name: Install my script
    copy: src=/home/jacques/sources/script-test.sh dest=/usr/local/scripts/ mode=644

Analysons le fichier playbook :

  • host: haddock → la machine sur laquelle nous allons agir. Ici il s’agit d’une machine, mais nous aurions pu désigner l’un des groupes de notre fichier hosts, voire toutes les machines de ce même fichier ;
  • remote_user: root → les commandes que nous allons exécuter sur la machine distante le seront par l’utilisateur désigné, ici root ;
  • tasks: → nous allons donner la liste des tâches que nous allons accomplir sur la machine distante ;
  • - name: create script folder → nous devons donner un nom à chacune des tâches ;
  • commnand: mkdir /usr/local/scripts → la commande à exécuter sur la machine distante, ici la création du répertoire de destination de notre script 

Le reste du fichier doit maintenant être compréhensible.

Exécution du fichier playbook

L’exécution du fichier playbook est simple (aussi simple que le ping que nous avons déjà utilisé) :

1
2
3
4
5
6
7
8
9
10
11
12
13
PLAY [haddock] **************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [haddock]

TASK: [Create script folder] ************************************************** 
changed: [haddock]

TASK: [Install grid scripts] ************************************************** 
changed: [haddock]

PLAY RECAP ******************************************************************** 
haddock                    : ok=3    changed=2    unreachable=0    failed=0 

Nous pouvons facilement retrouver nos tâches (grâce aux noms donnés) et voir que chacune des commandes à été correctement exécutée.

Vous pouvez même vous connecter sur la machine cible et vérifier la présence du script.

1
2
$ ls
test.sh

Copie des clefs ssh

Maintenant que nous avons vu le mécanisme pour dialoguer avec les machines distantes, nous pouvons imaginer comment copier la clef publique ssh sur toutes ces machines. Nous n’allons pas utiliser de playbook, mais passer par deux étapes simples :

  • copie de la clef publique sur les machines cibles ;
  • ajout de la clef dans le fichier authorized_keys2 de l’utilisateur root des machines cibles.

Nous pourrons ajouter une troisième tâche, supprimer la clef publique des machines cibles.

Copie de la clef publique sur les machines distantes

1
$ ansible user -m copy -a "src=/home/jacques/.ssh/id_dsa.pub dest=/tmp/id_dsa.pub" --ask-pass -c paramiko

Analysons cette ligne de commande :

  • ansible user → nous lançons ansible et nous allons agir sur le groupe user présent dans notre fichier host ;
  • -m copy → nous utilisons le module copy ;
  • -a src=/home/jacques/.ssh/id_dsa.pub dest=/tmp/id_dsa.pub → les paramètres de la copie, le fichier source (sur la machine locale) et le dossier de destination (sur la machine distante) ;
  • --ask-pass → on demande le mot de passe de l’utilisateur sur la machine distante 
  • -c paramiko → on utilise un module python pour les connexions SSH.

Et voici le résultat sur l’une des machines 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SSH password: 
tintin | success >> {
    "changed": true, 
    "dest": "/tmp/id_dsa.pub", 
    "gid": 1000, 
    "group": "jacques", 
    "md5sum": "f5ebd442f58056584f003d9eda1852bc", 
    "mode": "0644", 
    "owner": "jacques", 
    "size": 608, 
    "src": "/home/jacques/.ansible/tmp/ansible-tmp-1409305672.13-254062037291679/source", 
    "state": "file", 
    "uid": 1010
}

Mise en place de la clef dans le fichier authorized_keys2 de root

Maintenant que la clef est copiée, nous allons la mettre dans le fichier /root/.ssh/authorized_keys2.

1
2
3
4
$ ansible user -m shell -a "cat /tmp/id_dsa.pub >> /root/.ssh/authorized_keys2" --ask-pass -c paramiko -u root 

SSH password: 
tintin | success | rc=0 >>

Analysons la ligne de commande :

  • ansible user → → nous lançons ansible et nous allons agir sur le groupe user présent dans notre fichier host ;
  • -n shell → → nous utilisons le module shell ;
  • -a "cat /tmp/id_dsa.pub >> /root/.ssh/authorized_keys2" → les paramètres de notre shell, en fait la commande que nous voulons passer ;
  • --ask-pass → nous demandons le mot de passe ;
  • -c paramiko → on utilise un module python pour les connexions SSH ;
  • -u root → c’est l’utilisateur désigné (ici root) qui fait tourner la commande.

Et si l’on simplifiait le processus ?

Parce que, il faut bien le reconnaître, je suis passé par un chemin un peu compliqué. J’aurais pu utiliser ssh-copy-id pour mettre en place ma clef sur les machines. Il est vrai que du coup on utilise pas ansible. On arrive à la ligne suivant :

1
2
$ ssh-copy-id -i .ssh/id_dsa.pub root@destination 
password: 

Essayons d’automatiser cette mise en place sur toutes les machines qui sont dans le fichier /etc/ansible/hosts

1
2
3
4
$ for machine in $(cat /etc/ansible/hosts | grep -v "^\[")
for> do
for> ssh-copy-id .ssh/id_dsa.pub root@$machine
for> done

On supprime de la liste les noms des groupes. C’est facile la ligne commence par le caractère [. On utilise grep -v2


Billet Précédent | Billet Suivant

  1. le script en lui-même n’a pas vraiment d’importance pour l’instant 

  2. je vous renvoie au mande grep pour de plus amples informations 


Laisser un commentaire

Les commentaires sont soumis à modération.