PROJET

#### Objectif: Automatisation de déploiement L'objectif est d'automatiser des déploiements à l'aide de playbook Ansible et de son écosystème Ce projet devra comprendre un : - Déploiement serveur (nginx, mariadb, php, composer, nodejs) - Déploiement applicatif (Symfony blog) - https://forge.univ-lyon1.fr/iut-lyon-lp-devops-ansible/symfony-blog #### Groupe ou individuel: Ce projet peut se faire en binôme ou individuellement #### Consignes: - Le projet doit être mis sur un repository dans le [gitlab](https://forge.univ-lyon1.fr) de l'université. - Le professeur doit être ajouté en tant que `owner` aux membres du repository - Un readme doit être présent dans le projet avec les rubriques suivantes : - Liste des étudiants. - Comportant: nom - prénom - numéro étudiant - Les clés ssh de connexion : - aux serveurs openstack (VM) - aux repositories gitlab - La liste des `roles` (si utilisés). - La liste des commandes à utiliser. Ceux-ci pourront aussi être présents dans un makefile - Une présentation de l'architecture mise en place #### Architecture/Environnement L'architecture doit permettre le déploiement sur des environnements de : - preprod - prod #### Serveur Il doit être possible de déployer les parties suivantes (séparément ou "all-in-one") : - serveur web (nginx) - Configuration: Activer le Gzip (https://www.digitalocean.com/community/tools/nginx) - Vhost pour Symfony: [https://symfony.com/doc/current/setup/web_server_configuration.html#nginx] - base de données (mariadb) - (?TODO Check timeout sur installation de la clé) Installer la version : [10.5](https://downloads.mariadb.org/mariadb/repositories/#distro=Ubuntu&distro_release=focal--ubuntu_focal&mirror=cnrs&version=10.5) - config: create database / create user and password - applicatif (php / composer / git / npm ) - php - version 7.4 - Extensions: JSON, zip, mysql, intl, fpm, xml - config: - max_execution_time: 60 - memory_limit: 256M - composer: - version 1.* - la commande suivante suffit normalement: `apt install install` #### Applicatif **!! ATTENTION !!! PAS DE ROLE PROVENANT DE LA COMMUNAUTÉ GALAXY POUR LA PARTIE APPLICATIF** La stratégie de déploiement doit permettre du `atomic deployments` > **Atomic deployments** are a style of code deployment that symlink the most recent version of the code > so it’s available to the web server to serve. > **Atomic deployment** – Make updates available only when they are complete and totally in place. - Ressource pour en savoir plus sur l'atomic deployment - https://deploybot.com/blog/deploy-complex-apps-with-atomic-sftp-deployments (lire les 3 premières parties) - https://www.ewaldvanderveken.dev/zero-downtime-deployment-of-your-symfony-project-using-capistrano-and-gitlab-ci/ (lire la première partie) - Module ansible utilisable: - https://docs.ansible.com/ansible/2.9/modules/deploy_helper_module.html ``` -- /var/www/html/my-app.com |-- current -> /var/www/html/my-app.com/releases/20200512131539 |-- releases | |-- 20200512131539 | |-- 20200509150741 | |-- 20200509145325 |-- shared ``` - Le chemin de base pour l'installation de l'applicatif sera différent en fonction du serveur - preprod: /var/www/html/preprod/symfony_blog/... - prod: /var/www/html/prod/symfony_blog/... - L'applicatif doit comporter une connexion à la base de données Chaque environnement doit avoir sa propre base de données avec un user et un mot de passe différent. Exemple: - preprod: - user: symfony_preprod - pwd: symfony_preprod - prod: - user: symfony_prod - pwd: symfony_prod - Install les dépendances PHP: - composer install - L'applicatif doit permet d'afficher un titre de blog différent par environnement. Exemple: Symfony blog - preprod - Variable d'environnement du projet symfony dans le ficher `.env` du projet Symfony blog: - DATABASE_URL= - APP_ENV= - server preprod => dev - server prod => prod - APP_SECRET = doit être unique par environnement - PROJECT_TITLE= - server preprod => Symfony blog - preprod - server prod => Symfony blog - prod Commande pour compiler les variables d'environment: - server preprod : `composer dump-env dev` - server prod : `composer dump-env prod` - Mise à jours de la base de données: - `bin/console doctrine:migration:migrate -n` - Install et Compiler le JS et SCSS: - npm install - npm run build - Pour la preprod: - Ajouter les données de test (fixtures) - `bin/console hautelook:fixtures:load` #### Conseils - Un code organiser/structurer, tu feras - Sur une/des nouvelle(s) machine(s) (hôte/VM), le professeur lancera - sans erreur, les playbooks seront #### Bonus - Des tests applicatifs pourront être lancés via un playbook (phpunit) - Si des `roles` ont été créés ceux-ci pourront être testés avec [Molecule](https://molecule.readthedocs.io/en/latest/) #### Tips ###### Playbook Afin de bypass le proxy sur l'execution d'un playbook, vous pouvez ajouter au debut de vos playbooks les élements suivants (pour un exemple complet: [playbook-example.yaml](playbook-example.yaml)): ``` vars: proxy: "http://proxy.univ-lyon1.fr:3128/" environment: http_proxy: "{{proxy}}" https_proxy: "{{proxy}}" APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE: DontWarn ``` ###### Mariadb Pour executer les commandes en rapport avec mariadb (database et user), vous pouvez soit: - changer de user pour devenir root (`become_user`) - ajouter via un template la config dans le fichier `.my.cnf` au user root (`/root/.my.cnf`)