153 lines
5.8 KiB
Markdown
153 lines
5.8 KiB
Markdown
<center><h1>PROJET</h1></center>
|
||
|
||
|
||
#### 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 2.*
|
||
- https://getcomposer.org/download/
|
||
|
||
#### 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`)
|