Installation d'une VM LAPP VirtualBox avec Vagrant et Ansible sur macOS 10.15

Mise en place d'une VM VirtualBox Linux Apache PHP PostgreSQL avec Vagrant et Ansible.

Publié le 30/09/2020

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