Local Dev on Virtual Machines - Vagrant, VirtualBox and Ansible

  • 5,796 views
Uploaded 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 …

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!

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
5,796
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
68
Comments
0
Likes
9

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Local Development Environments Vagrant, VirtualBox, and Ansible Jeff Geerling
  • 2. Prepackaged environments • Traditional prepackaged development stacks: • Apache, MySQL, PHP (WAMP/MAMP) • Java/Tomcat • Ruby/Rails
  • 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. WAMP/MAMP/non-VM “But it works on my machine!” (we’re going to solve this problem)
  • 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. 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. 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. Simple, Repeatable VMs + + (or) - shell scripts - puppet - chef - salt
  • 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. 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. Getting Started • Install VirtualBox • Install Vagrant • Install Ansible: $ sudo pip install ansible (like I said, difficult on Windows, even with Cygwin)
  • 12. Build a CentOS VM $ vagrant box add centos64 <url> $ vagrant init centos64 $ vagrant up • Done!
  • 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. Provision the VM • To run the provisioner: vagrant provision • Done!
  • 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. 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. Provisioning on Windows • See: Running Ansible within Windows • See: JJG-Ansible-Windows
  • 18. Resources • Ansible documentation • Vagrant documentation • Ansible for Devops (book in progress)