Configuration post déploiement avec Ansible

Etape 2

Ansible

Les objectifs :

  • permettre à l'utilisateur d'une VM de se connecter dessus en ssh
  • installer docker sur toutes les VM

Création des fichiers de déploiement (cf dépôt)

1. le fichier d'inventaire

Pour l'installation d'Ansible, se reporter à la documentation officielle.

Dans un répertoire dédié, créer un premier fichier (par exemple vms ou vms.ini ou vms.yml) qui contiendra toutes les machines cibles.

nano vms

Y ajouter :

# fichier inventaire vms
[vms]
192.168.10.50
192.168.10.51
192.168.10.84
192.168.10.85
192.168.10.86
# On peut aussi renseigner directement une plage:  192.168.10.[10:50]

Avant de commencer à créer des "playbooks" de déploiement (= le fichier d'une tâche d'automatisation que va exécuter Ansible), il est conseillé de vérifier que l'on arrive à joindre les VM. La documentation Ansible propose un premier playbook de test de connexion :

- name: My first play
  hosts: vms
  remote_user: ansible
  become: true
  tasks:
   - name: Ping my hosts
     ansible.builtin.ping:

   - name: Print message
     ansible.builtin.debug:
      msg: Hello world

NB : s'il y a eu des connexions précédentes en ssh, penser à supprimer les entrées créées (fingerprints)
ssh-keygen -f "~/.ssh/known_hosts" -R "XX.XX.XX.XX"

2. Premier fichier de déploiement pour ouvrir l'accès en ssh

a. création du fichier adduserssh.yml
---
- name: ajout user dans sshd_config
  hosts: vms
  remote_user: ansible # le compte qui va permettre l'accès ssh à toutes les machines
  become: true # obtenir l'escalade de droits

  tasks:
    - name: hostname
      command: hostname #on va se servir de cette commande pour récupérer sur chaque VM le nom d'utilisateur puisque c'est le même que le hostname (cf config de terraform)
      register: hostname_output
      changed_when: false

    - name: Ajout hostname à sshd_config
      lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^AllowUsers ansible '
        insertafter: '^#AllowUsers ansible '
        line: "AllowUsers "
        state: present # = on veut que la modification soit présente (absent = suppression)
    - name: Restart sshd service # redémarrer ssh
      service:
        name: sshd
        state: restarted
b. déploiement
ansible-playbook -i vms adduserssh.yml -kK 
# ansible-playbook -i <fichier d'inventaire> <playbook> -kK = identification ssh + sudo

A présent chaque utilisateur peut se logger en ssh sur "sa" VM.

3. Deuxième fichier de déploiement pour installer docker :

a. création du fichier add_docker.yml
---
- name: Ajout Docker
  hosts: vms
  remote_user: ansible
  gather_facts: true

  become: true
  tasks:
    - name: Installer plusieurs outils
      apt:
        name: ['apt-transport-https', 'ca-certificates', 'curl', 'gnupg', 'lsb-release']
        update_cache: yes

    - name: Créer le répertoire pour les clés
      file:
        path: /etc/apt/keyrings
        state: directory
        mode: '0755'

    - name: Télécharger la clé Docker GPG
      get_url:
        url: "https://download.docker.com/linux/debian/gpg"
        dest: /etc/apt/keyrings/docker.asc
    - name: Changer les permissions
      shell: chmod a+r /etc/apt/keyrings/docker.asc

    - name: Ajouter le dépôt Docker debian bookorm
      apt_repository:
        repo: deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian bookworm stable
        state: present

    - name: Apt update
      apt:
        update_cache: yes

    - name: Installer Docker
      apt:
        name: [docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin, docker-compose-plugin]
        state: present

    - name: S'assurer que le service est démarré
      service:
        name: docker
        state: started
        enabled: yes