diff --git a/TP.md b/TP.md new file mode 100644 index 0000000000000000000000000000000000000000..5984cb81c4dac9cfd4a212bfe75cfe8befe88430 --- /dev/null +++ b/TP.md @@ -0,0 +1,56 @@ +## Mode d'emploi + + * Copier votre cle publique dans ./cle_publique + * commande : vagrant up + * premier déploiement : ansible-playbook -i inventory play.yml + +Suivant le numéro de TP affecté (voir mon mail ) : + +### TP 0 : + + * Ajouter un certificat SSL autosigné pour la connexion nginx / client web + + - name: Creation private key + openssl_privatekey: + path: /etc/nginx/cert/server.key + size: 2048 + +- name: demande de signature + openssl_csr: + path: /etc/nginx/cert/server.csr + privatekey_path: /etc/nginx/cert/server.key + +- name: Creation du certificat + openssl_certificate: + path: /etc/nginx/cert/servcer.crt + privatekey_path: /etc/nginx/cert/server.key + csr_path: /etc/nginx/cert/server.csr + provider: selfsigned + + * Ajouter un moteur de base de données Mariadb/Mysql + des utilisateurs/mot de passe, définie dans une liste + + * Ajouter un role commun pour les deux groupes de machine pour installer une liste de package prédéfinie (exemple : nmon, htop, tmux, screen) + +### TP 1 : + + * Basculer le restart d'apache2 et nginx dans un handler + * Ajouter php à apache dans le role apache et insérer une page de test phpinfo() par défaut. + * Ajouter des regles iptables sur le nginx et apache pour n'accepter qu'une liste de ports définie + +## Pour tous : question bonus (à rendre dans un autre répertoire ) + +- Fusionner tous les roles dans un seul et unique role : avec le même résultat + + +## Quelques rappels + * Pour tester le fonctionnement du loadbalancer : http://192.168.33.18:9000 (et plein de F5 pour basculer d'un apache à l'autre et sauf ceux qui passeront en ssl évidemment) + + * Je ferais avec vos dépots la même chose que le mode d'emploi => Je vous conseille donc de rejouer pour être sur que ça fonctionnera. Déjà, vous perdez des points et en plus, vous agacez le correcteur ( aka moi ) + + * Ne pas utiliser les modules "command" ou "shell" , sauf extreme urgence. Normalement, vous n'en avez pas besoin. + + * Je préfère une livraison de code via un git (gitlab de préférence) qu'un zip par mail ... + + * n'hésitez pas à rajouter un petit README si vous voyez la necessité #JaimeLaDoc + + * j'espère que vous avez lu les rappels. diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000000000000000000000000000000000000..685bf06699d099016a81961e99a769662862ba11 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,37 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : +Vagrant.configure("2") do |config| + config.vm.define "web" do |web| + web.vm.box = "debian/buster64" + web.vm.hostname = 'web' + + web.vm.network :private_network, ip: "192.168.33.17" + public_key = File.read("./cle_publique") + + config.vm.provision :shell, :inline =>" + echo 'Copying ansible-vm public SSH Keys to the VM' + mkdir -p /home/vagrant/.ssh + chmod 700 /home/vagrant/.ssh + echo '#{public_key}' >> /home/vagrant/.ssh/authorized_keys + chmod -R 600 /home/vagrant/.ssh/authorized_keys + ", privileged: false + end + + config.vm.define "lb" do |lb| + lb.vm.box = "debian/buster64" + lb.vm.hostname = 'lb' + + lb.vm.network :private_network, ip: "192.168.33.18" + public_key = File.read("./cle_publique") + + config.vm.provision :shell, :inline =>" + echo 'Copying ansible-vm public SSH Keys to the VM' + mkdir -p /home/vagrant/.ssh + chmod 700 /home/vagrant/.ssh + echo '#{public_key}' >> /home/vagrant/.ssh/authorized_keys + chmod -R 600 /home/vagrant/.ssh/authorized_keys + ", privileged: false + end + +end + \ No newline at end of file diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000000000000000000000000000000000000..d69f9fa5c29e150d3d693e65a07e728c8ad5be83 --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,5 @@ +[defaults] +remote_user=vagrant + +[privilege_escalation] +become = true diff --git a/cle_publique b/cle_publique new file mode 100644 index 0000000000000000000000000000000000000000..0179a509d76a96192dac9bf7df688c283564afbb --- /dev/null +++ b/cle_publique @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCnmOJHPMiVedU3a4+LGnlVcdQtGhx93Qx3eaMb+SjfvSfeEHvnbVLh3TFTM6L2WzzXSB2G5BhtaRcMlXWCBmnxi0lO9J+NkynKmWlIx7MlTAQnJFuMVrtp7T5U2d5/ijRwB/H7k7eIJ04obt1plxCRJs71x0o12z1De9z1trh+c9YtAoHR7gbCXC/tiTa9bLDgkQpcTZM56dX6JDA+32nXcKsRRyPTKg1jaAW8T1CeTN0VQZhPhUVrdcxCgBtHNy0pYK2CkyTgHr0wFqCVfqZIzwrV+5JaeH0FmhpQdz1p8g7NVJX0clx1DyHPUonvmAn795iwZoNmcBL6x2ovtth/ thibault@Thibault diff --git a/inventory b/inventory new file mode 100644 index 0000000000000000000000000000000000000000..62fa1e56d21e80c105a6dc1dca2f8962b6965612 --- /dev/null +++ b/inventory @@ -0,0 +1,24 @@ +all: + children: + loadbalancer: + hosts: + theLB: + ansible_host: 192.168.33.18 + vars: + user: + - thibault + - michel + - bernard + pass: + - jesaispas + - jesaispas2 + - jesaispas3 + + web: + hosts: + theApache: + ansible_host: 192.168.33.17 + sites: + - { 'nom_du_site': site1 , 'port': 81 } + - { 'nom_du_site': site2 , 'port': 82 } + - { 'nom_du_site': site3 , 'port': 83 } diff --git a/play.retry b/play.retry new file mode 100644 index 0000000000000000000000000000000000000000..bb923f62afb461505edb4ba3c2f4236aa2c58a5f --- /dev/null +++ b/play.retry @@ -0,0 +1,3 @@ +machine1 +theApache +theLB diff --git a/play.yml b/play.yml new file mode 100755 index 0000000000000000000000000000000000000000..a0b2e7189f51d690945ea1a5e8fba4511c0d54dc --- /dev/null +++ b/play.yml @@ -0,0 +1,13 @@ +#!/usr/bin/env ansible-playbook + +- hosts: all + roles: + - role: commun + +- hosts: web + roles: + - role: apache2 + +- hosts: loadbalancer + roles: + - role: nginx \ No newline at end of file diff --git a/roles/apache2/defaults/main.yml b/roles/apache2/defaults/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..315db63b2226a56526991ad593cea7eac9accbcf --- /dev/null +++ b/roles/apache2/defaults/main.yml @@ -0,0 +1,5 @@ +sites: + - { 'nom_du_site': site1 , 'port': 81 } + - { 'nom_du_site': site2 , 'port': 82 } + +default_site_directory: /var/www/ diff --git a/roles/apache2/tasks/main.yml b/roles/apache2/tasks/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..d566dfcc88bc0d4238624edd3c98d49706fda431 --- /dev/null +++ b/roles/apache2/tasks/main.yml @@ -0,0 +1,38 @@ +- name : apache installation + apt: + name: apache2 + +- name: add directory for sites + file: + state: directory + path: "/var/www/{{ item.nom_du_site }}" + loop: "{{ sites }}" + +- name: add index.html in sites + lineinfile: + state: present + create: yes + path: "/var/www/{{ item.nom_du_site }}/index.html" + line: "site de {{ item.nom_du_site }}" + loop: "{{ sites }}" + +- name: deploy apache site files + template: + src: "site.j2" + dest: "/etc/apache2/sites-available/{{item.nom_du_site}}.conf" + loop: "{{ sites }}" + +- name: apache2 ativate VirtualHost + command: a2ensite {{ item.nom_du_site }} + loop: "{{ sites }}" + +- name: add listen + lineinfile: + path: /etc/apache2/ports.conf + line: "Listen {{ item.port }}" + loop: "{{ sites }}" + +- name: restart apache2 + service: + name: apache2 + state: restarted diff --git a/roles/apache2/templates/site.j2 b/roles/apache2/templates/site.j2 new file mode 100644 index 0000000000000000000000000000000000000000..35885121be79ee706a8816b527397f9fffa44213 --- /dev/null +++ b/roles/apache2/templates/site.j2 @@ -0,0 +1,7 @@ +<VirtualHost *:{{ item.port }}> + ServerAdmin webmaster@localhost + DocumentRoot {{default_site_directory}}{{ item.nom_du_site }} + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined +</VirtualHost> diff --git a/roles/commun/tasks/main.yml b/roles/commun/tasks/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..49fac7e7036b6c3afef183b6fff649f82e837358 --- /dev/null +++ b/roles/commun/tasks/main.yml @@ -0,0 +1,8 @@ +- name : Installation des paquets communs + apt: + name: "{{ item }}" + loop: + - nmon + - htop + - tmux + - screen \ No newline at end of file diff --git a/roles/nginx/tasks/main.yml b/roles/nginx/tasks/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..16f7d5a7dc0bd26ce2bca3393e81741377f6c00b --- /dev/null +++ b/roles/nginx/tasks/main.yml @@ -0,0 +1,69 @@ +- name : nginx install + apt: + name: "{{ item }}" + loop: + - nginx + - python-openssl + - python-cryptography + - python-mysqldb + +- name: Creation private key + openssl_privatekey: + path: /etc/ssl/certs/server.key + size: 2048 + +- name: demande de signature + openssl_csr: + path: /etc/ssl/certs/server.csr + privatekey_path: /etc/ssl/certs/server.key + +- name: Creation du certificat + openssl_certificate: + path: /etc/ssl/certs/server.crt + privatekey_path: /etc/ssl/certs/server.key + csr_path: /etc/ssl/certs/server.csr + provider: selfsigned + +#TODO : livrer lb.j2 dans /etc/nginx/sites-available/ +- name: installation des fichiers de conf + template: + src: lb.j2 + dest: "/etc/nginx/sites-available/loadbalancer.conf" + +#TODO: creer un lien symbolique /etc/nginx/sites-available/loadbalancer.conf vers /etc/nginx/sites-enabled/loadbalancer.conf +- name: create symlink + file: + src: /etc/nginx/sites-available/loadbalancer.conf + dest: /etc/nginx/sites-enabled/loadbalancer.conf + state: link + +- name: restart nginx + service: + name: nginx + state: restarted + +- name: Insallation de la base MariaDB + apt: + name: + - mariadb-server + +- name: Creation utilisateur 1 db + mysql_user: + name: "{{ user[0] }}" + password: "{{ pass[0] }}" + priv: '*.*:ALL' + state: present + +- name: Creation utilisateur 2 db + mysql_user: + name: "{{ user[1] }}" + password: "{{ pass[1] }}" + priv: '*.*:ALL' + state: present + +- name: Creation utilisateur 3 db + mysql_user: + name: "{{ user[2] }}" + password: "{{ pass[2] }}" + priv: '*.*:ALL' + state: present \ No newline at end of file diff --git a/roles/nginx/templates/lb.j2 b/roles/nginx/templates/lb.j2 new file mode 100644 index 0000000000000000000000000000000000000000..1ad4f7ecc7ce666d77bae84892622260351a5ac5 --- /dev/null +++ b/roles/nginx/templates/lb.j2 @@ -0,0 +1,22 @@ +upstream nginx-proxy { + {% for host in groups['web'] %} + {% for site in hostvars[host].sites %} + server {{ hostvars[host].ansible_eth1.ipv4.address }}:{{ site.port }}; + {% endfor %} + {% endfor %} +} + +# RP +server { + listen 9000 ; + server_name nameserver; + + ssl on; + + ssl_certificate /etc/ssl/certs/server.crt; + ssl_certificate_key /etc/ssl/certs/server.key; + + location / { + proxy_pass http://nginx-proxy; + } +}