Ansible Playbook – 1er Playbook

ansible-playbook yaml
yml ansible

C’est quoi un Ansible playbook ?

Un playbook est un fichier de configuration au format YAML qui décrit des tâches qui s’exécuteront sur les serveurs cibles.

L’indentation est de 2 espaces en YAML, cette indentation est très importante car sinon le fichier est en erreur.

Avantage des playbooks

Les playbooks sont intéressants car ils permettent le déploiement de configurations/d’applications sur un ou plusieurs node client simplement.

Ansible est fourni avec une multitude de modules et ces modules sont disponibles dans nos playbooks, ce qui nous donne beaucoup de flexibilité pour exécuter les actions de nos choix facilement.

Enfin les playbooks sont généralement facile à lire (quand ils sont bien faits) et permettent de maintenir notre infrastructure.

Conception de notre premier yml ansible playbook.yml

Ce premier playbook aura pour objectif de créer un utilisateur « ansible » sur notre machine cible puis de générer une clé SSH sur notre serveur ansible et enfin déployer cette clé SSH sur toutes les nodes.

Avant de commencer la conception de notre playbook, je te propose de créer un fichier chiffré qui va stocker notre variable password qui sera attribué à l’utilisateur Ansible.

Ansible-vault

Pour ce faire nous allons utiliser ansible-vault qui est un outil livré avec l’installation d’ansible, c’est une sorte de coffre-fort qui va stocker nos fichier et variable chiffré :

ansible-vault create vars/password_ssh.yml

La commande nous demande de choisir un mot de passe ( ce mot de passe sera demandé à chaque fois que l’on utilisera ansible-vault ou un de ses fichiers).

La commande ouvre alors notre éditeur de texte par défaut (généralement VI) et c’est là que l’on va inscrire notre variable tel que :

Vault password: 
---

password_ssh: 'password'

On peut enfin commencer la conception de notre playbook.

cle_ssh_playbook.yml :

- name: "[cle ssh]"
  hosts: all
  vars_files:
    - vars/password_ssh.yml

hosts : all pour cibler toutes nos node de notre inventaire /etc/ansible/hosts.yml

vars_files: permet de spécifier des fichiers de variables ici notre fichier que l’on a précédemment chiffré vars/password_ssh.yml

Ensuite :

tasks:

  - name: génération de la clé ssh
    openssh_keypair:
      path: /home/ansible/.ssh/id_ecdsa
      type: ecdsa
      size: 521
      state: present
      force: no
      owner: ansible
    delegate_to: localhost
    run_once: yes

tasks est l’élément qui spécifie à Ansible les tâches qui devront être exécuté

Notre première tache est la génération de notre clé ssh à l’aide du module openssh_keypair.

Les différentes options nous permettent de spécifier le chemin de destination de notre clé, du type de chiffrement, son degrés de sécurité, son état (présent ou absent) et son propriétaire.

Enfin j’ai utilisé delegate_to: localhost pour que la tâche ne soit lancée que sur la node master et run_once: yes pour que cette tâche ne soit exécutée qu’une seule fois.

Puis :

  - name: création user ansible et ajout sudo pour Centos
    user:
      name: ansible
      shell: /bin/bash
      group: wheel
      password: "{{ password_ssh | password_hash('sha512')}}"
    become: yes
    when: ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux'

Il faut savoir que j’ai une infrastructure composée de serveurs Debian et Centos or sur les serveurs Centos le groupe sudo est le wheel tandis que sur debian c’est sudo.

Cette tâche va créer l’user ansible, lui attribuer le groupe wheel (pour utiliser sudo sur Centos) et définira le mot de passe à la valeur de notre variable password_ssh du fichier de variable chiffré.

Enfin pour que cette action ne soit lancée que sur les OS centos j’ai rajouté l’option :

when: ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux'

when indique à quelle condition lancée la tâche.

Derrière on lance la même tâche mais pour les Debian ou Ubuntu:

- name: création user ansible et ajout sudo pour Debian/Ubuntu
    user:
      name: ansible
      shell: /bin/bash
      group: sudo
      password: "{{ password_ssh | password_hash('sha512')}}"
    become: yes
    when: ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu'

Et on termine avec la tâche qui va déployer notre clé SSH :

- name: Deploy SSH Key
    authorized_key: 
      user: ansible
      key: "{{ lookup('file', '/home/ansible/.ssh/id_ecdsa.pub') }}"
      state: present
    become: yes

Pour cela on utilise le module « authorized key », on lui spécifie l’user et on lui indique la clé :

key: "{{ lookup('file', '/home/ansible/.ssh/id_ecdsa.pub') }}"

lookup(‘file’ permet d’indiquer un fichier existant sur le node master.

Au final notre playbook ressemble à ça :

- name: "[cle ssh]"
  hosts: all
  vars_files:
    - vars/password_ssh.yml
  tasks:

  - name: génération de la clé
    openssh_keypair:
      path: /home/ansible/.ssh/id_ecdsa
      type: ecdsa
      size: 521
      state: present
      force: no
      owner: ansible
    delegate_to: localhost
    run_once: yes

  - name: création user ansible et ajout sudo pour Centos
    user:
      name: ansible
      shell: /bin/bash
      group: wheel
      password: "{{ password_ssh | password_hash('sha512')}}"
    become: yes
    when: ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux'

  - name: création user ansible et ajout sudo pour Debian/Ubuntu
    user:
      name: ansible
      shell: /bin/bash
      group: sudo
      password: "{{ password_ssh | password_hash('sha512')}}"
    become: yes
    when: ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu'

  - name: Deploy SSH Key
    authorized_key: 
      user: ansible
      key: "{{ lookup('file', '/home/ansible/.ssh/id_ecdsa.pub') }}"
      state: present
    become: yes

Pour l’exécuter on utilise la commande ansible-playbook :

ansible-playbook cle_ssh_playbook.yml --ask-vault-pass -u root -k 
  • –ask-vault-pass nous permettra d’entrer le mot de passe vault
  • -u root pour exécuter ces actions en tant que root car nous n’avons pas encore d’accès SSH sur l’user ansible
  • – k pour spécifier le mot de passe SSH

Une fois ce playbook lancé tu pourras te connecter en ssh depuis la node master sur les nodes clients sans utiliser de mot de passe.

Tu pourras aussi (surtout) executer des commande ansible sans utiliser l’option -u ou -k.

Si tu veux en savoir plus Ansible Playbook tu peux aller voir ici et si tu veux savoir comment installer Ansible c’est ici.

Laisser un commentaire