Rapport Admin Linux Avancee Grp1
Rapport Admin Linux Avancee Grp1
Rapport Admin Linux Avancee Grp1
Nathan LE CORRONC
Raphaël MANOURY
Thomas KIEFFER
Sugesh ANANDAN
2/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
Introduction
Infrastructure attendue
Qu’est-ce qu’Ansible?
Ansible est une brique logicielle Open Source qui permet de manager une
infrastructure automatique: déploiement automatisés multi-environnements, gestion de
configuration systèmes et application de mises à jour. Ansible a été développé en 2012 par
Michael Dehaan, est essentiellement écrit en Python et fonctionne sous environnement
Linux.
3/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
Les machines clientes sont définies dans un inventaire (fichier YAML). Les inventaires
Ansible peuvent contenir des groupes parents, des groupes enfants, des variables… Ce qui
nous permet de pouvoir scinder les tâches à effectuer selon le type de machines ou le rôle
d’une machine au sein d’un SI.
Ansible permet d’utiliser différents modules, qui sont exécutés sur les machines clientes
(contenues dans le(s) fichier(s) d’inventaire), au travers de playbooks.
Ces playbooks sont aussi au format YAML et permettent de définir des instructions à lancer
sur les machines. Ces playbooks peuvent être construits de telle manière à cibler une
machine ou un groupement de machines.
4/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
Afin de mettre en place l’infrastructure demandée, nous avons besoin tout d’abord
d’un Orchestrateur Ansible, une machine sous Linux.
Comme nos machines physiques sont sous Windows, nous avons utilisé WSL (Windows
Subsystem for Linux) afin de faire tourner une machine virtuelle Debian 11 sur notre
machine physique.
Configuration de l’Orchestrateur
En PowerShell sur la machine hôte:
wsl –install
ssh-keygen
5/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
Nous avons utilisé Ansible Vault afin de chiffrer les mots de passe utilisés lors du lancement
des playbooks. Ainsi, un fichier chiffré contient l’ensemble des mots de passe que nous
utilisons. Nous utiliserons le paramètre ‘--ask-vault-pass’ lors du lancement de nos
playbooks, et y saisirons le super mot de passe, afin qu’Ansible puisse déchiffrer et utiliser
les mots de passe de manière sécurisés.
Cela revient donc à dire qu’afin de déployer l’infrastructure attendue, les seuls prérequis
sont d'avoir 5 VM Vierges sous Linux et un Orchestrateur Ansible.
6/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
$ cd ansible
$ touch hosts.yaml
hosts.yaml
all:
vars:
ansible_python_interpreter: /usr/bin/python3
ansible_user: user
children:
webservers:
hosts:
webserver1:
ansible_host: 192.168.77.50
webserver2:
ansible_host: 192.168.77.39
dbservers:
hosts:
dbserver1:
ansible_host: 192.168.77.97
mysql_server_id: 1
mysql_log_basename: master1
dbserver2:
ansible_host: 192.168.77.86
mysql_server_id: 2
mysql_log_basename: master2
syslogservers:
hosts:
syslogserver1:
ansible_host: 192.168.77.21
7/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
Ensuite, il va autoriser les membres du groupe ‘admin’ a effectuer des sudo sans mots de
passe et va, au travers d’une boucle, mettre à jour les fichiers /etc/hosts des machines
clientes dynamiquement afin de ne pas avoir de problème lors de la résolution de noms.
Enfin, il va installer certains paquets nécessitant d’être installés dès lors: mariadb-server et
PyMySql sur les serveurs BDD.
playbook.yml
---
- hosts: all
become: true
vars:
users:
-"user"
tasks:
8/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
append: yes
state: present
createhome: yes
with_items: "{{ users }}"
- name: "Build hosts file and dispatch it automatically through all the
VMs" lineinfile:
path: /etc/hosts
regexp: '.*{{ item }}$'
line: "{{ hostvars[item].ansible_default_ipv4.address }} {{item}}"
state: present
when: hostvars[item].ansible_default_ipv4.address is defined
with_items: "{{groups.all}}"
- hosts: [dbservers]
become: true
tasks:
9/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
- name: "Install some packages"
apt:
name:
- mariadb-server
- mariadb-client
- python3-pymysql
state: latest
playbook_resetting_mariadb_password_dbservers.yml
---
- hosts: [dbservers]
become: true
tasks:
10/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
when: root_pwd_check.rc != 0
tags: mariadb
playbook_wp.yml
---
- hosts: [dbservers]
become: true
handlers:
- name: "Restart mysql service"
service:
name: mysql
state: restarted
11/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
tasks:
- name: "Create user 'user1' with password, all database privileges and
'WITH GRANT OPTION' in db1 and db2"
12/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
community.mysql.mysql_user:
login_host: localhost
login_user: root
login_password: "{{ mysql_root_password }}"
state: present
name: glpi
password: password
host: "%"
priv:
'*.*': 'ALL,GRANT'
- hosts: [webservers]
become: true
- vars_files:
- - vars/default.yml
-
- tasks:
- - name: Install prerequisites
- apt: name=aptitude update_cache=yes state=latest force_apt_get=yes
- tags: [ system ]
-
- - name: Install LAMP Packages
- apt: name={{ item }} update_cache=yes state=latest
- loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql',
'libapache2-mod-php' ]
- tags: [ system ]
-
- - name: Install PHP Extensions
- apt: name={{ item }} update_cache=yes state=latest
- loop: "{{ php_modules }}"
- tags: [ system ]
-
- # Apache Configuration
- - name: Create document root
- file:
- path: "/var/www/{{ item.name }}"
- state: directory
- owner: "www-data"
- group: "www-data"
- mode: '0755'
- with_items: "{{clients}}"
- tags: [ apache ]
-
- - name: Set up Apache VirtualHost
- template:
- src: "files/apache.conf.j2"
- dest: "/etc/apache2/sites-available/{{ item.domain }}"
- notify: Reload Apache
13/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
- with_items: "{{clients}}"
- tags: [ apache ]
-
- - name: Enable rewrite module
- shell: /usr/sbin/a2enmod rewrite
- notify: Reload Apache
- tags: [ apache ]
-
- - name: Enable new site
- shell: /usr/sbin/a2ensite {{ item.domain }}
- notify: Reload Apache
- with_items: "{{clients}}"
- tags: [ apache ]
-
- - name: Disable default Apache site
- shell: /usr/sbin/a2dissite 000-default.conf
- notify: Restart Apache
- tags: [ apache ]
-
- # MySQL Configuration
- - name: Set the root password
- mysql_user:
- name: root
- password: "{{ mysql_root_password }}"
- login_unix_socket: /var/run/mysqld/mysqld.sock
- tags: [ mysql, mysql-root ]
-
- - name: Remove all anonymous user accounts
- mysql_user:
- name: ''
- host_all: yes
- state: absent
- login_user: root
- login_password: "{{ mysql_root_password }}"
- tags: [ mysql ]
-
- - name: Remove the MySQL test database
- mysql_db:
- name: test
- state: absent
- login_user: root
- login_password: "{{ mysql_root_password }}"
- tags: [ mysql ]
-
- - name: Creates database for WordPress
- mysql_db:
- name: "{{ mysql_db }}"
- state: present
14/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
- login_user: root
- login_password: "{{ mysql_root_password }}"
- tags: [ mysql ]
-
- - name: Create MySQL user for WordPress
- mysql_user:
- name: "{{ mysql_user }}"
- password: "{{ mysql_password }}"
- priv: "{{ mysql_db }}.*:ALL"
- state: present
- login_user: root
- login_password: "{{ mysql_root_password }}"
- tags: [ mysql ]
-
- # UFW Configuration
- - name: "UFW - Allow HTTP on port {{ http_port }}"
- ufw:
- rule: allow
- port: "{{ http_port }}"
- proto: tcp
- tags: [ system ]
-
- # WordPress Configuration
- - name: Download and unpack latest WordPress
- unarchive:
- src: https://wordpress.org/latest.tar.gz
- dest: "/var/www/{{ item.name }}"
- remote_src: yes
- creates: "/var/www/{{ item.name }}/wordpress"
- with_items: "{{clients}}"
- tags: [ wordpress ]
-
- - name: Set ownership
- file:
- path: "/var/www/{{ item.name }}"
- state: directory
- recurse: yes
- owner: www-data
- group: www-data
- with_items: "{{clients}}"
- tags: [ wordpress ]
-
- - name: Set permissions for directories
- shell: "/usr/bin/find /var/www/{{ item.name }}/wordpress/ -type d -exec chmod
750 {} \\;"
- with_items: "{{clients}}"
- tags: [ wordpress ]
-
15/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
- - name: Set permissions for files
- shell: "/usr/bin/find /var/www/{{ item.name }}/wordpress/ -type f -exec chmod
640 {} \\;"
- with_items: "{{clients}}"
- tags: [ wordpress ]
-
- - name: Set up wp-config
- template:
- src: "files/wp-config.php.j2"
- dest: "/var/www/{{ item.name }}/wordpress/wp-config.php"
- with_items: "{{clients}}"
- tags: [ wordpress ]
-
- handlers:
- - name: Reload Apache
- service:
- name: apache2
- state: reloaded
-
- - name: Restart Apache
- service:
- name: apache2
- state:
restarted
16/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
Nous poussons ici des fichiers de configuration Apache2 (notamment pour la configuration
du VHost Apache), et des fichiers de configuration Heartbeat (notamment pour la VIP à
utiliser et tout un ensemble de paramètres à définir), en somme pour la construction du
cluster.
Enfin, ce playbook va activer la configuration de site que nous venons de créer, nommée
‘webapp’ et désactiver celle par défaut, afin de pouvoir joindre en http sur le port 80 notre
serveur web au travers de l’IP du cluster.
playbook_webservers.yml
---
- hosts: [webservers]
become: true
tasks:
- name: "Apt-get update"
shell: 'apt-get update'
17/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
18/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
Ensuite, il va exécuter la commande SHOW MASTER STATUS; sur le serveur principal afin d’y
récupérer deux valeurs utilisées pour configurer le serveur élève: File: xxxx et Position:
xxxx. Ces informations sont récupérées dynamiquement, stockées dans une variable au
moyen de l’option ‘register:’ d’Ansible, et ré-utilisées dans une seconde tâche.
Ces indicateurs servent au serveur élève pour qu’il se cale sur la position du pointeur de
réplication, savoir s’il est en déphasage ou pas.
playbook_dbservers_replication.yml
---
- hosts: [dbservers]
become: true
tasks:
19/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
- block:
20/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
Sur les machines clientes, il va modifier ce même fichier pour ajouter le serveur sur lequel
les logs doivent être envoyés, dynamiquement au moyen d’une variable Ansible allant
récupérer l’adresse IP du serveur Syslog dans l’inventaire, le tout en utilisant le port 514.
playbook_syslog.yml
---
- hosts: [syslogservers]
become: true
tasks:
- name: "Install rsyslog on syslogserver(s)"
apt:
name: rsyslog
update_cache: yes
state: present
21/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
ansible.builtin.lineinfile:
path: /etc/rsyslog.conf
regexp: '^(.)module(load="imtcp")$'
line: 'module(load="imtcp")'
22/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
Ce playbook va simplement installer le paquet ntp sur l’ensemble des machines clientes,
s’assurer que le service est lancé et lui définir manuellement une zone de temps, CET pour
Central European Time dans notre cas d’utilisation.
playbook_ntp.yml
---
- name: "Installing and configuring NTP"
hosts: all
become: true
vars:
timezone: CET #Central European Time
tasks:
- name: "Install NTP"
apt:
name: ntp
23/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
Nous utilisons encore une fois les templates Jinga2 pour pousser ce fichier vers le serveur
en question.
backupsql.sh
#!/bin/sh
mysqldump -u root -p"{{mysql_root_password}}" glpi > /etc/backups/GLPI-$(date "+
%F").sql
Enfin, le playbook va ajouter une tâche cron qui exécutera le fichier .sh poussé tous les
jours à 15h25, et changera les droits sur le script afin qu’il puisse être exécuté.
playbook_dbservers.yml
---
- hosts: [dbservers]
become: true
tasks:
24/23
ESIEE-IT - 2ème année M2I - Réseaux et Systèmes - Année scolaire 2021-
2022
dest: /etc/backups/{{ item | basename | regex_replace('\.j2$', '') }}.sh
with_fileglob:
- files/backupsql.j2
when: mysql_server_id==2
Conclusion
Au travers des différents cours dispensés et après avoir pratiqué, nous nous
sommes rendus compte qu’Ansible était un outil puissant permettant de manager son ou
ses infrastructures de manière centralisée.
Il est certain que nous ré-utiliserons cet outil à des fins scolaires et professionnelles.
Enfin, nous avons vu qu’Ansible pouvait être couplé à Vagrant, outil permettant de déployer
des VM selon des templates prédéfinies.
25/23