Comment automatiser l’installation de WordPress sur Ubuntu 14.04 avec Ansible

introduction

Ansible est un moyen simple et sans agent d’automatiser votre infrastructure. Si vous vous retrouvez constamment à déployer WordPress, Ansible pourrait vous faire gagner beaucoup de temps.

Avec quelques lignes de YAML (un langage de balisage simple), nous allons automatiser le processus généralement fastidieux de configuration de WordPress sur un nouveau serveur Ubuntu 14.04. Nous installerons WordPress plus ou moins selon le processus décrit dans his tutorial, mais automatiquement.

Nous allons utiliser deux serveurs: un serveur de compilation exécutant Ansible et un serveur cible sur lequel nous installerons WordPress avec Ansible.

Conditions préalables

Pour compléter ce didacticiel, vous devez disposer des éléments suivants:

  • Un serveur de compilation exécutant Ubuntu 14.04. Nous allons installer Ansible sur ce serveur (appelé dans ce tutoriel le * build-server *). Nous allons nous connecter à ce serveur et tous les fichiers et commandes de ce tutoriel seront exécutés sur ce serveur.

  • Un serveur cible exécutant Ubuntu 14.04. Nous allons installer WordPress (via Ansible) sur ce serveur (appelé dans ce tutoriel le * wordpress-server *)

  • Sudo utilisateurs non root configurés pour les deux serveurs

  • Ajoutez la clé SSH de votre utilisateur sudo * build-server * à la commande sud_keys de votre utilisateur * wordpress-server *. Vous pouvez le configurer en suivant this tutorial. Vous devriez lancer le tutoriel à partir de votre * build-server * et télécharger la clé sur votre * wordpress-server *

(Facultatif) Accès sudo sans mot de passe

Il est * plus rapide * mais * moins sécurisé * d’utiliser un accès sudo sans mot de passe sur votre * wordpress-server *.

Pour donner ce privilège à notre utilisateur sudo sur * wordpress-server *, nous devrons éditer le fichier sudoers. Tapez + visudo + pour éditer le fichier sudoers:

visudo

Ajoutez cette ligne à la fin:

ALL=(ALL) NOPASSWD: ALL

Ce doit être la * dernière ligne * du fichier. Il est important que ce soit la dernière ligne, sinon elle sera remplacée.

  • NB: * Editez toujours le fichier sudoers en utilisant la commande + visudo +. Cela vérifiera vos modifications avant de sauvegarder le fichier - cela vous évitera de vous verrouiller accidentellement en dehors de la machine.

Ceci fait, vous devriez pouvoir exécuter la commande suivante sur le * wordpress-server * sans fournir de mot de passe:

sudo echo "Hello"

Maintenant, tout au long de ce tutoriel, vous pouvez exécuter les commandes + ansible-playbook + sans l’indicateur + -K +, de sorte que vous n’avez pas à entrer le mot de passe sudo manuellement.

ansible-playbook playbook.yml -i hosts -u

Étape 1 - Installation de Ansible

Dans cette section, nous installerons Ansible sur votre * build-server *.

SSH dans votre * build-server * et exécutez cette commande pour installer Ansible:

sudo apt-get install ansible -y

Vous pouvez vous assurer que Ansible est installé en exécutant:

ansible --version

Vous devriez voir en sortie quelque chose comme:

Outputansible 1.5.4

Étape 2 - Configuration de la structure de fichier

Maintenant que nous avons installé Ansible, préparons la structure de fichier de notre Playbook.

Créez un répertoire pour notre playbook.

cd ~
mkdir wordpress-ansible && cd wordpress-ansible

+ cd + dans ce répertoire et créez deux fichiers: l’un appelé + playbook.yml + (c’est ici que nous allons écrire les commandes pour installer WordPress) et l’autre appelé + hôtes + (cela indique à Ansible sur quels serveurs s’exécuter les commandes):

touch playbook.yml
touch hosts

Il est recommandé de séparer nos livres de lecture en rôles. Vous pouvez considérer les rôles comme des modules réutilisables. Pour ce projet, nous allons créer quatre rôles:

  • serveur

  • php

  • mysql

  • wordpress

À partir du dossier racine du projet (+ ~ / wordpress-ansible), créez-y un répertoire appelé` + roles` et + cd:

mkdir roles && cd roles

Nous pouvons amorcer nos rôles avec un outil Ansible appelé + ansible-galaxy. Pour chaque rôle que nous voulons créer, nous lancerons + ansible-galaxy init +:

ansible-galaxy init server
ansible-galaxy init php
ansible-galaxy init mysql
ansible-galaxy init wordpress

Vous remarquerez que cela crée une structure de fichier complète pour chacun de nos rôles. Ceci est conforme aux meilleures pratiques d’Ansible. Pour la plupart, nous nous intéresserons au fichier + tasks / main.yml + de chaque rôle.

À ce stade, nous devrions avoir la structure de fichier suivante:

[.]
|_ playbook.yml
|_ hosts
|_ [roles]
     |_ [server]
           |_ ...
     |_ [php]
           |_ ...
     |_ [mysql]
           |_ ...
     |_ [wordpress]
           |_ ...

Étape 3 - Rédaction du livre de jeu

Dans cette section, nous allons écrire les commandes pour installer WordPress sur notre serveur distant.

Inventaire (fichier hôtes)

Un inventaire Ansible informe Ansible des serveurs sur lesquels nous souhaitons installer WordPress. Nous pouvons exécuter nos playbooks pour les serveurs ou groupes de serveurs définis dans notre fichier d’inventaire (+ hôtes +). Notre inventaire est très simple.

Éditer + hôtes +:

nano ~/wordpress-ansible/hosts

Ajoutez la ligne pour + [wordpress] +, et en dessous, l’adresse IP de votre * wordpress-server *:

les hôtes

[wordpress]

Playbook

Nous pouvons penser à un livre de jeu comme la définition de votre application WordPress. Notre playbook combinera les rôles que nous avons créés pour configurer une application utile (dans ce cas, un site WordPress).

Éditez le fichier de playbook:

nano ~/wordpress-ansible/playbook.yml

Ajoutez ce contenu, qui indique à Ansible sur quels hôtes exécuter les rôles (ceux du groupe + wordpress dans le fichier` + hosts`), et quels rôles exécuter:

playbook.yml

- hosts: wordpress

 roles:
   - server
   - php
   - mysql
   - wordpress

Déplacez-vous dans votre répertoire playbook:

cd ~/wordpress-ansible/

Assurez-vous que notre connexion de base du * build-server * au * wordpress-server * fonctionne en exécutant le playbook. Il ne fera encore rien; ça va juste tester la connexion:

ansible-playbook playbook.yml -i hosts -u  -K

Entrez le mot de passe sudo de votre utilisateur sudo sur * wordpress-server * lorsque vous y êtes invité.

Vous devriez voir en sortie quelque chose comme:

Outputansible-playbook playbook.yml -i hosts -u  -K

PLAY [wordpress] **************************************************************

GATHERING FACTS ***************************************************************
ok: [188.166.68.134]

PLAY RECAP ********************************************************************
188.166.68.134             : ok=1    changed=0    unreachable=0    failed=0

Cela indique que nous avons pu nous connecter au serveur. Cependant, nous n’avons pas encore défini de jeux, donc rien n’a été exécuté sur notre * wordpress-server *. Corrigeons cela en complétant les détails de nos quatre rôles.

Si cela échoue, vérifiez que vous pouvez SSH du * build-server * au * wordpress-server * en utilisant une clé SSH.

Étape 3 - Création de rôles

Serveur

Tout d’abord; configurons notre serveur. Pour cela, nous allons éditer le rôle + server.

Le rôle serveur installera tous les logiciels dont nous avons besoin sur le serveur cible. Editer ce fichier:

nano roles/server/tasks/main.yml`

Ajoutez le contenu suivant. assurez-vous qu’il n’ya qu’une seule ligne avec + --- + (il devrait y en avoir une par défaut):

rôles / serveur / tâches / main.yml

---
- name: Update apt cache
 apt: update_cache=yes cache_valid_time=3600
 sudo: yes

- name: Install required software
 apt: name={{ item }} state=present
 sudo: yes
 with_items:
   - apache2
   - mysql-server
   - php5-mysql
   - php5
   - libapache2-mod-php5
   - php5-mcrypt
   - python-mysqldb

Cela fait ce qui suit:

  • Mettre à jour apt-cache (+ apt-get update)

  • + apt-get install Apache, MySQL, PHP et les logiciels associés

Si vous êtes intéressé par les détails de ce que nous installons, vous pouvez consulter https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php- lamp-stack-on-ubuntu-14-04 [le tutoriel sur l’installation manuelle de LAMP sur Ubuntu 14.04].

Nous pouvons maintenant lancer notre playbook comme ceci:

ansible-playbook playbook.yml -i hosts -u  -K

Vous devriez voir une sortie ressemblant à ceci:

Outputansible-playbook playbook.yml -i hosts -u  -K

PLAY [wordpress] **************************************************************

GATHERING FACTS ***************************************************************
ok: [188.166.68.134]

TASK: [server | Update apt cache] *********************************************
ok: [188.166.68.134]

TASK: [server | Install required software] ************************************
[188.166.68.134] => (item=apache2,mysql-server,php5-mysql,php5,libapache2-mod-php5,php5-mcrypt,python-mysqldb)

PLAY RECAP ********************************************************************

Après avoir exécuté ceci, vous devriez pouvoir accéder à la page Apache par défaut à + ​​http: /// +. Impressionnant. Apache est maintenant installé et en cours d’exécution sur le * wordpress-server *.

Si votre construction se bloque indéfiniment au point de `+ TASK: [serveur | Update apt cache] + `, cela peut indiquer un manque d’autorisations sur le serveur cible. Assurez-vous que l’accès sudo est correctement configuré sur * wordpress-server *.

PHP

Réglons nos besoins en PHP. Nous le ferons dans le rôle PHP. Editez le fichier des tâches principales pour PHP:

nano roles/php/tasks/main.yml

Ajoutez ce qui suit (encore une fois, la ligne + --- + devrait déjà être là):

roles / php / tasks / main.yml

---
- name: Install php extensions
 apt: name={{ item }} state=present
 sudo: yes
 with_items:
   - php5-gd
   - libssh2-php

Cela installera les extensions PHP requises.

MySQL

Nous devons également configurer une base de données MySQL pour notre site WordPress. Nous ferons cela dans le rôle + mysql.

Nous allons avoir besoin de quelques variables pour celui-ci. Pour un rôle, vous pouvez spécifier les valeurs par défaut de toutes les variables dans le fichier + defaults / main.yml +.

nano roles/mysql/defaults/main.yml

Ajoutez le nom de votre base de données, votre nom d’utilisateur et votre mot de passe (que vous souhaitez créer), dans cet ordre. Assurez-vous de choisir un ++ sécurisé.

roles / mysql / defaults / main.yml

---
wp_mysql_db: wordpress
wp_mysql_user: wordpress
wp_mysql_password:

Ajoutez les tâches pour créer notre base de données et un utilisateur pour y accéder.

nano roles/mysql/tasks/main.yml

Ajoutez le contenu suivant:

roles / mysql / tasks / main.yml

---
- name: Create mysql database
 mysql_db: name={{ wp_mysql_db }} state=present

- name: Create mysql user
 mysql_user:
   name={{ wp_mysql_user }}
   password={{ wp_mysql_password }}
   priv=*.*:ALL

Ce rôle a les effets suivants:

  • Créer une base de données MySQL

  • Créer un utilisateur MySQL

  • Donner à cet utilisateur l’accès à notre base de données

Les variables sont automatiquement extraites de notre fichier précédent, vous n’avez donc rien à changer ici.

WordPress

Et maintenant, le moment que nous attendions tous… WordPress!

Une fois les exigences du serveur installées, nous pouvons configurer WordPress. Nous allons éditer le rôle + wordpress.

Nous ajoutons quelques tâches différentes au fichier + roles / wordpress / tasks / main.yml +, laissez-le donc ouvert pour cette section.

nano roles/wordpress/tasks/main.yml

Nous devons d’abord télécharger WordPress dans le répertoire + / tmp + (les plus soucieux de la sécurité noteront que nous avons désactivé la validation des certificats, ce qui interromprait le téléchargement):

roles / wordpress / tasks / main.yml

---
- name: Download WordPress  get_url:
   url=https://wordpress.org/latest.tar.gz
   dest=/tmp/wordpress.tar.gz
   validate_certs=no
   sudo: yes

Une fois téléchargé, nous extrayons le fichier gzip dans + / var / www +, l’emplacement qu’Apache utilise pour stocker le contenu Web:

roles / wordpress / tasks / main.yml

- name: Extract WordPress  unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no
 sudo: yes

Avec les fichiers extraits, mettons à jour la racine du document de site par défaut d’Apache pour qu’elle pointe vers notre site WordPress:

roles / wordpress / tasks / main.yml

- name: Update default Apache site
 sudo: yes
 lineinfile:
   dest=/etc/apache2/sites-enabled/000-default.conf
   regexp="(.)+DocumentRoot /var/www/html"
   line="DocumentRoot /var/www/wordpress"


 sudo: yes

Ceci mettra à jour le + DocumentRoot + pour le site par défaut d’Apache pour pointer vers les fichiers WordPress que nous avons téléchargés à + ​​/ var / www / wordpress +

Vous remarquerez ici que nous avons ajouté un bloc + notify +. Ceci est utilisé lorsque vous devez effectuer des tâches telles que le redémarrage de services après qu’une tâche s’est terminée avec succès. Les gestionnaires + notify + ne seront notified que si notre tâche est changed.

Nous devons ajouter notre gestionnaire pour + restart apache. Enregistrez ce que vous avez jusqu’à présent et ouvrez + roles / wordpress / handlers / main.yml + pour le modifier:

nano roles/wordpress/handlers/main.yml

Ajoutez ce contenu:

roles / wordpress / handlers / main.yml

---
- name: restart apache
 service: name=apache2 state=restarted
 sudo: yes

Ce gestionnaire sera appelé lorsqu’une tâche spécifiant + notify: restart apache + sera modifiée, ce qui obligera le serveur à redémarrer Apache.

  • Configuration de WordPress *

Retour à + ​​roles / wordpress / tasks / main.yml +.

Enfin, nous devons faire une configuration pour votre site WordPress:

Tout d’abord, nous copions le fichier de configuration exemple:

roles / wordpress / tasks / main.yml

- name: Copy sample config file
 command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php
 sudo: yes

Mettez à jour certaines des constantes de ce fichier pour qu’elles correspondent aux informations de notre base de données:

roles / wordpress / tasks / main.yml

- name: Update WordPress config file
 lineinfile:
   dest=/var/www/wordpress/wp-config.php
   regexp="{{ item.regexp }}"
   line="{{ item.line }}"
 with_items:
   - {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}
   - {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}
   - {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"}
 sudo: yes

Cette tâche trouvera les lignes contenant: + DB_NAME +, + DB_USER +, et + DB_PASSWORD + dans notre fichier de configuration et les remplaceront par les variables de notre playbook.

Après avoir réussi les étapes ci-dessus, notre rôle dans wordpress contiendra deux fichiers d’intérêt.

Voici le fichier de tâches complet pour WordPress:

roles / wordpress / tasks / main.yml

---
- name: Download WordPress  get_url:
   url=https://wordpress.org/latest.tar.gz
   dest=/tmp/wordpress.tar.gz
   validate_certs=no

- name: Extract WordPress  unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no
 sudo: yes

- name: Update default Apache site
 sudo: yes
 lineinfile:
   dest=/etc/apache2/sites-enabled/000-default.conf
   regexp="(.)+DocumentRoot /var/www/html"
   line="DocumentRoot /var/www/wordpress"
 notify:
   - restart apache

- name: Copy sample config file
 command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php
 sudo: yes

- name: Update WordPress config file
 lineinfile:
   dest=/var/www/wordpress/wp-config.php
   regexp="{{ item.regexp }}"
   line="{{ item.line }}"
 with_items:
   - {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}
   - {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}
   - {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"}
 sudo: yes

Voici le fichier de redémarrage d’Apache (que vous auriez déjà créé):

roles / wordpress / handlers / main.yml

---
- name: restart apache
 service: name=apache2 state=restarted
 sudo: yes

Avaient fini! Exécutez le livre de lecture une dernière fois pour installer et configurer WordPress:

ansible-playbook playbook.yml -i hosts -u  -K

Vous devriez pouvoir visualiser votre site WordPress en ligne à l’adresse suivante: + http: // your_server_ip +.

image: https: //assets.digitalocean.com/articles/wordpress_1404/initial_config.png [Formulaire d’installation WordPress]

Vous pouvez compléter la configuration manuelle du site WordPress à partir d’ici.

Conclusion

Toutes nos félicitations! Vous pouvez maintenant installer un site WordPress sur n’importe quel serveur Ubuntu 14.04 en une seule commande:

ansible-playbook playbook.yml -i hosts -u  -K

Tout ce que vous avez à faire est d’ajouter l’adresse IP de votre serveur cible à votre fichier + hosts + et de vous assurer que vos autorisations sont définies correctement.

Prochaines étapes

Ce fut une introduction très rapide pour vous aider à démarrer avec Ansible et WordPress. Vous pourriez être intéressé par les améliorations suivantes:

  • Explorez le Ansible Galaxy et découvrez comment vous pouvez héberger vos propres rôles sur le Galaxy

  • Automatisez le processus d’installation de sorte qu’aucune configuration manuelle de votre site WordPress ne soit requise