# vagrant <!-- .element width="30%" --> **By HashiCorp** ## vagrant * création / configuration d'environnements virtuels * écrit en ruby * [<i class="fa fa-github" aria-hidden="true"></i> hashicorp/vagrant](https://github.com/hashicorp/vagrant) * [<i class="fa fa-gavel" aria-hidden="true"></i> The MIT License](https://github.com/hashicorp/vagrant/blob/master/LICENSE) * outil en ligne de commande * se voit dans l'hyperviseur utilisé ## vagrant * il peut être considéré comme un wrapper d'hyperviseur * VirtualBox * libvirt * VMware * Amazon EC2 * supporte nativement docker depuis la 1.6 ## Installation pré-requis ``` $ sudo apt install virtualbox ``` via gem ``` $ sudo apt install rubygems-integration $ sudo gem install vagrant ``` via apt ``` $ sudo apt install vagrant ``` afficher la version de vagrant ``` $ vagrant --version ``` ## Initialisation du projet ``` $ mkdir project && cd project $ vagrant init ``` génère un Vagrantfile ```ruby Vagrant.configure("2") do |config| config.vm.box = "base" end ``` beaucoup de commentaires ... laisser vous guider ## Box * machines virtuelles préconfigurées (templates) * [vagrant cloud](https://app.vagrantup.com/boxes/search) * [vagrantbox.es](https://www.vagrantbox.es/) * mis en cache * nommage à la github "développeur/Box" ``` $ vagrant box add "ubuntu/xenial64" $ vagrant box add "http://aka.ms/vagrant-win7-ie11" $ vagrant box list $ vagrant box remove "ubuntu/xenial64" ``` * [Creating a Base Box](https://www.vagrantup.com/docs/boxes/base.html) * [<i class="fa fa-github" aria-hidden="true"></i> veewee](https://github.com/jedi4ever/veewee) * [<i class="fa fa-github" aria-hidden="true"></i> How to Create a CentOS Vagrant Base Box](https://github.com/ckan/ckan/wiki/How-to-Create-a-CentOS-Vagrant-Base-Box) ## cycle de vie ``` $ vagrant init "ubuntu/bionic64" $ vagrant up #--provider=virtualbox $ vagrant provision $ vagrant ssh $ vagrant halt $ vagrant suspend $ vagrant reload $ vagrant destroy #--force ``` ## réseau mapping de port ```ruby Vagrant.configure("2") do |config| config.vm.network "forwarded_port", guest: 80, host: 8004 end ``` * [private network](https://www.vagrantup.com/docs/networking/private_network.html) * [public network](https://www.vagrantup.com/docs/networking/public_network.html) * on devrait pouvoir accéder à nos ressources locales * tester un configuration avec ldap/ rodc? * [<i class="fa fa-gitlab"></i> cri/ansible-playbook-vault](https://gitlab.isima.fr/cri/ansible-playbook-vault) ## vm ```ruby Vagrant.configure("2") do |config| config.vm.box = "ubuntu/bionic64" config.vm.provider "virtualbox" do |vb| vb.gui = false vb.memory = "4096" end end ``` ## points de montage montage automatique de `.` dans `/vagrant` ``` $ vagrant ssh $ ll /vagrant total 60 drwxr-xr-x 1 vagrant vagrant 4096 Dec 14 19:46 ./ drwxr-xr-x 24 root root 4096 Dec 14 19:47 ../ drwxr-xr-x 1 vagrant vagrant 4096 Dec 14 19:46 .vagrant/ -rw-r--r-- 1 vagrant vagrant 155 Dec 14 19:49 Vagrantfile -rw------- 1 vagrant vagrant 44198 Dec 14 19:47 ubuntu-bionic-18.04-cloudimg-console.log ``` autre possibilité à partir de `Vagrantfile` ```ruby Vagrant.configure("2") do |config| ... config.vm.provision "file", source: "~/.gitconfig", destination: "~/.gitconfig" ... end ``` ## provisioning via l'entrée standard ```ruby config.vm.provision "shell", inline: <<-SHELL sudo apt install -y python openssh-server SHELL ``` via un script ```ruby Vagrant.configure("2") do |config| config.vm.box = "hashicorp/precise32" config.vm.provision "shell", path: "script.sh" end ``` ```ruby if ENV['VAGRANT_OS'] os = ENV['VAGRANT_OS'] else os = "ubuntu" end ``` ```ruby Vagrant.configure("2") do |config| if os == "centos" config.vm.box = "centos/7" else config.vm.box = "ubuntu/bionic64" end ``` ```ruby if os == "debian" config.vm.provision "shell", inline: <<-SHELL sudo yum install httpd SHELL else config.vm.provision "shell", inline: <<-SHELL sudo apt install -y apache2 SHELL end end ``` ## provisioning via [ansible](ansible.html) ```ruby Vagrant.configure("2") do |config| config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" ansible.host_key_checking = false ansible.playbook = "vault.yml" ansible.extra_vars = { is_vagrant: true } ansible.tags = ['initialize'] ansible.skip_tags = ["vagrant_context"] ansible.inventory_path = "./my-inventory" ansible.raw_arguments = ["--private-key=~/.ssh/id/id_rsa"] ansible.verbose = "vvv" end end ``` [Shared Ansible Options](https://www.vagrantup.com/docs/provisioning/ansible_common.html) ## conclusion **laissez un `Vagrantfile` dans vos roles [ansible](ansible.html) est toujours une bonne idée!** * [<i class="fa fa-gitlab"></i> cri/ansible-playbook-vault](https://gitlab.isima.fr/cri/ansible-playbook-vault) * [<i class="fa fa-gitlab"></i> cri/ansible-playbook-vault/Vagrantfile](https://gitlab.isima.fr/cri/ansible-playbook-vault/blob/master/Vagrantfile)