Déployer des applications PHP avec Ansistrano

Installer Ansible

$ sudo apt-get install software-properties-common $ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update $ sudo apt-get install ansible

Dans /etc/ansible/ansible.cfg [defaults] host_key_checking = false

Installer Ansistrano

$ ansible-galaxy install carlosbuenosvinos.ansistrano-deploy carlosbuenosvinos.ansistrano-rollback

Mise à jour Si vous voulez mettre à jour le rôle, vous devez passer le paramètre –force lors de l’installation. Veuillez vérifier la commande suivante :

$ ansible-galaxy install –force carlosbuenosvinos.ansistrano-deploy carlosbuenosvinos.ansistrano-rollback

Dépôt Ansible

Vous pouvez organiser votre dépôt de déploiement par entreprise ou par type de projet. Je l’appelle “ansible” par exemple, avec la structure de répertoires :

apps/ base/ files/ README.md

Utilisation

Installez votre projet (“ansible” par exemple) depuis git dans le répertoire personnel de l’utilisateur “deploy”

Créez la clé publique pour l’utilisateur “deploy”

$ ssh-keygen -t rsa $ cp -v ~/.ssh/id_rsa.pub ~/ansible/files/authorized_keys.deploy.pub

J’ai créé un playbook pour initialiser l’hôte distant

  • base/user-deploy.yml : Créer l’utilisateur deploy avec les permissions
  • base/vhosts.yml : Créer

Sur chaque hôte, créez l’utilisateur “deploy”

$ ansible-playbook -i {inventory} base/user-deploy.yml –become -k –ask-become-pass –user={premier utilisateur créé à l’installation}

---
# Utilisateur de déploiement
- name: Préparer et configurer l'utilisateur "deploy"
  hosts: all
  become: yes
  tasks:
   - name: Ajouter l'utilisateur de déploiement
     user: name=deploy comment="Deploy User" groups=adm,sudo,www-data shell=/bin/bash
   - name: Ajouter la clé autorisée à l'utilisateur de déploiement
     authorized_key: user=deploy key="{{item}}"
     with_file:
     - ../files/authorized_keys.deploy.pub
   - name: S'assurer que /etc/sudoers.d est scanné par sudo
     # Une erreur utilise pkexec visudo
     action: lineinfile dest=/etc/sudoers regexp="#includedir\s+/etc/sudoers.d" line="#includedir /etc/sudoers.d" validate="visudo -cf %s"
   - name: Ajouter l'utilisateur de déploiement aux sudoers
     action: 'lineinfile dest=/etc/sudoers.d/deploy state=present create=yes regexp="deploy .*" line="deploy ALL=(ALL) NOPASSWD: ALL" validate="visudo -cf %s"'
   - name: S'assurer que le fichier /etc/sudoers.d/deploy a les bonnes permissions
     action: file path=/etc/sudoers.d/deploy mode=0440 state=file owner=root group=root

Vérifier le vhost principal

$ ansible-playbook -i {inventory} base/vhost.yml

---
# Hôte virtuel
- hosts: all
  become: yes
  tasks:
   - name: Créer et vérifier les permissions du répertoire vhost
     file: path=/home/vhosts state=directory mode="u=rwx,g=rwx,o=rx" owner=www-data group=www-data

Filtrer pour exécuter uniquement sur un hôte

$ ansible-playbook -i {inventory} -l 192.168.0.0 playbook.yml

Gérer un projet à déployer

Nous voulons faire un déploiement progressif, nous devons donc définir comment travailler. Avec une branche git standard :

  • master : production
  • develop : pré-production

Voici les commandes pour exécuter un déploiement

Déploiement

$ ansible-playbook -i hosts -e “ansistrano_release_version=date -u +%Y%m%d%H%M%SZ” deploy.yml

Retour en arrière

$ ansible-playbook -i hosts rollback.yml

Maintenant, allez lire la documentation d’Ansistrano pour voir toutes les étapes du workflow.

-- /home/vhosts/my-app.com
|-- current -> /home/vhosts/my-app.com/releases/20100512131539
|-- releases
|   |-- 20100512131539
|   |-- 20100509150741
|   |-- 20100509145325
|-- shared

Vous devez effectuer certaines opérations localement et à distance.

Localement :

  • Cloner votre projet
  • Installer les dépendances
  • … et toutes autres choses

À distance :

  • Les fichiers sont automatiquement envoyés (via rsync) à votre emplacement distant
  • Nettoyer les fichiers temporaires et chauffer le cache

Exemple avec mon application web

/home/deploy/ansible/apps/my-app.com
|-- hosts-prod
|-- deploy.yml
|-- etc/
|-- config/
|-- tasks
|   |-- before-code-update.yml
|   |-- after-code-update.yml
|   |-- before-symlink.yml
|   |-- after-symlink.yml
|   |-- before-cleanup.yml
|   |-- after-cleanup.yml
  • hosts-prod : contient la définition de votre serveur de production
  • deploy.yml : modèle d’ansistrano
  • etc/ : fichiers de configuration spécifiques au serveur à placer sur votre serveur distant
  • config/ : fichiers d’environnement pour votre projet (les informations secrètes y sont stockées)
  • tasks/ : tâches spécifiques

Tous ces fichiers peuvent être spécifiques pour la pré-production.