Difference between revisions of "HashiCorp/Vagrant"
Line 178: | Line 178: | ||
git clone https://github.com/jweissig/episode-45 | git clone https://github.com/jweissig/episode-45 | ||
This creates ''Ansible'' mgmt server, | This creates ''Ansible'' mgmt server, Load Balancer and Web nodes [1..2]. HAProxy will be configured via Ansible code. | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
Line 259: | Line 258: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
The above is a | Gitbash path - <code>/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe</code> | ||
Set bootstrap script for Proxy or No-proxy specific system | |||
Vagrant status | |||
Vagrant up | |||
Vagrant ssh mgmt | |||
ansible all --list-hosts | |||
ssh-keyscan web1 web2 lb > ~/.ssh/known_hosts | |||
ansible-playbook ssh-addkey.yml --ask-pass | |||
ansible-playbook site.yml | |||
Once set it up you can navigate on your laptop to: | |||
<nowiki>http://localhost:8080/</nowiki> #Website test | |||
<nowiki>http://localhost:8080/haproxy?stats</nowiki> #HAProxy stats | |||
Use to verify end server | |||
curl -I http://localhost:8080 | |||
[[File:X-Backend-Server.png|none|left|Curl -i X-Backend-Server]] | |||
Generate web traffic | |||
vagrant ssh lb | |||
sudo apt-get install apache2-utils | |||
ansible localhost -m apt -a "pkg=apache2-utils state=present" --become | |||
ab -n 1000 -c 1 http://10.0.2.15:80/ | |||
The above is a curtsy of sysadmincasts.com can be git cloned: | |||
git clone https://github.com/jweissig/episode-45 | git clone https://github.com/jweissig/episode-45 | ||
Revision as of 17:41, 23 September 2016
Install
Check your distro most likely Ubuntu version candidate
apt-cache vagrant
Download from https://releases.hashicorp.com/vagrant/
wget https://releases.hashicorp.com/vagrant/1.8.1/vagrant_1.8.1_x86_64.deb sudo dpkg -i vagrant_1.8.1_x86_64.deb sudo apt-get update && sudo apt-get install -f #to resolve missing dependencies if any
Install ruby is recommended as .vagrant file is using it
sudo apt-get install ruby sudo gem install bundler sudo gem update bundler #if update needed
Getting started
- Create Vagrant project, by creating Vagrantfile in your current directory
vagrant init
- Add boxes (standard VMs from providers in Virtualbox, VMware or Hyper-V format)
vagrant box add hashicorp/precise64 #username: hashicorp boximage: precise64, this is preconfigured repository
#Box can be specified via URLs or local file paths, Virtualbox can only nest 32bit machines
vagrant box add --force ubuntu/14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
vagrant box add --force ubuntu/14.04-i386 https://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-i386-vagrant-disk1.box
- Configure Vagrantfile to use the box as your base system
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/14.04-i386"
end
- Power up your Vagrant box
vagrant up
Error:
Timed out while waiting for the machine to boot. This means that Vagrant was unable to communicate with the guest machine within the configured ("config.vm.boot_timeout" value) time period. ...
The error above is due to Virtualbox cannot run nested 64bit virtualbox VM. Spinning up a 64bit VM stops with an error that no 64bit CPU could be found.
piotr@vm-ubuntu64:~/git/vagrant$ vagrant up Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'ubuntu/14.04-i386'... ==> default: Matching MAC address for NAT networking... ==> default: Setting the name of the VM: vagrant_default_1456318357740_51238 ==> default: Clearing any previously set forwarded ports... ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat ==> default: Forwarding ports... default: 22 (guest) => 2222 (host) (adapter 1) ==> default: Booting VM... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2222 default: SSH username: vagrant default: SSH auth method: private key default: Warning: Remote connection disconnect. Retrying... default: Warning: Remote connection disconnect. Retrying... default: default: Vagrant insecure key detected. Vagrant will automatically replace default: this with a newly generated keypair for better security. default: default: Inserting generated public key within guest... default: Removing insecure key from the guest if it's present... default: Key inserted! Disconnecting and reconnecting using new SSH key... ==> default: Machine booted and ready! default: Guest Additions Version: 4.1.44 default: VirtualBox Version: 4.3 ==> default: Mounting shared folders... default: /vagrant => /home/piotr/git/vagrant
- Ssh to the box
piotr@vm-ubuntu64:~/git/vagrant$ vagrant ssh vagrant@vagrant-ubuntu-precise-32:~$ w 13:08:35 up 15 min, 1 user, load average: 0.06, 0.31, 0.54 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT vagrant pts/0 10.0.2.2 13:02 1.00s 4.63s 0.09s w
- Shared directory between Vagrant VM and an hypervisor provider
Vagrant VM shares a directory mounted at /vagrant with the directory on the host containing your Vagrantfile
- Delete Vagrant VM
vagrant destroy
- Delete downloaded Vagrant VM image file
vagrant box remove
Build using a provisioning script (shell provisioner)
Vagrant can run from shared location script or from inline: Vagrant file shell provisioning commands.
Create provisioning script
vi ~/git/vagrant/bootstrap.sh #!/usr/bin/env bash export http_proxy=http://username:password@proxyserver.local:8080 export https_proxy=$http_proxy apt-get update apt-get install -y apache2 if ! [ -L /var/www ]; then rm -rf /var/www ln -fs /vagrant /var/www #configures that shared directory will be Apache DocumentRoot directory fi
Configure Vagrant to run this shell script above when setting up our machine
vi ~/git/vagrant/Vagrantfile Vagrant.configure("2") do |config| config.vm.box = "ubuntu/14.04-i386" #the provision line tells Vagrant to use the shell provisioner to setup the machine config.vm.provision :shell, path: "bootstrap.sh" end
Bring the environment up
vagrant up #runs provisioning only once vagrant reload --provision #reloads VM skipping import and runs provisioning vagrant ssh #ssh to VM wget -qO- 127.0.0.1 #test Apache is running on VM
- Provisioners - shell, ansible, ansible_local and more
This section is about using Ansible with Vagrant,
*ansible
, where Ansible is executed on the Vagrant host *ansible_local
, where Ansible is executed on the Vagrant guest
Specify Ansible as a provisioner in Vagrant file
# # Run Ansible from the Vagrant Host # config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" end
- Networking - port forwarding
Vagrant can forward any host(hypervisor) TCP port to guest vm specyfing in ~/git/vargant/Vagrant file
config.vm.network :forwarded_port, guest: 80, host: 4567
Reload Vagrant VM
vagrant reload
Run on the host from a web browser http://127.0.0.1:4567 to test it.
- Vagrant power states
vagrant suspend
- saves the current running state of the machine and stop itvagrant halt
- gracefully shuts down the guest operating system and power down the guest machinevagrant destroy
- removes all traces of the guest machine from your system. It'll stop the guest machine, power it down, and remove all of the guest hard disks
- Vagrant providers
Vagrant can work with a wide variety of backend providers, such as VMware, AWS, and more without changing Vagrantfile. It's enough to specify the provider and Vagrant will do the rest:
vagrant up --provider=vmware_fusion vagrant up --provider=aws
Vagrant box images
vagrant box list #list all downloaded boxes
Default path of boxes image
C:\Users\%username%\.vagrant.d\boxes #Windows ~/.vagrant.d/boxes #LInux
Change default path via environment variable
export VAGRANT_HOME=my/new/path/goes/here/
Enable Vagrant to use proxy server for VMs
Install proxyconf:
vagrant plugin install vagrant-proxyconf
Configure your Vagrantfile, here particularly host 10.0.0.1:3128 runs CNTLM proxy
Vagrant.configure("2") do |config| config.proxy.http = "http://10.0.0.1:3128" config.proxy.https = "http://10.0.0.1:3128" config.proxy.no_proxy = "localhost,127.0.0.1"
List all Virtualbox SSH redirections
vboxmanage list vms | cut -d ' ' -f 2 > /tmp/vms.out && for vm in $(cat /tmp/vms.out); do vboxmanage showvminfo "$vm" | grep ssh; done vboxmanage list vms | cut -d ' ' -f 1 | sed 's/"//g' > /tmp/vms.out && for vm in $(cat /tmp/vms.out); do echo $vm; vboxmanage showvminfo "$vm" | grep ssh; done vboxmanage list vms | cut -d ' ' -f 1 | sed 's/"//g' > /tmp/vms.out && for vm in $(cat /tmp/vms.out); do vboxmanage showvminfo "$vm" | grep ssh | tr --delete '\n'; echo " $vm"; done
sed 's/"//g' #removes double quotes from whole string tr --delete '\n' #deletes EOL, so the next command output is appended to the previous line
Example Vagrantfile by building a simple cluster
git clone https://github.com/jweissig/episode-45
This creates Ansible mgmt server, Load Balancer and Web nodes [1..2]. HAProxy will be configured via Ansible code.
# Defines our Vagrant environment # # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| # create mgmt node config.vm.define :mgmt do |mgmt_config| mgmt_config.vm.box = "ubuntu/trusty64" mgmt_config.vm.hostname = "mgmt" mgmt_config.vm.network :private_network, ip: "10.0.15.10" mgmt_config.vm.provider "virtualbox" do |vb| vb.memory = "256" end mgmt_config.vm.provision :shell, path: "bootstrap-mgmt.sh" end # create load balancer config.vm.define :lb do |lb_config| lb_config.vm.box = "ubuntu/trusty64" lb_config.vm.hostname = "lb" lb_config.vm.network :private_network, ip: "10.0.15.11" lb_config.vm.network "forwarded_port", guest: 80, host: 8080 lb_config.vm.provider "virtualbox" do |vb| vb.memory = "256" end end # create some web servers # https://docs.vagrantup.com/v2/vagrantfile/tips.html (1..2).each do |i| config.vm.define "web#{i}" do |node| node.vm.box = "ubuntu/trusty64" node.vm.hostname = "web#{i}" node.vm.network :private_network, ip: "10.0.15.2#{i}" node.vm.network "forwarded_port", guest: 80, host: "808#{i}" node.vm.provider "virtualbox" do |vb| vb.memory = "256" end end end end
Boot strap script bootstrap-mgmt.sh
#!/usr/bin/env bash # install ansible (http://docs.ansible.com/intro_installation.html) apt-get -y install software-properties-common apt-add-repository -y ppa:ansible/ansible apt-get update apt-get -y install ansible # copy examples into /home/vagrant (from inside the mgmt node) cp -a /vagrant/examples/* /home/vagrant chown -R vagrant:vagrant /home/vagrant # configure hosts file for our internal network defined by Vagrantfile cat >> /etc/hosts <<EOL # vagrant environment nodes 10.0.15.10 mgmt 10.0.15.11 lb 10.0.15.21 web1 10.0.15.22 web2 10.0.15.23 web3 10.0.15.24 web4 10.0.15.25 web5 10.0.15.26 web6 10.0.15.27 web7 10.0.15.28 web8 10.0.15.29 web9 EOL
Gitbash path - /c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe
Set bootstrap script for Proxy or No-proxy specific system
Vagrant status Vagrant up Vagrant ssh mgmt ansible all --list-hosts ssh-keyscan web1 web2 lb > ~/.ssh/known_hosts ansible-playbook ssh-addkey.yml --ask-pass ansible-playbook site.yml
Once set it up you can navigate on your laptop to:
http://localhost:8080/ #Website test http://localhost:8080/haproxy?stats #HAProxy stats
Use to verify end server
curl -I http://localhost:8080
Generate web traffic
vagrant ssh lb sudo apt-get install apache2-utils ansible localhost -m apt -a "pkg=apache2-utils state=present" --become ab -n 1000 -c 1 http://10.0.2.15:80/
The above is a curtsy of sysadmincasts.com can be git cloned:
git clone https://github.com/jweissig/episode-45
Resources
- Vagrant Start up documentation
- Vagrant Hashicorp VMs repository Virtualbox
- Vagrant Ubuntu VMs images Virtualbox
- Vagrant and Ansible provisioner Vagrant docs