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

  1. .
  2. ├── addsite
  3. ├── commerce
  4. ├── create.yml
  5. ├── delete-site
  6. ├── delete.yml
  7. └── drupal
  8.     ├── tasks
  9.     │   ├── create.yml
  10.     │   ├── delete.yml
  11.     │   └── main.yml
  12.     ├── templates
  13.     │   └── vhost.j2
  14.     └── vars
  15.         └── 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

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

 

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

  1.  - name: create vhost
  2.    become: yes
  3.    template:
  4.      src: templates/vhost.j2
  5.      dest: "/etc/nginx/conf.d/{{ fqdn }}.conf"
  6.  
  7.  - name: restart nginx services
  8.    become: yes
  9.    service:
  10.      name: nginx
  11.      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

  1.  - name: download drupal with composer
  2.    composer:
  3.      command: create-project
  4.      arguments: "{{ project }} {{ www_dir }}/{{ fqdn }}/ --stability dev"
  5.      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

  1.  - name: Download extras modules with composer
  2.    composer:
  3.      command: require
  4.      arguments: "drupal/{{ item }}"
  5.      working_dir: "{{ www_dir }}/{{ fqdn }}/"
  6.    with_items : "{{ module }}"

 

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

  1.  module: [
  2.    features,
  3.    features_ui,
  4.    devel,
  5.    adminimal_admin_toolbar,
  6.    module_filter,
  7.    admin_toolbar_tools,
  8.  ]

- Installation d'un site drupal via drush si

  1.  - name: Drush site install
  2.    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

  1.  - name: Activate extras modules
  2.    shell: "drush en {{ item }}  -y"
  3.    args:
  4.      chdir: "{{ www_dir }}/{{ fqdn }}/web"
  5.    with_items : "{{ module }}"

 

Drupal ansible

Ajouter un commentaire

Image CAPTCHA
Saisir les caractères affichés dans l'image.