démarrer avec vagrant et virtualbox
Si vous êtes comme moi utilisateur de virtualbox afin d’avoir toujours sous la main votre linux préféré, il est parfois nécessaire de construire une nouvelle instance afin de faire des tests mais que cette opération est toujours un peu fastidieuse. Avec vagrant et quelques fichiers de configuration bien construits, c’est assez simple et ouvre des possibilités.
Tout d’abord vagrant : un outil assez simple, apporté par Hashicorp et qui permet de gérer des instances de machine virtuelle. Que l’on soit développeur à la recherche d’un environnement simple à construire et reproductible ou un ops à la recherche d’un moyen de se faire la main et de tester des nouvelles solutions sans infrastructure particulière, vagrant permet de simplifier les opérations de construction et destruction de VM.
Préparation
Pour ce petit démarrage, je suis parti sur une configuration classique de virtualbox sur mon poste windows ; en toute rigueur, ceci doit également être fonctionnel sur un linux ou un mac.
Tout d’abord, il vous faudra installer vagrant, rien de bien complexe, je vous laisse faire. A l’issue, vous disposerez d’une commande, tout se fera désormais avec un éditeur de texte et des commandes en ligne. La version utilisée dans ce billet est la 2.0.1 de vagrant :
1$ vagrant -v
2Vagrant 2.0.1
Maintenant, créer un répertoire dans lequel seront déposés les fichiers de paramétrage et executer la commande vagrant init
, ceci va simplement créer un fichier de paramétrage par défaut que nous allons remplacer après coup, c’est juste histoire de valider que tout est bien opérationnel.
Box
Vagrant propose de démarrer des VM sur la base de modèle, ici on parle de box qui sont téléchargées à la demande sur le site de {% link Vagrant Cloud https://app.vagrantup.com/boxes/search %}. Il est également possible de créer des box soit même, mais pour démarrer nous allons utiliser le modèle propopsé par CentOS avec sa version 7.
Le téléchargement de modèle est particulièrement long puisque les fichiers disques sont récupérés, lancez dès maintenant une commande de récupération de la box centos, il peut y en avoir pour une heure…
1vagrant box add centos/7 --provider virtualbox
Vagrantfile
Le fichier de configuration principal permet de définir la VM qui sera construite et les actions de paramétrage la rendant opérationnelle.
Je vous propose :
- créer une marchine nomée : node01
- basée sur centos 7
- en spécifiant un dimensionnement : 4 vCPU et 4G de RAM (à adapter à votre besoin)
- avec une interface réseau de type “bridge”, qui sera donc visible sur votre réseau local
- paramétrée avec ansible en mode local
Nom, box et dimensionnement
1Vagrant.configure("2") do |config|
2 config.vm.box = "centos/7"
3
4 config.vm.define 'node01' do |machine|
5 config.vm.provider "virtualbox" do |v|
6 v.memory = 4096
7 v.cpus = 4
8 end
9 end
10end
Interace réseau
Par défaut vagrant va créer une interface de type NAT qui est parfaite afin d’avoir accès aux ressources externes via l’interface et l’adresse IP de votre PC, mais ne rend pas simple l’exposition de service sauf à votre poste. Cette interface NAT sera équipée d’une redirection de port afin que le service SSH soit disponible et rende la VM accessible via la commande vagrant ssh
. On peut tout à fait ajouter d’autres règles afin de disposer des services uniquement pour son poste, parfait donc en autonomie de développement par exemple.
S’il vous est nécessaire de pouvoir accéder à cette VM depuis d’autres postes ou tout simplement d’exposer des services sur le réseau local, il faudra alors ajouter une interface supplémentaire. Pour ce faire, on ajoute dans la définition de la machine node01 la ligne suivante :
1 config.vm.network "public_network"
Attention, si votre VM est ainsi exposée sur votre réseau, il faudra supprimer l’accès via l’utilisateur vagrant, ceci est assez avec ansible, mais nécessitera également la création d’un utilisateur. Je vous le mets en bonus en fin d’article.
Répertoire partagé
Il est nécessaire à la VM en cours de construction d’utiliser quelques fichiers avec le ansible en mode local, pour cela on demande de synchroniser un répertoire sur votre poste avec un répertoire sur la VM en construction. Ici, on copiera l’ensemble des fichiers du répertoire local vers /vagrant
sur la VM.
1 config.vm.synced_folder ".", "/vagrant"
Ansible
C’est la partie la moins bien documentée et la plus importante car elle va vous permettre d’adapter à votre besoin la VM nouvellement construite sur la base d’une box simple.
Pour cela nous avons besoin :
- d’un playbook ansible, semblable à ceux que vous avez peut-être déjà fait dans le cadre d’un usage standard d’ansible, même si ici il sera exécuté en local sur la VM
- d’un fichier d’inventaire
- du respect des nomages
Inventaire
Le fichier inventory
va contenir :
1node01 ansible_connection=local
2
3[all]
4node01
Le node01
est bien le nom de notre serveur dans la ligne config.vm.define
, ligne 4 du fichier Vagrantfile
actuel.
Playbook
Je vous propose ici une version très simple et minimaliste, mais qui devrait vous permettre de valider le bon fonctionnement. On y fait simplement la mise à jour des packages du centos, permettant de combler le retard de la box et on change le nom du serveur.
1- name: lab
2 hosts: all
3 become: true
4 become_user: root
5
6 tasks:
7 - name: upgrade all packages
8 yum:
9 name: '*'
10 state: latest
11
12 - name: set hostname
13 hostname:
14 name: node01
Vous noterez que la ligne hosts
reprend le tag du fichier inventory
(ligne 2).
Vagrantfile
Ne reste plus qu’à indiquer dans le Vagrantfile
que le playbook ansible doit être exécuté, section à positionner dans notre définition de vm :
1config.vm.provision "ansible_local" do |ansible|
2 ansible.install = true
3 ansible.playbook = "playbook.yml"
4 ansible.inventory_path = "inventory"
5end
Construction
Vous devez avoir dans votre répertoire les fichiers suivants :
- inventory : la liste des hosts pour ansible
- playbook.yml : la configuration ansible de votre VM appliquée après construction
- Vagrantfile : la définition de la VM et comment l’installer
On y va alors (avec un peu de chance la box centos est désormais disponible, sinon, il faudra attendre…) :
1vagrant up
Dans le log de progression, on trouve :
- l’utilisation de la box centos/7
- la création d’une règle de NAT exposant le port ssh (22) sur un port de votre PC
- l’installation d’ansible
- l’exécution des 3 étapes de notre playbook
Une fois finalisé, vous pouvez avoir accès à votre VM via la commande :
1vagrant ssh
Elle doit se nomer node01
et l’utilisateur est vagrant
, il dispose des droits nécessaires à l’utilisation de sudo
sans restriction. Son interface eth0 est celle dédiée au NAT, la eth1 est connectée directement sur votre réseau local, vous pourrez accéder aux services exposés via cette adresse.
Destruction
vagrant est utile également pour supprimer la VM de votre environnement, simplement en utilisant la commande :
1vagrant destroy
Ajouter le flag -f
pour ne pas que la validation ne soit demandée.
Bonus : utilisateur
L’idée ici est d’ajouter un utilisateur de connexion (ici alex
) avec sa clé ssh et de suspendre l’usage de l’utilisateur vagrant afin d’éviter les connexions sur ce compte, je vous ajoute également de quoi imposer l’utilisation d’une clé ssh pour se connecter, c’est une bonne pratique.
Ajoutez dans votre playbook :
1- name: add user alex
2 user:
3 name: alex
4 comment: "Alex Chauvin"
5
6- name: add ssh key
7 authorized_key:
8 user: alex
9 key: "{{ lookup('file', 'cle_ssh.pub') }}"
10 key_options: 'no-port-forwarding'
Le fichier cle_ssh.pub
positionné dans le répertoire sera copié dans les authorized_keys
du compte crée, il reprend le format standard de ssh.
On ajoute l’utilisateur aux sudoers, le fichier alex_sudoers
est copié dans le répertoire /vagrant
et dont le contenu est à adapter à votre usage :
1%alex ALL=(ALL) NOPASSWD: ALL
Puis dans le playbook :
1 - name: alex sudo
2 copy:
3 src: alex_sudoers
4 dest: /etc/sudoers.d/alex
5 owner: root
6 group: root
7 mode: 0644
Le tunning du ssh :
1 - name: ssh key only
2 lineinfile:
3 dest=/etc/ssh/sshd_config
4 regexp="^#PasswordAuthentication yes"
5 line="PasswordAuthentication no"
6
7 - name: ssh root pwd
8 lineinfile:
9 dest=/etc/ssh/sshd_config
10 regexp="^PermitRootLogin .*"
11 line="PermitRootLogin no"
Et la suspension de l’utilisateur vagrant
1 - name: suppress vagrant user
2 user:
3 name: vagrant
4 shell: /sbin/nologin
Le second article de la série est disponible au mois de janvier, intitulé vagrant multi noeuds pour swarm.
Photo from Garett Mizunaka