Local Dev on Virtual Machines - Vagrant, VirtualBox and Ansible


Published on

Developing web applications and websites locally can be troublesome if you use pre-built server packages like WAMP or MAMP, or an install tool to get Java or Ruby on your computer. Develop using modern best practices by using Vagrant, VirtualBox and Ansible to manage your development environments!

Published in: Technology

Local Dev on Virtual Machines - Vagrant, VirtualBox and Ansible

  1. 1. Local Development Environments Vagrant, VirtualBox, and Ansible Jeff Geerling
  2. 2. Prepackaged environments • Traditional prepackaged development stacks: • Apache, MySQL, PHP (WAMP/MAMP) • Java/Tomcat • Ruby/Rails
  3. 3. Prepackaged environments • Difficulties: • Real-world environments are more complex • Single stack for multiple/different projects • Prod server differences cause bugs • Hard to configure • “Snowflakes”
  4. 4. WAMP/MAMP/non-VM “But it works on my machine!” (we’re going to solve this problem)
  5. 5. VM-based development • VM (Virtual Machine): • Match prod closely • Configure to heart’s content • Destroy and rebuild if broken • BUT, annoying to hand-configure (not an out-of-the-box solution) + + +
  6. 6. Vagrant • Created to solve difficulties of VM-based development • Bring up, destroy, rebuild VMs with ease • Simple Ruby configuration file (Vagrantfile) • Can define single-server or multi-server production-like environments
  7. 7. Ansible • Born out of frustration with complexities and limitations of existing CM solutions like Puppet • “A powerful automation engine that makes systems and apps simple to deploy. No more scripting. No custom code. No agents required. Just get in and get it done.” • Easy idempotence <— I like!
  8. 8. Simple, Repeatable VMs + + (or) - shell scripts - puppet - chef - salt
  9. 9. Let’s see how this works • We’re going to: • Create a 64-bit CentOS 6.4 VM with Vagrant • Configure the VM with Ansible • Run the VM inside VirtualBox (all free and open source, by the way…)
  10. 10. Notes on Windows • Preference for POSIX-based systems (OS X, Linux, etc.)… since that’s where everything is deployed anyways • Windows sometimes often requires hand-holding • Example: Ansible doesn’t run (easily) on Windows, so it’s run from within VM. • Shared folders are slow. Might need to us CIFS/Samba on Windows (similar to NFS on Mac/Linux).
  11. 11. Getting Started • Install VirtualBox • Install Vagrant • Install Ansible: $ sudo pip install ansible (like I said, difficult on Windows, even with Cygwin)
  12. 12. Build a CentOS VM $ vagrant box add centos64 <url> $ vagrant init centos64 $ vagrant up • Done!
  13. 13. Provision the VM • Add to the Vagrantfile that was just created: config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" ansible.sudo = true end • Then create playbook.yml: --- hosts: all tasks: - yum: pkg=httpd state=installed
  14. 14. Provision the VM • To run the provisioner: vagrant provision • Done!
  15. 15. Slightly More Realistic --# Configure basic CentOS LAMP stack. - hosts: all tasks: - name: Install Dependencies. yum: src={{ items }} state=installed with_items: - httpd - mysql - mysql-server - php - php-common - etc… - name: Copy Apache configuration file. template: src=templates/httpd.conf dest=/etc/httpd/httpd.conf - name: Ensure Apache is running and starts at boot. service: name=httpd state=started enabled=yes
  16. 16. Provisioning on Windows • Shell script provisioning works on Windows • Use shell script to set up Ansible dependencies, then run Ansible playbook from within VM: config.vm.provision "shell" do |sh| sh.path = "windows.sh" sh.args = "playbook.yml inventory" end • Since it’s Ruby, you can use ruby if/else for which provisioner to use, with RbConfig::CONFIG['host_os']
  17. 17. Provisioning on Windows • See: Running Ansible within Windows • See: JJG-Ansible-Windows
  18. 18. Resources • Ansible documentation • Vagrant documentation • Ansible for Devops (book in progress)