DevOps For Small Teams
Joe Ferguson
https://joind.in/16020
Who Am I?
Joe Ferguson
PHP Developer
Twitter: @JoePFerguson
Organizer of @MemphisPHP
@NomadPHP Lightning Talks
Passionate about Community
My first “dev” job
Hired to convert PSDs to HTML
My first “dev” job
Hired to convert PSDs to HTML
Ended up building / hacking at web
apps
My first “dev” job
Hired to convert PSDs to HTML
Ended up building / hacking at web apps
We had no DevOps (was it even a thing then?)
My first “dev” job
Hired to convert PSDs to HTML
Ended up building / hacking at web apps
We had no DevOps (was it even a thing then?)
We invested in metal
My first “dev” job
Hired to convert PSDs to HTML
Ended up building / hacking at web apps
We had no DevOps (was it even a thing then?)
We invested in metal
Just started using “the cloud”
My second dev job
Yay I'm not alone!
My second dev job
Yay I'm not alone!
I was still "the server person"
Yay I'm not alone!
I was still "the server person”
Scaling a team
We needed to scale up (and skill
up) our team
My second dev job
Scaling a team
Version control is NOT renaming files
Version control EVERYTHING
Teaching our team VCS
https://try.github.io
Teaching our team VCS
https://guides.github.com
Trial & Error is ok!
Scaling a team
Stop Editing In
Production!
No more edit
& uploading!
Everything
goes into
version control!
Disable FTP Access*!
# echo troy >> /etc/ftpuser
# echo andy >> /etc/ftpuser
# echo joe >> /etc/ftpuser
Better yet, disable FTP completely*
*If you can
Scaling a team
Development environments
MAMP, LAMP, WAMP, WAT?
Mac/Linux/Windows Apache MySQL PHP
These are all great tools
Do you deploy to
MAMP/WAMP?
Why develop on a
different configuration?
Catch those environment
bugs earlier
Remove the phrase
“…It works on my machine…”
From your team
Stop using WAMP/MAMP
and start using Vagrant!
Vagrant allows you to:
• Create a server
• Configure a server
• Delete a server
…over and over and over..
Not sure how to create a
Vagrant box?
PuPHPet.com
Guided path to create your own Vagrant
Supports common Distributions
Customize users, firewall rules, cron jobs
Add databases, virtual hosts
Supports Ruby, PHP, Python, NodeJS,
HHVM
Beanstalkd & RabbitMQ
Elastic Search & Apache Solr
PuPHPet.com
PuPHPet.com
Great for learning HOW to build boxes
Especially useful if you’d like to learn
Puppet
Other Provisioners
Shell
Chef - use existing Cookbooks
Docker - used if your app is in Docker
SaltStack
Vagrant Cookbook
https://leanpub.com/vagrantcookbook
Ansible for DevOps
https://leanpub.com/ansible-for-devops
Learning Budget
Learning Budget
Scaling a team
Test your code!
Testing was the hardest part for us.
The payoffs in catching regression bugs
and confidence in our deployments was
well worth it
Is your code testable?
If unit testing is hard, your code may not
have been written to be testable.
Testing Resources
http://grumpy-learning.com
Testing Resources
https://laracasts.com/collections/testing-in-php
Continuous Integration
Continuous Delivery
Continuous Integration
Frequently integrate code changes into the
existing code repository
Merging branches to master/production
Automated build tests to ensure issues found
quickly
Does not have to be deployed
Continuous Delivery
Produce valuable changes in code in short
cycles to be released at any time.
AKA: Continuous Deployment
Automated build tests to ensure issues
found quickly
Deployment happens on successful build
Which is right for you?
Your goal should be Continuous
Integration (at least!)
Strive for Continuous Delivery if it makes
sense
Applications with a live event component
may not be suited for Continuous
Delivery
There are a lot of CI
solutions out there
ServersForHackers.com
What is your process?
Create your workflow
Optimize your time
in the console
Work smarter not harder
Stop typing the same
commands
git status
git pull origin master
git branch —set-upstream-to=origin/master
vagrant global-status | grep running
redis-server /usr/local/etc/redis.conf
php -S localhost:8000
ssh svpernova@joeferguson.me -t screen -dR irc
gs
gpm
gsu
vgr
startredis
startphp
irc
Make use of aliases
alias gs=“git status”
alias gpm=“git pull origin master”
alias gsu=“git branch —set-upstream-to=origin/master”
alias vgr=“vagrant global-status | grep running”
alias startredis=“redis-server /usr/local/etc/redis.conf”
alias startphp=“php -S localhost:8000”
alias irc=“ssh svpernova@joeferguson.me -t screen -dR irc"
Use Screen for long
running processes
https://www.mattcutts.com/blog/a-quick-tutorial-on-screen/
Think of screen as a
detachable window that
contains your console
Screen Demo
Want more Power?
https://tmux.github.io
Bash isn’t the only shell!
http://ohmyz.sh
Uses zsh
180+ Plugins
700+ Contributors
140+ Themes
myZsh
Why do I use myzsh
over oh-my-zsh?
Why do I use myzsh
over oh-my-zsh?
Customize your shell
• Local IPs
• Date
Green Text
because this is
the local machine
• User
• Hostname
• Current Path
• Current time
Customize your shell
• User
• Hostname
• Current Path
• Current time
• Local IPs
• Date
Red Text
because this is
a remote machine
Customize your shell
Tab completion on steroids
+ Git branch info because we are in a repo
Tab Completion Demo
.zshrc
Automate Common Tasks
Alias long commands
Shell script sequential commands
Use cron to run your scripts at specific times
Create installers for your settings
Version Control Configs
Do NOT version control
your SSH keys!
Do NOT version control
your API keys!
Recap
Version Control everything you can
Create a process that works for your team
Practice how you play
Test everything you can
Automate everything you can
Feedback!
https://joind.in/16020
Joe Ferguson
Twitter: @JoePFerguson
Email: joe@joeferguson.me
Freenode: joepferguson
Contact Info:

Madison PHP 2015 - DevOps For Small Teams