Automatiser la création d'un site Drupal sur sa machine de dev à l'aide d'Ansible

Il peut être intéréssant de pouvoir créer à la voler des sites Drupal sur sa machine de dev.

Cet article n'a pas pour vocation de vous faire un cours sur Ansible mais de vous montrer un example de ce que j'ai fait pour me faciliter la vie.

https://gitlab.famillewallon.com/ansible-playbook/drupal-site-install

Tout d'abord voici l'arborescence de mon playbook

.
├── addsite
├── commerce
├── create.yml
├── delete-site
├── delete.yml
└── drupal
    ├── tasks
    │   ├── create.yml
    │   ├── delete.yml
    │   └── main.yml
    ├── templates
    │   └── vhost.j2
    └── vars
        └── main.yml.dist

addsite, commerce, delete-site: 3 scripts bash qui vont créer/supprimer mes sites

create.yml et delete.yml: sont mes playbook

drupal: mon rôle drupal/vars/main.yml.dist : à renommer en main.yml, contient les variables nécessaire à l'installation (dossier du site, information de connexion à la base...)

Voyons de plus près ce que fait ma tache create (drupal/tasks/create.yml dans mon rôle drupal

- Tout d'abord, on vérifie si la variable domaine existe (On la voit dans le script bash addsite) ainsi que la présence ou non de la base de données

 - name: test if 'domain' variable exist
   fail: msg="this play requires 'domain' variable"
   when: domain is not defined
 
 - local_action: "shell mysql -u {{ db_user }} -p{{ db_pass }} -e 'SHOW DATABASES;' | grep -w {{ domain |regex_replace('-','_') }}"
   register: dbstatus
   failed_when: dbstatus.rc == 2
 
 - name: check if {{ domain |regex_replace('-','_') }} database exists
   fail: msg="database {{ domain |regex_replace('-','_') }} exist"
   when: dbstatus.rc == 0

 

- On créer le vhost à l'aide du module template

 - name: create vhost
   become: yes
   template:
     src: templates/vhost.j2
     dest: "/etc/nginx/conf.d/{{ fqdn }}.conf"
 
 - name: restart nginx services
   become: yes
   service:
     name: nginx
     state: restarted

 

Le module template vas automatiquement générer un fichier (ici un vhost nginx) à l'aide du fichier source (src: templates/vhost.j2) Il se base sur le monteur jinja2 (proche de twig).

ex: server_name {{ fqdn }};

- Téléchargement de Drupal via le module composer

 - name: download drupal with composer
   composer:
     command: create-project
     arguments: "{{ project }} {{ www_dir }}/{{ fqdn }}/ --stability dev"
     working_dir: "{{ www_dir }}"

La variable projet est défini en "extra-vars" dans le script bash (ex: drupal-composer/drupal-project, pour le projet drupal) Les autres variables sont défini dans drupal/vars/main.yml

- Téléchargement de module par défault que j'utilise dans mes projets

 - name: Download extras modules with composer
   composer:
     command: require
     arguments: "drupal/{{ item }}"
     working_dir: "{{ www_dir }}/{{ fqdn }}/"
   with_items : "{{ module }}"

 

Ici on va utiliser with_items qui va permettre de télécharger ma liste de module

 module: [
   features,
   features_ui,
   devel,
   adminimal_admin_toolbar,
   module_filter,
   admin_toolbar_tools,
 ]

- Installation d'un site drupal via drush si

 - name: Drush site install
   shell: "drush si --account-mail={{ email }} --account-name={{ drupal_username }} --account-pass={{ drupal_password }}  --db-url=mysql://{{ db_user }}:{{ db_pass }}@localhost/{{ domain |regex_replace('-','_')  }} --locale=fr --site-name={{ fqdn }} --site-mail={{ email }} -y"

 

- Et enfin on active les modules que j'utilise dans mes projets

 - name: Activate extras modules
   shell: "drush en {{ item }}  -y"
   args:
     chdir: "{{ www_dir }}/{{ fqdn }}/web"
   with_items : "{{ module }}"