1 - Installation de VirtualBox et Vagrant le poste hôte
On va installer VirtualBox et Vagrant sur notre poste hôte en macOS 10.15.
2 - Création d'un dossier pour la configuration de la VM
On va créer un dossier qui va contenir le fichier Vagrantfile qui va permettre la manipulation de la VM (création, exécution, etc...).
On va créer se dossier dans notre répertoire utilisateur :
cd ~/Document/
mkdir Vagrant Vagrant/data Vagrant/DebianVagrant Vagrant/boxes
3 - Installation de la VM
Dans VirtualBox on va créer une machine virtuelle qui va servir de modèle pour la création notre box.
Dans notre cas on nommera la VM "Debian9".
La couche réseau de la VM sera configurée en bridge.
A l'installation du système créer un utilisateur "vagrant" avec le mot de passe "vagrant".
Configurer la carte réseau en NAT avec une redirection de port :
- Nom : SSH
- Machine Hote : 2222
- Machine Cible : 22
Mise à jour et installation de sudo :
sudo apt-get update && apt-get upgrade
sudo apt-get install sudo
Ajout de l'utilisateur vagrant aux sudoers :
sudo nano /etc/sudoers
# add vagrant user
vagrant ALL=(ALL) NOPASSWD:ALL
Génération des clés sur la machine cible pour l'utilisateur vagrant :
su vagrant
ssh-keygen -t rsa
Installation de la clé publique Vagrant :
chmod 0700 /home/vagrant/.ssh
wget --no-check-certificate \
https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub \
-O /home/vagrant/.ssh/authorized_keys
chmod 0600 /home/vagrant/.ssh/authorized_keys
chown -R vagrant /home/vagrant/.ssh
Attention : Ne pas utiliser cette clé en production !
Copie de la clé publique de la machine hôte sur sur la machine cible :
scp ~/.ssh/id_rsa.pub vagrant@IP_CIBLE:/home/vagrant/
Ajout de la clé publique dans le fichier authorized_keys (sur la machine cible) :
cat /home/vagrant/id_rsa.pub >> /home/vagrant/.ssh/authorized_keys
Activation de l'authentification par échange de clés :
sudo nano /etc/ssh/sshd_config
AuthorizedKeysFile %h/.ssh/authorized_keys
Redémarrer ssh :
sudo service sshd restart
Sur votre poste de travail macOS, pour ajouter la clé ssh à l’agent, effectuer les manipulations suivantes :
nano ~/.ssh/config
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
Ajout clé privé à l’agent :
ssh-add -K ~/.ssh/id_rsa
4 - Installation d'Ansible
Sur le poste cible :
sudo apt-get install ansible -y
Sur le poste hôte :
brew install ansible
Note : nécessite l'installation du gestionnaire de packet Brew pour Mac OS X sur le poste hôte.
Créez un fichier hosts sur la machine hôte qui contiendra les serveurs à gérer :
sudo nano /usr/local/etc/ansible/hosts
vagrant@IP_CIBLE
Installation de sshpass :
cd ~/Downloads
curl -O -L http://downloads.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz
tar xvzf sshpass-1.05.tar.gz
cd sshpass-1.05
./configure
make
sudo make install
Avant de tester la connexion, vérifier que le partage de session est actif dans les préférences système de Mac OS X.
Test de la connexion depuis la machine hôte :
ansible all -m ping --ask-pass
Ne pas mettre de mot de pass ssh, appuyer sur entrée
5 - Installation des VirtualBoxGuestAdditions
Les VirtualBoxGuestAdditions sont un ensemble de drivers pour la machine virtuelle.
Installation des virtual-guest-box-additions et finalisation du template de VM.
sudo apt-get install -y gcc module-assistant build-essential linux-headers-$(uname -r)
sudo m-a prepare
Cliquer sur "Install Guest Additions…" depuis le menu "Devices" de VirtualBox, puis effectuer les commandes suivantes :
mount /media/cdrom
sudo sh /media/cdrom/VBoxLinuxAdditions.run
Défragmentation :
sudo dd if=/dev/zero of=/EMPTY bs=1M
sudo rm -f /EMPTY
On peut maintenant éteindre la VM.
6 - Création de la box vagrant
Une box va être une image de VM prête à être instanciée par l'agent Vagrant. C'est un template de VM qui va servir à la création de VM à partir du fichier de configuration VagrantFile.
mkdir -p ~/Vagrant/boxes/DebianBase/
cd ~/Document/Vagrant/boxes
vagrant package --base Debian9
vagrant box add Debian9 package.box
Pour supprimer la box si besoin :
vagrant box remove Debian9
rm package.box
7 - Création d'une VM à partir de la box vagrant
mkdir -p ~/Vagrant/LAPP-PHP74-deb9
cd ~/Vagrant/LAPP-PHP74-deb9
vagrant init Debian9
8 - Paramètrage du fichier VagrantFile
Modification du fichier Vagrantfile pour configurer les paramètres systèmes de la vm : Mémoire, Interface réseau et configuration ansible.
Décommenter les lignes suivantes et modifier certaines variables :
config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
vb.memory = "2048"
end
config.vm.network "public_network"
config.vm.synced_folder "../data", "/vagrant_data"
Configuration de Vagrant pour Ansible :
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
end
Attention aux doubles quotes dans le fichier Vagrantfile, certains copier-coller peuvent polluer le fichier et faire apparaitre une erreur à l'exécution.
9 - Création du fichier de configuration playbook Ansible
nano ~/Vagrant/LAPP-PHP74-deb9/ansible.cfg
[ssh_connection]
ssh_args = -o ForwardAgent=yes
nano ~/Vagrant/LAPP-PHP74-deb9/playbook.yml
---
- hosts: all
sudo: true
vars:
domain: candidate-back.local
admin: contact@candidate.local
directory: candidate-back/web
handlers:
- name: restart apache2
service: name=apache2 state=restarted
- name: restart postgresql
service: name=postgresql state=restarted
- name: restart rsync
service: name=rsync state=restarted
tasks:
- name: Mise à jour de l'apt cache
apt: update_cache=yes
- name: installer aptitude
apt: name=aptitude state=present
- name: Mise à jour système
apt: upgrade=full
- name: installer acl
apt: name=acl state=present
- name: installer curl
apt: name=curl state=present
- name: installer htop
apt: name=htop state=present
- name: installer zip
apt: name=zip state=present
- name: installer unzip
apt: name=unzip state=present
- name: installer git
apt: name=git state=present
- name: installer apache2
apt: name=apache2 state=present
- name: installer apache2-doc
apt: name=apache2-doc state=present
- name: installer apache2-utils
apt: name=apache2-utils state=present
- name: installer libexpat1
apt: name=libexpat1 state=present
- name: installer libxrender1
apt: name=libxrender1 state=present
- name: installer libfontconfig
apt: name=libfontconfig state=present
- name: installer ssl-cert
apt: name=ssl-cert state=present
- name: a2disconf apache2-doc
command: a2disconf apache2-doc
notify:
- restart apache2
- name: create vhost
template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf
- name: a2ensite
command: a2ensite {{ domain }}.conf
args:
creates: /etc/apache2/site-enabled/{{ domain }}.conf
notify:
- restart apache2
- name: activation mod-rewrite
apache2_module: name=rewrite state=present
notify:
- restart apache2
- name: activation mod-headers
apache2_module: name=headers state=present
notify:
- restart apache2
- name: activation mod-headers
apache2_module: name=headers state=present
notify:
- restart apache2
- name: installer ca-certificates
apt: name=ca-certificates state=present
- name: installer lsb-release
apt: name=lsb-release state=present
- name: installer apt-transport-https
apt: name=apt-transport-https state=present
- name: Add an Apt signing key, uses whichever key is at the URL
apt_key:
url: https://packages.sury.org/php/apt.gpg
state: present
validate_certs: no
- apt_repository:
repo: deb https://packages.sury.org/php/ stretch main
state: present
- name: Mise à jour de l'apt cache
apt: update_cache=yes
# PHP 7.4
- name: installer php7.4
apt: name=php7.4 state=present
- name: installer php7.4-common
apt: name=php7.4-common state=present
- name: php7.4-cli
apt: name=php7.4-cli state=present
- name: php7.4-dom
apt: name=php7.4-dom state=present
- name: php7.4-xmlrpc
apt: name=php7.4-xmlrpc state=present
- name: php7.4-mbstring
apt: name=php7.4-mbstring state=present
- name: php7.4-intl
apt: name=php7.4-intl state=present
- name: php7.4-pgsql
apt: name=php7.4-pgsql state=present
- name: installer php7.4-curl
apt: name=php7.4-curl state=present
- name: installer php7.4-zip
apt: name=php7.4-zip state=present
- name: Modify date.time zone php.ini apache
replace:
dest=/etc/php/7.4/apache2/php.ini
regexp=';date.timezone ='
replace='date.time = Europe/Paris'
backup=yes
- name: Modify date.time zone php.ini cli
replace:
dest=/etc/php/7.4/cli/php.ini
regexp=';date.timezone ='
replace='date.time = Europe/Paris'
backup=yes
- name: Modify memory limit php.ini apache
replace:
dest=/etc/php/7.4/apache2/php.ini
regexp='memory_limit = 128M'
replace='memory_limit = 256M'
backup=yes
- name: Modify max execution time php.ini apache
replace:
dest=/etc/php/7.4/apache2/php.ini
regexp='max_execution_time = 30'
replace='max_execution_time = 360'
backup=yes
- name: Modify max upload file php.ini apache
replace:
dest=/etc/php/7.4/apache2/php.ini
regexp='upload_max_filesize = 2M'
replace='upload_max_filesize = 20M'
backup=yes
- name: Modify max execution time php.ini cli
replace:
dest=/etc/php/7.4/cli/php.ini
regexp='max_execution_time = 30'
replace='max_execution_time = 360'
backup=yes
- name: Modify max upload file php.ini cli
replace:
dest=/etc/php/7.4/cli/php.ini
regexp='upload_max_filesize = 2M'
replace='upload_max_filesize = 20M'
backup=yes
# PostgreSQL 9.x
- name: installer postgresql
apt: name=postgresql state=present
- name: installer postgresql-contrib-9*
apt: name=postgresql-contrib-9* state=present
- name: installer postgresql utils
apt:
name: "{{item}}"
state: present
with_items:
- postgresql-plperl
- postgresql-plpython
- postgresql-pltcl
- python-psycopg2
- name: Start PostgreSQL and enable at boot
service:
name=postgresql
enabled=yes
state=started
10 - Création de la VM
On va lancer la construction de la VM : vagrant up
Pour se connecter à la VM : vagrant ssh
On peut arrêter la VM avec la commande "vagrant halt" et on peut la supprimer avec la commande "vagrant destroy".
Si on veut modifier le playbook vagrant, on peut rejouer l'installation avec la commande : vagrant provision