Cet article est remplacé par une version corrigée

Après l’essai de plusieurs solutions sans succès, j’ai enfin trouvé une procédure Letsencrypt qui fonctionne correctement et permet la mise en production de serveurs Nginx à grande échelle. Le playbook suivant, a été exécuté avec succès sur plusieurs serveurs VPS Cloud OVH (à 3€ H.T/mois) pour le déploiement d’un site internet par serveur.

Lien vers le code original

Le code suivant est disponible ici playbook-nginx-letsencrypt.zip

Ce playbook vous permettra de:

  • Déployer Nginx sur Ubuntu/Debian
  • Configurer un site en SSL avec une redirection du port 80 vers le SSL
  • Générer le certificat SSL
  • Mettre en place un Cron pour le renouvellement automatique

Les variables utilisés

Laissez le domaine principal en premier pour les appels domains[0] dans le playbook

vars:
    domains:
      - example.net
      - www.example.net
    letsencrypt_email: monemail@example.net

Le playbook

  • Le déploiement se fait dans /home/www
  • Le site: /home/www/example.net
  • Logs: /home/www/logs
  • Certificats Letsencrypt: /home/www/letsencrypt
  • Sur les VPS OVH, l’utilisateur par défaut est ubuntu avec les droits sudo
  • Une clé SSH public est déployé sur tous les serveurs

- hosts: webservers
  remote_user: ubuntu
  become: yes

  vars:
    domains:
      - example.net
      - www.example.net
    letsencrypt_email: monemail@example.net

  tasks:

  - name: Install nginx
    apt: name=nginx state=latest

  - name: create nginx directories
    file: state=directory mode=0755 dest={{item}} force=yes owner=www-data
    with_items: 
    - /home/www/{{domains[0]}}

  - name: create log directory
    file: 
      state: directory 
      mode: 0755 
      dest: /home/www/logs 
      force: yes 
      owner: root

  - name: install letsencrypt
    apt: name=letsencrypt state=latest

  - name: create letsencrypt directory
    file: name=/home/www/letsencrypt state=directory

  - name: Remove default nginx config
    file: name=/etc/nginx/sites-enabled/default state=absent

  - name: Install system nginx config
    template:
      src=templates/nginx.conf.j2
      dest=/etc/nginx/nginx.conf force=yes backup=yes

  - name: Install nginx site for letsencrypt requests
    template:
      src: templates/nginx-http.j2
      dest: /etc/nginx/sites-enabled/http
    notify: restart nginx

  - name: Create letsencrypt certificate
    shell: |
      letsencrypt certonly -n --webroot -w /home/www/letsencrypt \
      -m {{letsencrypt_email}} --agree-tos -d {{domains|join(' -d ')}}
    args:
      creates: /etc/letsencrypt/live/{{domains[0]}}

  - name: Generate dhparams
    shell: openssl dhparam -out /etc/nginx/dhparams.pem 2048
    args:
      creates: /etc/nginx/dhparams.pem

  - name: Install nginx site for specified site
    template:
      src: templates/nginx-le.j2
      dest: /etc/nginx/sites-enabled/le

  - name: Reload nginx to activate specified site
    service: name=nginx state=restarted

  - name: Add letsencrypt cronjob for cert renewal
    cron:
      name: letsencrypt_renewal
      special_time: weekly
      job: |
        letsencrypt --renew certonly -n --webroot -w /home/www/letsencrypt \
        -m {{ letsencrypt_email }} --agree-tos -d {{ domains|join(' -d ') }} \
        && service nginx reload

  handlers:
    - name: restart nginx
      become: yes
      service: name=nginx state=restarted

Alternative avec docker-compose

Pour un environnement docker-compose, j’utilise plutôt Proxy Companion qui permet de gérer plusieurs sites à l’aide de variables d’environnement.

Stéphane RAULT


Commentaires

comments powered by Disqus