Ce document contient les livrables issus de la mise ne place des roles et playbooks Ansible nécessaires à la configuration des nouvelles VM. L’objectif est de pouvoir disposer d’un ensemble de vm avec une configuration cohérente post-deploiement.


1. Conversion des tâches de configuration manuelle

Pour le développement de ces roles et les essais, nous allons déployer une VM à partir du template debian12-template. Pour le moment, nous gérerons les rollback des applications du playbook via les snapshot intégrés sur Proxmox VE. Notre VM de test aura les caractéristiques suivantes

Hostname IPv4 Sous réseau
ansibledev-core  192.168.100.11 core

Autre élément important, nous réservons l’IP 192.168.100.11 pour la VM temporaire ansibledev-core

Avant la mise en place d’Ansible, nous réalisions un ensemble d’opération pour configurer les VM fraîchement créée sur notre Proxmox VE. Nous allons traduire cela en playbook Ansibe.

Modification de la configuration réseau avec le fichier /etc/network/interfaces

  • Configuration IPv4 de l’interface réseau via networking (manuellement)
  • Gestion de la mise à jour du DNS (manuellement)
  • Désactivation de l’IPv6
  • Configuration du hostname
  • Modification de /etc/hosts avec le bon hostname
  • Configuration du résolveur DNS
  • Installation des paquets de “base” (ajout)
  • Modification du motd (ajout)

Tout d’abord, nous créons l’architecture pour l’ensemble des roles que nous allons créer

ansible-galaxy init roles/ipv6_disable
ansible-galaxy init roles/hostname_config
ansible-galaxy init roles/dns_config

Voici le détail des roles ci-dessus. Pour commencer le rôle ipv6_disable

#SPDX-License-Identifier: MIT-0
---
# tasks file for roles/ipv6_disable

- name: Désactivation de la prise en charge de l\'IPv6 globalement
  ansible.posix.sysctl:
    name: net.ipv6.conf.all.disable_ipv6
    value: 1
    state: present
    sysctl_set: yes
    reload: true

- name: Désactivation de la prise en charge de l\'IPv6 par défaut
  ansible.posix.sysctl:
    name: net.ipv6.conf.default.disable_ipv6
    value: 1
    state: present
    sysctl_set: yes
    reload: true

Ensuite, le role hostname_config. La variable hostname est initialisée au niveau de l’inventaire.

#SPDX-License-Identifier: MIT-0
---
# tasks file for roles/hostname_config

- name: Modification du hostname
  ansible.builtin.hostname:
    name: '{{ hostname }}' 
    use: systemd

- name: Modification du fichier /etc/hosts
  ansible.builtin.lineinfile:
    path: /etc/hosts
    regexp: '^127\.0\.1\.1\s+'
    line: "127.0.1.1 {{ hostname }}.homelab {{ hostname }}"
    state: present
    backrefs: true

Poursuivons avec le role dns_config. Pour ce role ci, l’indenpotence n’est pas respectée. En effet, quelque soit l’état des éléments, le restart du service systemd-resolved, la suppression du fichier /etc/resolv.conf et le création du lien symbolique sont des actions exécutées à chaque déclenchement du role.

#SPDX-License-Identifier: MIT-0
---
# tasks file for roles/dns_config

- name: Installation du paquet systemd-resolved
  ansible.builtin.apt:
    name: systemd-resolved
    state: present

- name: Suppression du paquet resolvconf
  ansible.builtin.apt:
    name: resolvconf
    state: absent

- name: Autoremove et purge
  ansible.builtin.apt:
    autoremove: yes
    purge: true

- name: Enable du daemon systemd-resolved
  ansible.builtin.systemd_service:
    name: systemd-resolved
    enabled: true

- name: Configuration du DNS dans /etc/resolved.conf
  ansible.builtin.ini_file:
    path: /etc/systemd/resolved.conf
    section: "Resolve"
    option: "DNS"
    value: "192.168.100.253"
    state: present

- name: Configuration du FallbackDNS dans /etc/resolved.conf
  ansible.builtin.ini_file:
    path: /etc/systemd/resolved.conf
    section: "Resolve"
    option: "FallbackDNS"
    value: "1.1.1.1"
    state: present

- name: Configuration du domaine dans /etc/resolved.conf
  ansible.builtin.ini_file:
    path: /etc/systemd/resolved.conf
    section: "Resolve"
    option: "Domains"
    value: "~."
    state: present

- name: Resart du daemon systemd-resolved
  ansible.builtin.systemd_service:
    name: systemd-resolved
    state: restarted

- name: Suppression du fichier /etc/resolv.conf
  ansible.builtin.file:
    path: /etc/resolv.conf
    state: absent

- name: Création du nouveau lien symbolique vers /etc/resolv.conf
  ansible.builtin.file:
    src: /run/systemd/resolve/stub-resolv.conf
    dest: /etc/resolv.conf
    state: link

Enfin, les deux derniers rôles ajoutés pour l’occasion, base_package et motd

#SPDX-License-Identifier: MIT-0
---
# tasks file for roles/base_packages
# Rôle permettant l'installation des paquets de base

- name: Mise à jour du cache apt
  ansible.builtin.apt:
    update_cache: yes
    cache_valid_time: 3600

- name: Installation des paquets de base
  ansible.builtin.apt:
    name:
      - curl
      - wget
      - tmux
      - htop
      - jq
      - tree
      - git
      - figlet
    state: present

#SPDX-License-Identifier: MIT-0
---
# tasks file for roles/motd
# Rôle permettant la modification du motd

- name: Déploiement du motd
  ansible.builtin.template:
    src: motd.j2
    dest: /etc/motd
    mode: '0644'

Avec le fichier template motd.j2

########################################################
#   Hostname     : {{ ansible_hostname }}
#   IP Address   : {{ ansible_default_ipv4.address }}
#   Network Zone : {{ 'core' if 'core' in inventory_hostname else 'vms' if 'vms' in inventory_hostname else 'unknown' }}
#   Uptime       : {{ (ansible_uptime_seconds / 60) | int }} minutes
#   Disk Usage   : {{ ansible_mounts[0].size_available | human_readable }}/{{ ansible_mounts[0].size_total | human_readable }}
########################################################

2. Ajout du linter

Nous choisissions d’utiliser ansible-lint pour vérifier et corriger le code Ansible que je produit. Il s’agit de l’outil officiellement utilisé par Ansible Galaxy, l’outil est simple d’utilisation, permet de surveiller un certains nombre d’éléments comme la syntaxe, les bonnes pratiques syntaxiques, le respect de l’indempotence, etc. De plus, l’outil permet d’appliquer des corrections avec l’option --fix (anciennement --write). Nous installons également yamllintqui permet d’appliquer des vérification mais sur la syntaxe et les bonnes pratiques concernant le yaml.

Nous avons déjà installé ansible-lint pendant l’installation et la configuration de Ansible au niveau du chapitre précédent (chapitre 7). Pour rappel la commande utilisée est celle-ci (à appliquer dans le contexte pipx de Ansible).

pipx install "ansible-lint[yamllint]"

Nous exécutons ansible-lint couplé à yamllint sur le playbook précédemment créé 00_config_vm.yml

ansible-lint playbooks/00_config_vm.yml

Voici le récapitulatif des résultats obtenus :

# Rule Violation Summary

  1 syntax-check profile:min tags:core,unskippable
  6 schema profile:min tags:core
 29 yaml profile:min tags:formatting,yaml
  1 yaml profile:min tags:formatting,yaml
  2 yaml profile:min tags:formatting,yaml
  2 yaml profile:min tags:formatting,yaml
  3 yaml profile:min tags:formatting,yaml
 15 meta-incorrect profile:min tags:metadata
  3 fqcn profile:min tags:formatting

Failed: 62 failure(s), 0 warning(s) on 31 files.

Après application du fix, il reste 51 remontées.

# Rule Violation Summary

  1 syntax-check profile:min tags:core,unskippable
  6 schema profile:min tags:core
 29 yaml profile:min tags:formatting,yaml
 15 meta-incorrect profile:min tags:metadata

Failed: 51 failure(s), 0 warning(s) on 31 files.

Ci-dessous, un exemple de modification concernant les meta informations du rôle security_ssh. Voici le fichier avant les modifications :

---
#SPDX-License-Identifier: MIT-0
galaxy_info:
  author: your name
  description: your role description
  company: your company (optional)

  # If the issue tracker for your role is not on github, uncomment the
  # next line and provide a value
  # issue_tracker_url: http://example.com/issue/tracker

  # Choose a valid license ID from https://spdx.org - some suggested licenses:
  # - BSD-3-Clause (default)
  # - MIT
  # - GPL-2.0-or-later
  # - GPL-3.0-only
  # - Apache-2.0
  # - CC-BY-4.0
  license: license (GPL-2.0-or-later, MIT, etc)

Voici le fichier après les modifications :

---
#SPDX-License-Identifier: MIT-0
galaxy_info:
  author: Nicolas Gobert
  description: Sécurisation du daemon sshd
  company: Homelab

  # If the issue tracker for your role is not on github, uncomment the
  # next line and provide a value
  # issue_tracker_url: http://example.com/issue/tracker

  # Choose a valid license ID from https://spdx.org - some suggested licenses:
  # - BSD-3-Clause (default)
  # - MIT
  # - GPL-2.0-or-later
  # - GPL-3.0-only
  # - Apache-2.0
  # - CC-BY-4.0
  license: MIT