Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ZendCon Europe | Building a LAMP environment wi...

Daniel Gomes
November 18, 2013

ZendCon Europe | Building a LAMP environment with Vagrant & Puppet

Do you work in more than one project or with more than one person in or per project? If yes, this workshop is for you.

One of the tasks where developers usually spend lots of time is in the configuration of the project development environment. What if you configure it by running a simple command? Without to have to hurry about product versions, without install anything in your machine?

This workshop will introduce you to Vagrant and Puppet. You will build your own dev environment step-by-step and at the end you will know how to share it and how you can reproduce and customize it for other projects.

Source code is available here: http://goo.gl/vWt3Sa

Daniel Gomes

November 18, 2013
Tweet

More Decks by Daniel Gomes

Other Decks in Programming

Transcript

  1. A LAMP environment Vagrant and Puppet from the ground up

    with Daniel Gomes @danielcsgomes November 18, 2013 workshop
  2. Who am I • Software Engineer @ GuestCentric Systems •

    Co-founder & organizer @ phplx • Father of a beautiful boy • ZCE PHP 5.3, CSM, OCP MySQL 5 Developer !2
  3. Agenda • Introduction to Vagrant and puppet • Build a

    Lamp environment • Distribute and share your environment !5
  4. Goals • Understand Vagrant and Puppet • Setup a LAMP

    dev environment • Customize it for your needs • AWS? !6
  5. va•grant (ˈveɪ grənt) Noun: ! a person without a settled

    home or regular work who wanders from place to place and lives by begging !9
  6. • Manage virtual machines (such as Virtual Box, VMware, AWS,

    and others) • Define the configuration in code with a single file • Provision the VM with Shell scripts, Puppet, Chef and other tools !10 What is Vagrant?
  7. !12 # /path/to/Vagrantfile ! Vagrant.configure("2") do |config| ! # define

    base box config.vm.box = "precise64" config.vm.box_url = "http://files.vagrantup.com/precise64.box" ! # port forwarding config.vm.network :forwarded_port, guest: 80, host: 8080 ! # setup a private network with a static IP Address config.vm.network :private_network, ip: "10.5.0.2" ! # sharing folders config.vm.synced_folder ".", "/vagrant" ! end
  8. Workflow of vagrant up Vagrantfile Provision manifest has provisioning manifest

    and it’s first time? yes start provisioning the VM VM is running vagrant up downloads the box if needed, loads the vagrant configuration (share folders, port forwarding, etc) and starts the VM !14
  9. vagrant init vagrant up vagrant halt vagrant reload vagrant provision

    vagrant package vagrant plugin vagrant ssh vagrant ssh-config vagrant suspend vagrant resume vagrant destroy vagrant commands !15
  10. !17 # /path/to/Vagrantfile ! Vagrant.configure("2") do |config| ! config.vm.define "web"

    do |web| web.vm.box = "apache" # ... end ! config.vm.define "db" do |db| db.vm.box = "mysql" # ... end ! end
  11. Plugins https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins vagrant plugin install vagrant-example-plugin vagrant plugin list vagrant

    plugin uninstall vagrant-example-plugin Installing a plugin Uninstalling a plugin Listing installed plugin !18
  12. !23 # /path/to/Vagrantfile ! Vagrant.configure("2") do |config| ! config.vm.provider :virtualbox

    do |vb| vb.customize [ "modifyvm", :id, '--chipset', 'ich9', '--natdnshostresolver1', 'on', '--memory', 1024 ] end ! end
  13. • IT automation software • Language inspired by Nagios •

    Declarative language !27 What is Puppet?
  14. Basic concepts • Resources types • Classes, modules, templates •

    Variables, Facts and Conditionals • Ordering and chaining !28
  15. Built-in Resources Types • File • Exec • Package •

    Cron • Host • Service • …. !29
  16. File example file { "mod_actions_conf": path => "/etc/apache2/mods-enabled/actions.conf", ensure =>

    "link", target => "/etc/apache2/mods-available/actions.conf" } !30
  17. Classes • Named blocks • Defining a class does not

    evaluate the code • Declaring evaluates the code (include) !31 Modules • module name == folder name • specific folder structure
  18. Ordering & chaining • No loading order • before and

    require • notify and subscribe • arrow chaining ( -> to require and ~> to notify) !33
  19. Ordering example class apt { exec { "apt-update": unless =>

    "test -f /home/vagrant/.apt-update", command => "apt-get update -y", path => ["/bin", "/usr/bin"], notify => File["/home/vagrant/.apt-update"], } ! file { "/home/vagrant/.apt-update": ensure => file, force => true } } !34
  20. What are we going to build? ! • Provider: Virtual

    box 4.3 • OS: Ubuntu 12.04 x64 ! • PHP 5.4 • Apache 2.2 • MySQL 5.5 !35
  21. Distributing and sharing • Use (D)VCS (Git, SVN, Mercurial, etc.)

    ! • Add the Vagrantfile and provisioning files (puppet, chef, shell scripts, etc) to your repository ! • Add .vagrant folder to your repository ignore file or your global ignore file. !37
  22. Tips and Tricks • When working in multiple projects use

    port forwarding and networks carefully • Avoid port collision by adding auto_correct: true for each port forwarding • Use --debug on your provision options when something is wrong • Have guest additions always up to date • Improve share folders performance by enabling nfs (is not available on windows) • If you are using Puppet modules, don't forget to add the module dependencies as well !38
  23. PuPHPet A simple GUI to set up virtual machines for

    PHP Web development. !40 https://puphpet.com/ https://github.com/puphpet/puphpet
  24. Resources • Documentation • Vagrant - http://docs.vagrantup.com/v2/ • Puppet -

    http://docs.puppetlabs.com/references/latest/type.html • Learning Puppet - http://docs.puppetlabs.com/learning/index.html • Chef - http://docs.opscode.com/chef/index.html • Ansible - http://ansible.cc/docs/ • Vewee - https://github.com/jedi4ever/veewee • Packer - http://www.packer.io/ ! • Downloads • Vagrant - http://downloads.vagrantup.com/ • Virtual Box - https://www.virtualbox.org/wiki/Downloads • VMware - http://www.vmware.com/products/player/ ! • Source code of the talk demos - http://goo.gl/vWt3Sa • List of base boxes - http://www.vagrantbox.es/ !41