Installation automatisée d'une VM LAMP et d'une app Symfony2 avec Vagrant, Ansible et Gitlab sur Mac OS X El Capitan

Installation automatisée d'une VM et déploiement d'une application Symfony2.

Publié le 17/09/2016

On part du principe que l'on dispose d'un serveur gitlab afin de pouvoir déployer notre application Symfony.

1 - Installation de VirtualBox et Vagrant le poste hôte

On va installer VirtualBox et Vagrant sur le poste hôte :

VirtualBox Vagrant

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 "DebianVagrant".

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".

On aura besoin des paquets suivants :

  • - sudo
  • - ssh

    Configurer la carte réseau en NAT avec une redirection de port :

    Mise à jour et installation de sudo :

    
    apt-get update && apt-get upgrade
    apt-get install sudo
    

    Ajout de l'utilisateur vagrant aux sudoers :

      • Nom : SSH
      • Machine Hote : 2222
      • Machine Cible : 22
    • visudo -f /etc/sudoers.d/vagrant
      
      # 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

      Ajouter l'empreinte de l'hôte gitlab dans le fichier /home/vagrant/.ssh/know_hosts de la machine cible.

      ssh-keyscan -t rsa -p 15151 gitlab.local >> ~/.ssh/known_hosts

      Pour le déploiement de l'application avec gitlab, on va d'abord enregistrer la clé publique de notre utilisateur vagrant dans les deploy_keys de gitlab, par l'interface d'admin web : sélectionner le projet > le menu avec l'icône de roue cranté en haut à gauche > Deploy keys

      Faire de même avec le serveur de sauvegardes mysql et medias. Prenez d'ajouter la clé publique de la vm au serveur de sauvegardes.

      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

      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
      
      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

      5 - Installation des VirtualBoxGuestAdditions

      Installation des virtual-guest-box-additions et finalisation du modèle

      
      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

      
      mkdir -p ~/Document/Vagrant/boxes/DebianBase/
      cd ~/Document/Vagrant/boxes
      vagrant package --base Debian85Vagrant
      vagrant box add Debian85Vagrant package.box
      

      Pour supprimer la box si besoin :

      
      vagrant box remove DebianVagrant
      rm package.box
      
      

      7 - Création d'une VM à partir de la box

      
      mkdir -p ~/Documents/Vagrant/DebianVagrant
      cd ~/Documents/Vagrant/DebianVagrant
      vagrant init Debian85Vagrant
      

      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 ~/Documents/Vagrant/DebianVagrant/ansible.cfg
      
      [ssh_connection]
      ssh_args = -o ForwardAgent=yes
      
      
      nano ~/Documents/Vagrant/DebianVagrant/playbook.yml
      
      ---
      - hosts: all
        sudo: true
        vars:
          domain: sfwebapp.local
          admin: pa@foulquier.info
          directory: sfwebapp/web
        handlers:
            - name: restart apache2
              service: name=apache2 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 curl
            apt: name=curl state=present
      
          - name: installer python-mysqldb
            apt: name=python-mysqldb state=present
      
          - name: installer htop
            apt: name=htop state=present
      
          - name: installer zip
            apt: name=zip state=present
      
          - name: installer iotop
            apt: name=iotop state=present
      
          - name: installer iptraf
            apt: name=iptraf 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-mpm-prefork
            apt: name=apache2-mpm-prefork state=present
      
          - name: installer apache2-utils
            apt: name=apache2-utils state=present
      
          - name: installer libexpat1
            apt: name=libexpat1 state=present
      
          - name: installer ssl-cert
            apt: name=ssl-cert state=present
      
          - name: set acl vagrant user on www
            command: setfacl -Rm u:vagrant:rwx /var/www/
      
          - name: set acl vagrant group on www
            command: setfacl -Rm u:vagrant:rwx /var/www/
      
          - name: create sfwebapp vhost
            template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf
      
          - name: a2ensite sfwebapp
            command: a2ensite {{ domain }}
            args:
              creates: /etc/apache2/site-enabled/{{ domain }}.conf
            notify:
              - restart apache2
      
          - name: git clone sfwebapp
            git:
              repo=ssh://git@gitlab.lan.local/root/sfwebapp.git
              dest=/var/www/sfwebapp
              version=master
              accept_hostkey=yes
              force=yes
              update=no
            sudo: no
      
          - name: activation mod-rewrite
            apache2_module: name=rewrite state=present
            notify:
              - restart apache2
      
          - name: installer PHP
            apt: name=php5 state=present
          - name: installer libapache2-mod-php5
            apt: name=libapache2-mod-php5 state=present
          - name: installer php5-common
            apt: name=php5-common state=present
          - name: installer php5-curl
            apt: name=php5-curl state=present
          - name: installer PHP php5-dev
            apt: name=php5-dev state=present
          - name: installer php5-gd
            apt: name=php5-gd state=present
          - name: installer php5-intl
            apt: name=php5-intl state=present
          - name: installer php-pear
            apt: name=php-pear state=present
          - name: installer php5-imagick
            apt: name=php5-imagick state=present
          - name: installer php5-imap
            apt: name=php5-imap state=present
          - name: installer php5-json
            apt: name=php5-json state=present
          - name: installer php5-mcrypt
            apt: name=php5-mcrypt state=present
          - name: installer php5-memcache
            apt: name=php5-memcache state=present
          - name: installer php5-mysql
            apt: name=php5-mysql state=present
          - name: installer php5-pspell
            apt: name=php5-pspell state=present
          - name: installer php5-recode
            apt: name=php5-recode state=present
          - name: installer php5-xmlrpc
            apt: name=php5-xmlrpc state=present
          - name: installer PHP php5-xsl
            apt: name=php5-xsl state=present
      
          - name: Modify date.time zone php.ini apache
            replace:
              dest=/etc/php5/apache2/php.ini
              regexp=';date.timezone ='
              replace='date.time = Europe/Paris'
              backup=yes
      
          - name: Modify date.time zone php.ini apache
            replace:
              dest=/etc/php5/cli/php.ini
              regexp=';date.timezone ='
              replace='date.time = Europe/Paris'
              backup=yes
      
          - name: installer mysql
            apt: name=mysql-server state=present
      
          - name: Add custom mysql config collation-server
            lineinfile:
              dest=/etc/mysql/my.cnf
              insertafter=EOF
              line="collation-server = utf8_general_ci"
      
          - name: Add custom mysql config character-set-server
            lineinfile:
              dest=/etc/mysql/my.cnf
              insertafter=EOF
              line="character-set-server = utf8"
      
          - name: restart mysql
            service: name=mysql state=restarted
      
          - name: create sfwebapp db
            mysql_db:
              name=sfwebapp
              state=present
      
          - name: restore last db
            mysql_db:
              state=import
              name=sfwebapp
              target=/vagrant_data/sfwebapp_mysql_16_09_11_093001.sql
      
          # Restauration medias
          - name: Restore medias
            shell: cp -r /vagrant_data/uploads /var/www/sfwebapp/web/
      
          # Symfony starters
      
          # curl composer
          - name: Install composer
            get_url: url=https://getcomposer.org/composer.phar dest=/var/www/sfwebapp/composer.phar mode=0755 validate_certs=no
      
          # update composer
          - name: Run composer install
            shell: cd /var/www/sfwebapp && php /var/www/sfwebapp/composer.phar update
      
          # config db
      
          # generate asset clean & chmod
          - name: Dump assets
            shell: cd /var/www/sfwebapp && php app/console assets:install web && php app/console assetic:dump --env=prod --no-debug && chmod -R 777 app/cache app/logs web/uploads && rm -rf app/cache/*
              
      

      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

      Sources :