Ansible est un outil d'automatisation simple qui automatise le déploiement d'applications logicielles, le provisionnement du cloud et la gestion de la configuration. Il s'agit d'un outil d'orchestration de serveur qui vous aide à gérer et à contrôler un grand nombre de nœuds de serveur à partir d'emplacements uniques appelés « machines de contrôle ». Ansible a été créé par Michael DeHaan en 2012 et est écrit en Python et Powershell.
Dans ce tutoriel, nous allons vous montrer comment créer un Playbook Ansible de base pour provisionner la pile LEMP sur le serveur Ubuntu 18.04. Vous apprendrez à créer un Playbook Ansible de base qui peut être mis à l'échelle pour d'autres applications de projet PHP telles que WordPress, Nextcloud, etc.
Prérequis
- 2 système d'exploitation Ubuntu.
- 10.5.5.20 ansible
- 10.5.5.26 disposition
- Connaissance de l'utilisation de base d'Ansible
- Privilèges root
Ce que nous allons faire :
- Configurer le projet Ansible Playbook
- Générer la structure du répertoire des rôles du Playbook Ansible
- Configurer les hôtes et site.yml
- Configurer les rôles "communs" – Configuration de base
- Configurer les rôles "web" – Configuration Nginx et PHP-FPM
- Configurer les rôles 'db' - Configuration de la base de données MySQL
- Test
Étape 1 - Configurer le projet Ansible Playbook
Ansible Playbook est un ensemble d'instructions que vous envoyez pour s'exécuter sur un seul ou un groupe d'hôtes de serveur. Il représente le provisionnement ansible, où l'automatisation est définie comme des tâches, et tous les travaux comme l'installation de packages, l'édition de fichiers, seront effectués par des modules ansible.
Le Playbook Ansible contient une configuration de base, notamment des informations sur les hôtes et les utilisateurs des serveurs de provisionnement, une liste de tâches qui seront implémentées sur les serveurs de provisionnement, des modèles et des configurations personnalisées, ainsi qu'un groupe de variables faisant partie des modèles et des tâches.
Tout d'abord, créez le répertoire principal du projet sur la machine 'ansible-control'. Le répertoire principal du projet contiendra tous nos répertoires, fichiers et configurations de playbook.
Créez le répertoire du projet Ansible appelé 'project-lemp' et allez-y.
mkdir project-lemp/
cd project-lemp
Créez maintenant un nouveau fichier de configuration 'hosts' et 'site.yml', puis créez un nouveau répertoire appelé 'roles'.
touch hosts site.yml
mkdir -p roles/
Détails sur les configurations :
hôtes - C'est un fichier d'inventaire qui contient des informations sur les serveurs gérés par ansible. Il vous permet de créer un groupe de serveurs qui facilitent la gestion et la mise à l'échelle du fichier d'inventaire lui-même. Le fichier d'inventaire peut être créé avec de nombreux formats différents, y compris les formats INI et YAML.
site.yml - Le fichier de playbook principal qui contient le groupe d'hôtes qui sera géré à l'aide de nos rôles disponibles.
rôles - c'est un groupe de playbooks Ansible qui sera utilisé pour provisionner le serveur. Les rôles ansible ont leurs propres structures de répertoires, chaque rôle contiendra des répertoires tels que des tâches, des gestionnaires, des variables, etc.
Étape 2 - Générer des rôles Ansible pour la structure de répertoire
Dans cette étape, nous allons générer un répertoire de rôles ansible à l'aide de la commande ansible-galaxy. Nous allons générer deux rôles appelés rôles "communs" et rôles "web".
Dans le répertoire 'project-lemp', allez dans le répertoire 'roles'.
cd roles/
Générez un répertoire de structure de rôles et des fichiers pour les rôles "commun" et "web" en exécutant la commande ansible-galaxy ci-dessous.
ansible-galaxy init common
ansible-galaxy init web
ansible-galaxy init db
Après cela, vérifiez toutes les structures de répertoires de rôles ansible disponibles à l'aide de la commande suivante.
tree .
Vous verrez le résultat comme ci-dessous.
Étape 3 - Configurer les hôtes et site.yml
Le fichier 'hosts' contiendra la liste et le groupe du serveur géré par Ansible. Pour ce guide, nous allons créer un groupe appelé 'lemp' avec le membre nommé 'server01' et l'adresse IP 10.5.5.26.
Modifiez le fichier 'hosts' à l'aide de l'éditeur vim.
vim hosts
Collez la configuration ci-dessous.
[lemp]
server01 ansible_host=10.5.5.26
Enregistrez et fermez.
Ensuite, modifiez le fichier de configuration site.yml.
vim site.yml
Collez les configurations ci-dessous.
---
- hosts: lemp
remote_user: hakase
become: yes
roles:
- common
- web
- db
Enregistrez et fermez.
Étape 3 - Configurer les rôles communs
Dans cette étape, nous allons configurer les rôles communs. Et pour ce faire, nous devons créer une liste de tâches que nous allons effectuer.
Ci-dessous la liste des tâches que nous allons faire sur les rôles "communs".
- Changer de référentiel
- Mettre à jour le dépôt
- Mettre à niveau les packages vers la dernière version
- Configurer le fuseau horaire du serveur
Allez maintenant dans le répertoire 'common' et éditez la configuration 'tasks/main.yml'.
cd common/
vim tasks/main.yml
Créez une tâche pour changer le référentiel, et nous utiliserons le module 'copy' qui copiera la base 'sources.list' du répertoire 'files' vers l'hôte distant '/etc/apt/'.
- name: Change repository Ubuntu 18.04Step 4 - Setup 'web' Roles
copy:
src: sources.list
dest: /etc/apt/
backup: yes
Créez une tâche pour mettre à jour le référentiel et mettez à niveau tous les packages vers la dernière version à l'aide du module 'apt'.
- name: Update repository and Upgrade packages
apt:
upgrade: dist
update_cache: yes
Créez maintenant la tâche de configuration du fuseau horaire du système à l'aide du module ansible timezone.
- name: Setup timezone to Asia/Jakarta
timezone:
name: Asia/Jakarta
state: latest
Enregistrez et fermez.
Après cela, créez une nouvelle configuration de référentiel 'sources.list' dans le répertoire 'files'.
vim files/sources.list
Choisissez le référentiel le plus proche de l'emplacement de votre serveur, ci-dessous est le mien.
deb http://buaya.klas.or.id/ubuntu/ bionic main restricted
deb http://buaya.klas.or.id/ubuntu/ bionic-updates main restricted
deb http://buaya.klas.or.id/ubuntu/ bionic universe
deb http://buaya.klas.or.id/ubuntu/ bionic-updates universe
deb http://buaya.klas.or.id/ubuntu/ bionic multiverse
deb http://buaya.klas.or.id/ubuntu/ bionic-updates multiverse
deb http://buaya.klas.or.id/ubuntu/ bionic-backports main restricted universe multiverse
deb http://buaya.klas.or.id/ubuntu/ bionic-security main restricted
deb http://buaya.klas.or.id/ubuntu/ bionic-security universe
deb http://buaya.klas.or.id/ubuntu/ bionic-security multiverse
Enregistrez et fermez.
enfin, la configuration des rôles "communs" est terminée.
Étape 4 - Configurer les rôles 'web'
Dans cette étape, nous allons configurer les rôles 'web'. Il effectuera certaines tâches, notamment l'installation du serveur Web Nginx, PHP-FPM avec quelques extensions de base et la configuration de PHP-FPM avec Nginx.
Vous trouverez ci-dessous des détails sur les tâches que nous effectuerons sur les rôles « Web » :
- Installer Nginx
- Installer PHP-FPM
- Configurer php.ini
- Créer un hôte virtuel
- Ajouter un fichier phpinfo
Allez dans le répertoire 'web' et éditez le fichier 'tasks/main.yml'.
cd web/
vim tasks/main.yml
Créez la première tâche pour l'installation de nginx à l'aide du module apt.
- name: Install Nginx
apt:
name: nginx
state: latest
Créez maintenant la tâche d'installation de PHP-FPM avec quelques extensions de base. Et pour l'installation de plusieurs packages, nous pouvons utiliser le format python 'list' comme ci-dessous.
- name: Instal PHP-FPM
apt:
name: ['php','php-fpm','php-common','php-cli','php-curl']
state: latest
Ensuite, nous ajouterons de nouvelles lignes à la configuration de php.ini en utilisant le module 'blockinfile'. Et à la fin de la ligne, nous aviserons l'ansible de redémarrer le service php-fpm après avoir configuré le fichier php.ini.
- name: Configure php.ini
blockinfile:
dest: /etc/php/{{ php_version }}/fpm/php.ini
block: |
date.time = Asia/Jakarta
cgi-fix_pathinfo = 0
backup: yes
notify: restart php-fpm
Nous allons maintenant copier la configuration de l'hôte virtuel nginx à l'aide du module 'template'. Le module template copiera la configuration du répertoire 'templates' vers le serveur distant. Nous allons copier le modèle d'hôte virtuel jinja2 'vhost.j2' dans le répertoire '/etc/nginx/sites-enabled/', et le dernier nous notifierons à l'ansible de redémarrer le service nginx.
- name: Create Nginx virtual host
template:
src: vhost.j2
dest: /etc/nginx/sites-enabled/vhost-{{ domain_name }}
notify: restart nginx
Après cela, nous allons créer de nouvelles tâches pour créer le répertoire racine Web à l'aide du module 'file' et y copier le modèle index.php.
- name: Create web-root directory
file:
path: /var/www/{{ domain_name }}
state: directory
- name: Upload index.html and info.php files
template:
src: index.php.j2
dest: /var/www/{{ domain_name }}/index.php
Enregistrez et fermez.
Nous allons maintenant configurer les gestionnaires pour redémarrer le service nginx et php-fpm. Modifiez la configuration 'handlers/main.yml' à l'aide de l'éditeur vim.
gestionnaires vim/main.yml
Collez les configurations ci-dessous.
- name: restart nginx
service:
name: nginx
state: restarted
enabled: yes
- name: restart php-fpm
service:
name: php{{ php_version }}-fpm
state: restarted
enabled: yes
Enregistrez et fermez.
Ensuite, nous allons modifier la configuration 'vars/main.yml'. En haut des configurations, vous remarquerez les configurations variables '{{ php_version }}' et '{{ domain_name }}'. Ces variables représentent la configuration de notre environnement pour la version php et le nom de domaine qui sera utilisé. La variable rend ansible plus réutilisable car il nous suffit de modifier la configuration de la variable 'vars/main.yml' et non de modifier la configuration de base.
Modifiez la configuration des variables 'vars/main.yml' à l'aide de l'éditeur vim.
vim vars/main.yml
Collez les configurations ci-dessous.
php_version: 7.2
domain_name: hakase-labs.io
Enregistrez et fermez.
Nous allons maintenant créer les configurations de modèles jinja2 'index.php.j2' et 'vhost.j2' dans le répertoire 'templates/'.
vim templates/index.php.j2
Collez la configuration ci-dessous.
<html>
<body>
<h1><center>index.html for domain {{ domain_name }}</center></h1>
<p>
<p>
<?php
phpinfo();
?>
</body>
</html>
Enregistrez et fermez.
Après cela, créez le modèle pour la configuration de l'hôte virtuel nginx 'vhost.j2'.
vim templates/vhost.j2
Collez les configurations ci-dessous.
server {
listen 80;
listen [::]:80;
root /var/www/{{ domain_name }};
index index.php index.html index.htm index.nginx-debian.html;
server_name {{ domain_name }};
location / {
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php{{ php_version }}-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Enregistrez et fermez la configuration, et nous avons terminé la configuration des rôles Web.
Étape 5 - Configurer les rôles 'db'
À cette étape, nous allons configurer les rôles 'db' pour l'installation et la configuration de la base de données MySQL.
Vous trouverez ci-dessous les détails des tâches qui seront effectuées sur les rôles 'db'.
- installer mysql
- Créer une base de données MySQL
- Créer un utilisateur MySQL
- redémarrer mysql
Allez dans le répertoire 'db' et modifiez la configuration 'tasks/main.yml'.
cd db/
vim tasks/main.yml
Installez maintenant les packages MySQL en utilisant le module 'apt' et le format python 'list' pour l'installation de plusieurs packages.
- name: Install MySQL
apt:
name: ['mysql-server','mysql-client','python-mysqldb']
state: latest
notify: restart mysql
Créez ensuite de nouvelles tâches pour créer la base de données et l'utilisateur MySQL, puis accordez tous les privilèges de l'utilisateur à la base de données.
- name: Create database
mysql_db:
name: '{{ db_name }}'
state: present
- name: Create user for the database
mysql_user:
name: '{{ db_user }}'
password: '{{ db_pass }}'
encrypted: yes
priv: '{{ db_name }}.*:ALL'
state: present
Enregistrez et fermez.
Ensuite, modifiez la configuration 'handlers/main.yml'.
vim handlers/main.yml
Collez la configuration de la tâche de redémarrage du service MySQL.
- name: restart mysql
service:
name: mysql
state: restarted
enabled: yes
Enregistrez et fermez.
Après cela, modifiez la configuration de la variable vars 'vars/main.yml'.
vim vars/main.yml
Collez ces variables pour la base de données MySQL et la configuration utilisateur ci-dessous.
db_name: hakase-db
db_user: hakase
db_pass: '*C960D382DB42E57D3BAC33891CF87900DCB1A869'
Enregistrez et fermez.
La variable 'db_pass' contient le mot de passe crypté MySQL, et vous pouvez générer un mot de passe MySQL crypté à l'aide d'outils en ligne.
Étape 6 - Exécuter le Playbook Ansible
Allez dans le répertoire du projet Ansible.
cd project-lemp/
Exécutez la commande ansible-playbook ci-dessous.
ansible-playbook -i hosts site.yml
Maintenant, l'ansible exécutera tous les rôles que nous attribuons à l'hôte. Une fois terminé, le résultat s'affichera comme ci-dessous.
Assurez-vous de ne recevoir aucune erreur.
Étape 7 - Tester
Ouvrez votre navigateur Web et tapez le nom de domaine dans la barre d'adresse http://hakase-labs.io.
Et vous verrez la page d'index avec phpinfo comme ci-dessous.
Le PHP-FPM et Nginx fonctionnent.
Ensuite, revenez au terminal du serveur et connectez-vous au serveur MySQL en utilisant l'utilisateur et le mot de passe que nous avons créés sur la variable de rôles 'mysql'.
mysql -u hakase -p
PASSWORD: hakasepass
vérifier la liste des bases de données appartenant à l'utilisateur.
show databases;
Et vous serez connecté au shell MySQL et la base de données nommée 'hakase-db' apparaîtra dans la liste.
Enfin, le Playbook Ansible pour l'installation et la configuration de la pile LEMP a été créé et testé avec succès.