Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Vagrant for PHP Developers
Search
Erika Heidi
May 22, 2014
Programming
3
1.5k
Vagrant for PHP Developers
As presented at NomadPHP, 22-05-2014
Erika Heidi
May 22, 2014
Tweet
Share
More Decks by Erika Heidi
See All by Erika Heidi
Introducing Chainguard Images for Safer PHP Runtimes
erikaheidi
0
80
Automatizando documentação em PHP com Autodocs
erikaheidi
0
35
Building the World: The Story Behind Wolfi
erikaheidi
0
320
Hello Wolfi
erikaheidi
1
600
Container Images for the Cloud Native Era
erikaheidi
1
270
Creating Secure Container Images with apko
erikaheidi
0
390
Criando GitHub Actions em PHP com Minicli
erikaheidi
0
160
Building GitHub Actions in PHP with Minicli
erikaheidi
0
440
10 Code Search Tricks for Open Source
erikaheidi
2
210
Other Decks in Programming
See All in Programming
TypeScriptの型とパフォーマンス (TSKaigi 2024)
ypresto
14
4.9k
The World is a Network (and We Are Just Nodes)
whatyouhide
0
100
Deep Dive into React Stream/Serialize
mugi_uno
4
860
Try creating your own orderedmap
kazamori
1
290
株式会社ゼネテック
genetec
0
120
AmperとFleetを使ったAndroidアプリ
yoppie
0
300
Dev ContainersとTestcontainers
bells17
3
100
TypeScriptでもLLMアプリケーション開発 / LLM Application In Typescript
rkaga
5
1.3k
Effectで作る堅牢でスケーラブルなAPIゲートウェイ / Robust and Scalable API Gateway Built on Effect
yasaichi
7
1.2k
哲学史とモデリング
tanakahisateru
2
430
“Seeing Like a Programmer”—Resiliency, Limits, and Moral Hazards in Software Engineering (LambdaConf 2024)
chriskrycho
0
430
ペパボOpenTelemetry革命
pyama86
2
1.1k
Featured
See All Featured
Embracing the Ebb and Flow
colly
80
4.2k
Large-scale JavaScript Application Architecture
addyosmani
504
110k
Facilitating Awesome Meetings
lara
43
5.6k
Git: the NoSQL Database
bkeepers
PRO
423
63k
Rebuilding a faster, lazier Slack
samanthasiow
74
8.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
228
130k
Agile that works and the tools we love
rasmusluckow
325
20k
Docker and Python
trallard
35
2.7k
Building a Modern Day E-commerce SEO Strategy
aleyda
22
6.5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
245
20k
Code Review Best Practice
trishagee
56
15k
Statistics for Hackers
jakevdp
790
220k
Transcript
None
whoami • Brazilian, living in Amsterdam since 2012 • PHP
<independent> developer • Author of Vagrant Cookbook on LeanPub @erikaheidi
What to expect from this talk 1)Vagrant overview 2)What's New:
1.5 and 1.6 3)Provisioner Tasting: Ansible, Puppet and Chef 4)ProTips 5)Useful Resources
None
Why Vagrant?
“It works on my machine” - every developer, ever.
Why Vagrant? • Reproducible and portable development environment • Enables
easier code collaboration • Backend env tests / benchmark • Automation Tools learning and testing
None
Some Terms • Boxes • Provider / Provisioner • Host
/ Guest • Vagrantfile • Synced Folder
The simplest thing that does something Vagrant.configure("2") do |config| config.vm.box
= "hashicorp/precise64" config.vm.provision "shell", inline: "echo Hello World!" end
None
Commands • up • reload • provision • suspend •
resume • destroy [ --provision ] [ --provision ]
DEMO
Another Vagrantfile Vagrant.configure("2") do |config| config.vm.box = "hashicorp/precise64" config.vm.network :private_network,
ip: "192.168.33.101" config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" end config.vm.synced_folder "./", "/vagrant", :nfs => true end
What's New
Recent new features Vagrant 1.5 • Vagrant Cloud / boxes
2.0 • Vagrant Share • Rsync • SMB Vagrant 1.6 • Global Status and Control • Windows as Guest • Docker Provider • Post-up Message
Vagrant Cloud (1.5)
Vagrant Share (1.5)
Post-up message (1.6)
Global status and control (1.6)
None
1. Ansible • Tasks, Playbooks, Roles • Tasks are defined
with YAML • 3rd most used • Modules Directory: Ansible Galaxy • Requires installation of Ansible in the Host
1.1 A Task - name: Install Nginx apt: pkg=nginx state=latest
1.1 A Task - name: Install Nginx apt: pkg=nginx state=latest
- name: Install PHP Packages apt: pkg={{ item }} state=latest with_items: - php5-fpm - php5-cli
1.2 A Playbook # playbook.yml --- - hosts: all sudo:
true tasks: - name: Update apt-cache apt: update_cache=yes - name: Install Nginx and php5-fpm apt: pkg={{ item }} state=latest with_items: - nginx - php5-fpm
1.3 A Role . ├── playbook.yml └── roles ├── init
│ └── tasks │ └── main.yml └── nginxphp ├── tasks │ └── main.yml └── templates └── vhost.tpl #playbook.yml --- - hosts: all sudo: true vars: doc_root: /vagrant/web roles: - init - nginxphp
1.4 Vagrantfile Vagrant.configure("2") do |config| config.vm.box = "hashicorp/precise64" config.vm.provision "ansible"
do |ansible| ansible.playbook = "playbook.yml" end end
None
2. Puppet (puppet-apply) • Resources, Manifests, Modules • Non-sequential execution
order • Custom language based on Ruby • 1st most used • Modules Directory: Puppet Forge
2.1 A Resource package { 'nginx': ensure => 'installed' }
2.1 A Resource package { 'nginx': ensure => 'installed' }
package { ['php5-fpm', 'php5-cli']: ensure => 'installed' }
2.2 A Manifest # manifests/default.pp exec { 'apt-get update': command
=> 'apt-get update' } package { ['nginx', 'php5-fpm']: ensure => 'installed', require => Exec['apt-get update'] }
2.3 A Module . ├── manifests │ └── default.pp └──
modules └── nginxphp ├── manifests │ └── init.pp └── templates └── vhost.erb # manifests/default.pp exec { 'apt-get update': command => 'apt-get update', before => Class['nginxphp'], } class { 'nginxphp': doc_root => '/vagrant/web', }
2.4 Vagrantfile Vagrant.configure("2") do |config| config.vm.box = "hashicorp/precise64" config.vm.provision :puppet
do |puppet| puppet.module_path = "modules" end end
None
3. Chef (chef_solo) • Resources, Recipes, Cookbooks • Resources defined
with Ruby • 2nd most used, 1st with Ruby devs • Modules Directory: Cookbooks • Complex but very powerful
3.1 A Resource apt_package "nginx" do action :install end
3.1 A Resource apt_package "nginx" do action :install end ["nginx",
"php5-fpm"].each do |p| apt_package p do action :install end end
3.2 A Recipe # cookbooks/main/recipes/default.rb execute "apt-get update" do command
"apt-get update" end ["nginx", "php5-fpm"].each do |p| apt_package p do action :install end end
3.3 A Cookbook . └── cookbooks ├── main │ └──
recipes │ └── default.rb └── nginxphp ├── recipes │ └── default.rb └── templates └── default └── vhost.erb # cookbooks/main/recipes/default.rb execute "apt-get update" do command "apt-get update" end include_recipe 'nginxphp'
3.4 Vagrantfile Vagrant.configure("2") do |config| config.vm.box = "hashicorp/precise64" config.vm.provision "chef_solo"
do |chef| chef.add_recipe "main" end end
None
None
6.1 Debugging • Unknown Vagrant error – Use VirtualBox /
Vmware GUI • Unknown Provisioner error – Increase provisioner verbosity • Not working as expected – Login, fix, automate
6.2 Sync Folder Performance • Synchronization has a cost •
Framework cache/logs – Too much writing operations on disk – We don't need this in our synced folder
None
None
None
Useful Resources
None
None
Examples on GitHub • Basic examples • Comparing Provisioners –
PHP5 + Nginx example https://github.com/erikaheidi/nomad-vagrant
Vagrant Cookbook Special discount coupon for NomadPHP http://bit.ly/vc-nomad
Questions?
erikaheidi.com/vagrant https://joind.in/11181 Vagrant Resources: Rate this talk: @erikaheidi Get in
Touch: