devops – the last mile
DESCRIPTION
Devops – The Last Mile. Workspace Management. [email protected] http ://jayflowers.com. Jay Flowers. Workspace Management. The act of defining, creating, and maintaining the software tool stack that comprises a developer’s or tester’s computer configuration. Why?. Problem?. - PowerPoint PPT PresentationTRANSCRIPT
Devops – The Last Mile
Workspace Management
Jay Flowers
[email protected]://jayflowers.com
Workspace Management
The act of defining, creating, and maintaining the software tool stack that comprises a
developer’s or tester’s computer configuration.
Why?
Problem?Why do we need Workspace
Management?Do we have a problem?
As workspace configurations drift the more pervasive and sever “works on my box” syndrome is encountered.They drift from each other as well
as away from production.
The Norm• Manually• Tribal knowledge• Some documentation, generally out of date
• Lots of options, room for variation
• Unreliable results• Difficult to reproduce same results
The Goal• Fully automated• Infrastructure as code• Institutionalized knowledge• Code as documentation• No options• Tested• Reliable, repeatable results
Needs• We need a way to unobtrusively manage all the developer/tester workspaces on a project
• We need all the software and configuration that makes up the workspace to be centrally managed
• We need all the workspaces to look and function identically
• We prefer to use the same tool to manage workspaces as we use to manage servers
Chef
• Automation for installing and configuring software
• Open Source• Supports Windows, OSx, and Linux• Why Chef and not Puppet?
– Internal DSL, more powerful than Puppet’s external DSL– 100% free, Puppet is only partially free
• Can bootstrap to create setup application• System level CM• Testable with Vagrant or EC2
– Higher quality from agile testing
DEMOHTTP://JAYFLOWERS.COM/MISC%20DOWNLOADS/WORKSPACE-SETUP.EXE
• Server/Client– Secure communication, authentication,
and authorization with public/private keys
– Servers control execution of clients• Solo– Client without a server– Execution is initiated at the command
line on the client
Chef Modes
When to use Solo and when to use Server/Client
• Solo for workspace management– Updates controlled by workspace owner, on
demand– Cookbooks stored in workspace
• Server/Client for everything else– Update controlled by server, pushed to clients– Cookbooks stored on server
• We can use Chef to deploy the applications we build!
Chef Anatomy
• Server/Client or Solo• Cookbooks (written to be idempotent)
– Resources and Providers – used to perform typical actions (make user, create directory, install package, etc…)
– Attributes – parameters specific to the cookbook• Nodes
– The client list of cookbooks to apply• Roles
– Lists of cookbooks to be applied– Helpful in organizing nodes into groups (e.g. frontend apache
server)• Databags
– Parameters specific to the target nodes and or organization
Bootstrap Solo Configurationrequire 'minitest-chef-handler'
file_cache_path "c:/tools/chef/cache"cookbook_path [File.dirname(__FILE__) + "/Chef/cookbooks"]file_backup_path "c:/tools/chef/backup"role_path "c:/tools/chef/roles"
json_attribs File.dirname(__FILE__) + "/node.json"
handler = MiniTest::Chef::Handler.new(:path => File.join(Chef::Config[:cookbook_path], "*", "test", "*test*.rb"))report_handlers << handler
log_level :debuglog_location STDOUT
Node.json{ "run_list": [ "recipe[git]", "recipe[tortoisegit]", "recipe[get_git_source]", "recipe[springsource_sts]" , "recipe[java]", "recipe[sysinternals]", "recipe[virgo]", "recipe[gradle]",
"recipe[notepadplusplus]","recipe[maven]","recipe[groovy]"
]}
Java Cookbook
windows_package "java" do source node['java']['url'] checksum node['java']['checksum'] action :install installer_type :custom options "/s /v \"/qn INSTALLDIR=#{node['java']['java_home']}\"" not_if { File.directory? node['java']['java_home'] }end
Git Clone Cookbook
dir = node['get_git_source']['dir']
directory dir do inherits true recursive true action :createend
Git Clone Cookbookruby_block "clone_git_repo" do block do url = node['get_git_source']['url']
Chef::Log.info("Cloning the repo #{url} to directory #{dir}, this could take a while...")
git = Chef::ShellOut.new("git clone #{url} #{dir}")git.run_commandputs git.stdoutif git.stderr != '' puts "error messages: " + git.stderrend# Raise an exception if it didn't exit with 0git.error!
end action :create
Git Clone Cookbook not_if do
Chef::Log.info("Checking if #{dir} is a working git repo") git = Chef::ShellOut.new("git status", :cwd => dir)
git.run_commandputs git.stdoutif git.stderr != '' puts git.stderrendif git.exitstatus == 0trueelsefalseend
endend
• Written to easily manage large numbers of servers, translates to workspaces too
• Installs and configures software and operating systems creating reliable and repeatable results
• Creation of new servers and workspaces becomes so easy allowing us to treat them as disposable resources
• Can be used to repair/heal broken workspaces and servers
Chef Foots the Bill
Benefits• What works on my box works everywhere else…
• Dramatically reduced time to create new workspace
• Workspace updates are non-events• Heal broken workspace• Can be managed by unskilled team members
• Pairs well with other scripting (e.g. automated deployments)
Cucumber• Test Tool• Open Source• Tests are written in plain text• Tests are implemented in Ruby, the same language as Chef is implemented in…
• Tests use virtualization libraries to create, control, and destroy test instances/environments
Simple Example
Cucumber Example
Minitest Example
Test Driven• These tools enable a test driven approach
• Tests can be written before Chef cookbooks are written
• Tests can be executed in a local workspace as well as on a CI server
Test Resources• ChefSpec - https://github.com/acrmp/chefspec
• MiniTest - https://github.com/calavera/minitest-chef-handler
• Test Kitchen - https://github.com/opscode/test-kitchen
• Examples– https://github.com/opscode-cookbooks/ap
ache2/
– https://github.com/opscode-cookbooks/mysql/
A LOOKUNDER THE HOOD
HTTPS://GITHUB.COM/JFLOWERS/VIRGO.SAMPLE-GREENPAGES