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:
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).
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 !
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.
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.
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.
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.
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.
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.
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.
Le playbook sentry.yml installe un serveur sentry, qui sert à la remontée de logs et d'erreurs des applications.
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
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
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
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.
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
Le playbook passbolt.yml installe Passbolt, un service de gestion de mot de passe en équipe.