Skip to content

Instantly share code, notes, and snippets.

@jpic
Last active December 9, 2017 02:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jpic/19e1448a9c139c1dd2b56ca6504c61fc to your computer and use it in GitHub Desktop.
Save jpic/19e1448a9c139c1dd2b56ca6504c61fc to your computer and use it in GitHub Desktop.
Peut etre a opensourcer ?

Ce répo contient les playbooks d'infra de MRS, normalement on a rien de compliqué: ssh, firewall, backups et dockerd + containers, et quelques ptits potes qu'on a invité à la fête.

Ce répo de playbooks est prévu pour être utilisé avec votre répo privé qui contient les variables de vos environnements.

Un environnement est configuré dans des fichiers comme:

  • `group_vars/all/docker-vars.yml`: variables publiques pour docker, etc
  • `group_vars/all/docker-secrets.yml`: variables secrêtes pour docker, etc

On utilise ansible-vault create|edit group_vars/all/yoursite-secrets.yml pour éditer les variables secretes après avoir exporté ANSIBLE_VAULT_PASSWORD_FILE vers un fichier qui contient le mot de passe ansible vault en clair.

Vous pourrez ainsi utiliser répo de playbooks avec des commandes comme:

export ANSIBLE_STDOUT_CALLBACK=debug
export ANSIBLE_VAULT_PASSWORD_FILE=.vault.decrypted
ansible-playbook -i yourserver, -v playbooks/docker.yml
ansible-playbook -i yourserver, -v playbooks/netdata.yml

Ci-après, un aperçu des différents playbooks:

0. Bootstrap

On commence par bootstrap.yml si on a qu'un login en root (comme c'est le cas pour notre serveur, ubuntu 17.10 OVH), cela créera votre utilisateur avec sudo sans mot de passe (normalement).

1. Utilisateurs et sshd

Créez des comptes pour vos amis dans la variable active_users de votre inventaire, ils s'installeront grace au playbook ssh.yml. Attention, ce playbook desactive le root login et l'authentification par mot de passe !

2. Firewall

Les règles sont maintenues amême le playbook firewall.yml, qui autorise les ports 22, 80 et 443 par défaut, ansi que 53 (dns) et 4949 (munin) en interne.

3. Installation duplicity

Le playbook duplicity.yml installe la clef GPG définie dans l'inventaire et duplicity, la commande pour faire des backups. Voir comment le playbook nginx fait ses backups avec un systemd unit et un timer et appelle duplicity pour utiliser le FTP de backup.

4. Installation docker

Le playbook docker.yml installe docker et les modules python necessaires pour les modules ansible docker*. Il ajoute également les active_users dans le groupe docker. Cela configurera également le containeur dns-gen qui fera office de serveur DNS dans /etc/resolv.conf.

5. Installation de docker-dns-gen

Le playbook dns.yml installe un containeur docker-dns-gen avec toutes les features qui s'ensuivent. Cela permet d'utiliser nginx-letsencrypt pour automatiser la génération de certificats avec un CA accepté dans les containers par défaut mais aussi d'activer des features de gestion de DNS dynamiques en mode XXIst century soit avec des variables d'environnement sur des containeurs et zero config.

6. Installation nginx

Le playbook nginx.yml installe deux containers persistents, un pour nginx et un pour nginx-letsencrypt-companion. A noter qu'on peut passer du serveur ACME de staging a production en changeant l'url de letsencrypt_uri, cf. commentaires dans group_vars/all.yml.

7. Installation mailserver

Le playbook mail.yml installe le container tvial/docker-mailserver et configure le compte postmaster.

Se referer au playbook de passbolt pour la création d'utilisateur et l'usage du container, à noter l'usage de etc_hosts pour faire matcher le hostname utilisé par le client avec le CN du certificat letsencrypt du serveur de mail soit le full fqdn, utile lorsqu'on expose pas le mailserver sur internet.

8. Installation monitoring

Le playbook munin.yml installe un serveur munin, il est necessaire d'executer ce playbook avant d'executer tout playbook qui installe un container postgresql car il viendra avec des taches de configuration de monitoring munin.

9. Installation monitoring applicatif

Le playbook sentry.yml installe un serveur sentry, qui sert à la remontée de logs et d'erreurs des applications.

10. MRS

Le playbook mrs.yml déploie le site mais requierts 2 variables: nom de l'instance (staging, production) et nom de l'image docker, example:

ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook -i inventory -e prefix=mrs -e image=betagouv/mrs:jpic -e instance=jpic playbooks/django.yml 

A. Developpement

Role backup: automatisation de backup

Le role backup permet d'ajouter un script de backup avec une telle tache:

- name: Install backup scripts
  vars:
    unit_name: backup-passbolt
    unit_description: Passbolt backup
    script_path: /data/{{ passbolt_dns }}/backup.sh
    script_content: |
      #!/bin/bash -eux
      export passbolt_dump=/data/{{ passbolt_dns }}/backup/passbolt.sql
      mkdir -p ${passbolt_dump%/*}
      docker exec -t passbolt-mysql mysqldump -upassbolt -p{{ passbolt_mysql_password }} passbolt &> $passbolt_dump
      export FTP_PASSWORD="{{ backup_ftp_password }}"
      /usr/bin/duplicity \
        --encrypt-key={{ gpg_id }} \
        /data/{{ passbolt_dns }}/backup \
        {{ backup_host }}/mrs/passbolt
      rm -rf $passbolt_dump
  include_role:
    name: backup

Role mail: création de comptes emails

Le role mail permet d'ajouter un compte postfix avec une telle tache:

- name: Install postmaster email account
  vars:
    email: '{{ mail_postmaster_email }}'
    password: '{{ mail_postmaster_password }}'
  include_role:
    name: mail

Role munin_postgresql: monitoring munin pour instance postgresql

Ce role permet d'ajouter le monitoring d'une instance de postgresql. Il faut pour cela exposer le socket unix de postgresql sur l'hote, example:

docker_container:
  name: your-postgres
  volumes:
  - '/data/your-postgres/postgresql/run:/var/run/postgresql'
  env:
    POSTGRES_PASSWORD: '{{ your_password }}'
    POSTGRES_USER: you

- name: Install munin monitoring for postgresql
  vars:
    postgresql_instance: your-postgres
    postgresql_user: you
    postgresql_password: '{{ your_password }}'
    postgresql_host: /data/your-postgres/postgresql/run
  include_role:
    name: munin_postgresql

Après plusieurs minutes, vous devriez voir votre instance postgresql dans munin.

Role nginx_htpasswd: sécuriser un domaine avec admin_passwords

Ce role utilise le dictionnaire admin_passwords pour sécuriser un DNS avec un htaccess au niveau de docker-gen. La variable admin_passwords devrait être chiffrée avec ansible-vault, mais ça n'est pas obligatoire. Example:

- name: Install netdata htaccess
  vars:
    dns: '{{ netdata_dns }}'
  include_role:
    name: nginx_htpasswd

B. Autres Services

Playbook passbolt.yml: partage de mot de passes Open Source

Le playbook passbolt.yml installe Passbolt, un service de gestion de mot de passe en équipe.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment