Tutorial

Comment utiliser Ansible pour installer et configurer LAMP sur Ubuntu 18.04

ApachePHPLAMP StackAnsibleAutomated Setups

Introduction

L'automatisation des serveurs joue maintenant un rôle essentiel dans l'administration des systèmes, en raison de la nature disponible des environnements d'application modernes. Les outils de gestion de la configuration tels qu’Ansible sont généralement utilisés pour rationaliser le processus d'automatisation de la configuration des serveurs en établissant des procédures standard pour les nouveaux serveurs tout en réduisant l'erreur humaine associée aux configurations manuelles.

Ansible offre une architecture simple qui ne nécessite pas l'installation de logiciels spéciaux sur les nœuds. Elle fournit également un ensemble robuste de caractéristiques et de modules intégrés qui facilitent l'écriture de scripts d'automatisation.

Ce guide explique comment utiliser Ansible pour automatiser les étapes contenues dans notre guide sur Comment installer Linux, Apache, MySQL et PHP (LAMP) sur Ubuntu 18.04. Un empilement “LAMP” est un groupe de logiciels open-source qui est généralement installé ensemble pour permettre à un serveur d'accueillir des sites web dynamiques et des apps web. Ce terme est en fait un sigle qui représente le système d'exploitation Linux, avec le serveur web Apache. Les données du site sont stockées dans une base de données MySQL, et le contenu dynamique est traité par PHP.

Conditions préalables

Afin d'exécuter la configuration automatisée fournie par le playbook dont nous parlons dans ce guide, vous aurez besoin :

Avant de poursuivre, vous devez d'abord vous assurer que votre nœud de contrôle Ansible est capable de connecter et d'exécuter des commandes sur votre ou vos hôte(s) Ansible. Pour réaliser un test de connexion, veuillez vérifier l'étape 3 de Comment installer et configurer Ansible sur Ubuntu 18.04.

Que fait ce Playbook ?

Ce playbook Ansible offre une alternative à la gestion manuelle via la procédure décrite dans notre guide sur Comment installer Linux, Apache, MySQL et PHP (LAMP) sur Ubuntu 18.04.

L'exécution de ce playbook exécutera les actions suivantes sur vos hôtes Ansible :

  1. Installation d’aptitude, qui est préférée par Ansible comme une alternative au gestionnaire de paquets apt.
  2. Installation des packages LAMP requis.
  3. Création d'un nouveau VirtualHost Apache et création d'une racine de document dédiée à cela.
  4. Activation du nouveau VirtualHost
  5. Désactivation du site web par défaut Apache, lorsque la variable disable_default est réglée sur true
  6. Définit le mot de passe pour l'utilisateur root de MySQL.
  7. Supprime les comptes MySQL anonymes et la base de données test.
  8. Configure UFW pour autoriser le trafic HTTP sur le port configuré (80 par défaut).
  9. Configure un script de test PHP en utilisant le modèle fourni.

Une fois le Playbook exécuté, vous aurez un environnement web PHP fonctionnant au-dessus d'Apache, basé sur les options que vous avez définies dans vos variables de configuration.

Comment utiliser ce Playbook

La première chose que nous devons faire est d'obtenir le playbook LAMP et ses dépendances à partir du répertoire do-community/ansible-playbooks Nous devons cloner ce répertoire vers un dossier local à l'intérieur du nœud de contrôle Ansible.

Si vous avez déjà cloné ce répertoire en suivant un autre guide, accédez à votre copie existante de ansible-playbooks et lancez une commande git pull pour vous assurer que vous disposez d'un contenu mis à jour :

  • cd ~/ansible-playbooks
  • git pull

Si c'est la première fois que vous utilisez le répertoire do-community/ansible-playbooks, vous devriez commencer par cloner le répertoire vers votre dossier d'accueil avec :

  • cd ~
  • git clone https://github.com/do-community/ansible-playbooks.git
  • cd ansible-playbooks

Les fichiers qui nous intéressent sont situés à l'intérieur du dossier lamp_ubuntu1804, qui a la structure suivante :

lamp_ubuntu1804
├── files
│   ├── apache.conf.j2
│   └── info.php.j2
├── vars
│   └── default.yml
├── playbook.yml
└── readme.md

Voici ce que sont chacun de ces fichiers :

  • files/info.php.j2: fichier template pour configurer une page de test PHP sur la racine du serveur web
  • files/apache.conf.j2 : fichier template pour la création du VirtualHost Apache
  • vars/default.yml : fichier variable pour la personnalisation des paramètres playbook
  • playbook.yml : le fichier playbook, contenant les tâches à exécuter sur le( les) serveur(s) distant(s)
  • readme.md : un fichier texte contenant des informations sur ce playbook

Nous allons modifier le fichier variable du playbook pour personnaliser les configurations de MySQL et d'Apache. Accédez au répertoire lamp_ubuntu1804 et ouvrez le fichier vars/default.yml en utilisant l'éditeur en ligne de commande de votre choix :

  • cd lamp_ubuntu1804
  • nano vars/default.yml

Ce fichier contient quelques variables qui nécessitent votre attention :

vars/default.yml
---
mysql_root_password: "mysql_root_password"
app_user: "sammy"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
disable_default: true

La liste suivante contient une brève explication de chacune de ces variables et la façon dont vous pourriez vouloir les modifier :

  • mysql_root_password : le mot de passe souhaité pour le compte root MySQL
  • app_user : un utilisateur distant non root sur l'hôte Ansible qui sera défini comme le propriétaire des fichiers d'application
  • http_host : votre nom de domaine
  • http_conf :le nom du fichier de configuration qui sera créé au sein d'Apache
  • http_port : port HTTP pour cet hôte virtuel, où 80 est celui par défaut
  • disable_default : la possibilité de désactiver ou non le site web par défaut qui accompagne Apache.

Une fois que vous avez terminé la mise à jour des variables à l'intérieur de vars/default.yml, enregistrez et fermez ce fichier Si vous avez utilisé nano, faites-le en appuyant sur CTRL+X, Y, puis ENTER.

Vous êtes maintenant prêt à exécuter ce playbook sur un ou plusieurs serveurs. La plupart des playbooks sont configurés pour être exécutés sur chaque serveur de votre répertoire, par défaut. Nous pouvons utiliser le drapeau -l pour nous assurer qu'un seul sous-ensemble de serveurs, ou un seul serveur, est affecté par le playbook. Nous pouvons également utiliser le drapeau -u pour spécifier quel utilisateur du serveur distant nous utilisons pour nous connecter et exécuter les commandes du playbook sur les hôtes distants.

Pour exécuter le playbook uniquement sur server1, connecté en tant quesammy, vous pouvez utiliser la commande suivante :

  • ansible-playbook playbook.yml -l server1 -u sammy

Vous obtiendrez une sortie similaire à ceci :

Output
PLAY [all] ********************************************************************************************************* TASK [Gathering Facts] *********************************************************************************************************ok: [server1] TASK [Install prerequisites] *********************************************************************************************************ok: [server1] => (item=aptitude) ... TASK [UFW - Allow HTTP on port 80] ********************************************************************************************************* changed: [server1] TASK [Sets Up PHP Info Page] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Reload Apache] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Restart Apache] ********************************************************************************************************* changed: [server1] PLAY RECAP ********************************************************************************************************* server1 : ok=15 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Remarque : pour plus d'informations sur la façon d'exécuter les playbooks Ansible, consultez notre Guide Ansible Cheat Sheet.

Lorsque le playbook a fini de s'exécuter, ouvrez votre navigateur web et accédez à l'adresse hôte ou IP du serveur, tel qu'elle est configurée dans les variables playbook, suivi par /info.php :

http://server_host_or_IP/info.php

Vous verrez une page comme ceci :

phpinfo page

Étant donné que cette page contient des informations sensibles sur votre environnement PHP, il est recommandé que vous la supprimiez du serveur en lançant une commande rm -f /var/www/info.php une fois que vous avez terminé de la configurer.

Le contenu du Playbook

Vous pouvez trouver la configuration du serveur LAMP présentée dans ce tutoriel dans le dossier lamp_ubuntu1804 à l'intérieur du répertoire DigitalOcean Community Playbooks. Pour copier ou télécharger directement le contenu du script, cliquez sur le bouton Raw dans la partie supérieure de chaque script.

Le contenu complet du playbook ainsi que ses fichiers associés sont également inclus ici pour votre commodité.

vars/default.yml

Le fichier variable default.yml contient des valeurs qui seront utilisées dans les tâches du playbook, comme le mot de passe pour le compte root MySQL et le nom du domaine à configurer au sein d'Apache.

vars/default.yml
---
mysql_root_password: "mysql_root_password"
app_user: "sammy"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
disable_default: true

files/apache.conf.j2

Le fichier apache.conf.j2 est un fichier template Jinja 2 qui configure un nouveau VirtualHost Apache. Les variables utilisées dans ce modèle sont définies dans le fichier variable vars/default.yml

files/apache.conf.j2
<VirtualHost *:{{ http_port }}>
   ServerAdmin webmaster@localhost
   ServerName {{ http_host }}
   ServerAlias www.{{ http_host }}
   DocumentRoot /var/www/{{ http_host }}
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined

   <Directory /var/www/{{ http_host }}>
         Options -Indexes
   </Directory>

   <IfModule mod_dir.c>
       DirectoryIndex index.php index.html index.cgi index.pl  index.xhtml index.htm
   </IfModule>

</VirtualHost>

files/info.php.j2

Le fichier info.php.j2 est un autre modèle Jinja, utilisé pour configurer un script de test PHP dans la racine du document du serveur LAMP nouvellement configuré.

files/info.php.j2
<?php
phpinfo();

playbook.yml

Le fichier playbook.yml est l'endroit où toutes les tâches de cette configuration sont définies. Il commence par définir le groupe de serveurs qui doit être la cible de cette configuration tous, après quoi il utilise become: true pour définir que les tâches doivent être exécutées avec une élévation des privilèges sudo par défaut. Ensuite, il inclut le fichier variable vars/default.yml pour charger les options de configuration.

playbook.yml

---
- hosts: all
  become: true
  vars_files:
    - vars/default.yml

  tasks:
    - name: Install prerequisites
      apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes
      loop: [ 'aptitude' ]

  #Apache Configuration
    - name: Install LAMP Packages
      apt: name={{ item }} update_cache=yes state=latest
      loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]

    - name: Create document root
      file:
        path: "/var/www/{{ http_host }}"
        state: directory
        owner: "{{ app_user }}"
        mode: '0755'

    - name: Set up Apache virtualhost
      template:
        src: "files/apache.conf.j2"
        dest: "/etc/apache2/sites-available/{{ http_conf }}"
      notify: Reload Apache

    - name: Enable new site
      shell: /usr/sbin/a2ensite {{ http_conf }}
      notify: Reload Apache

    - name: Disable default Apache site
      shell: /usr/sbin/a2dissite 000-default.conf
      when: disable_default
      notify: Reload Apache

  # MySQL Configuration
    - name: Sets the root password
      mysql_user:
        name: root
        password: "{{ mysql_root_password }}"
        login_unix_socket: /var/run/mysqld/mysqld.sock

    - name: Removes all anonymous user accounts
      mysql_user:
        name: ''
        host_all: yes
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"

    - name: Removes the MySQL test database
      mysql_db:
        name: test
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"

  # UFW Configuration
    - name: "UFW - Allow HTTP on port {{ http_port }}"
      ufw:
        rule: allow
        port: "{{ http_port }}"
        proto: tcp

  # PHP Info Page
    - name: Sets Up PHP Info Page
      template:
        src: "files/info.php.j2"
        dest: "/var/www/{{ http_host }}/info.php"

  handlers:
    - name: Reload Apache
      service:
        name: apache2
        state: reloaded

    - name: Restart Apache
      service:
        name: apache2
        state: restarted

N'hésitez pas à modifier ces fichiers pour qu’ils répondent au mieux à vos besoins individuels dans votre propre flux de travail.

Conclusion

Dans ce guide, nous avons utilisé Ansible pour automatiser le processus d'installation et de création d'un environnement LAMP sur un serveur distant. Parce que chaque individu a des besoins différents lorsqu'il travaille avec les bases de données et les utilisateurs de MySQL, nous vous encourageons à consulter la documentation officielle Ansible pour obtenir plus d'informations et de cas d'utilisation du module mysql_user Ansible.

Si vous souhaitez inclure d'autres tâches dans ce playbook pour personnaliser davantage la configuration de votre serveur, veuillez vous référer à notre guide d'introduction à Ansible, Gestion de la configuration 101 : L'écriture de Playbooks Ansible.

Creative Commons License