SlideShare uma empresa Scribd logo
1 de 86
Baixar para ler offline
Testes de
Provisionamento
Garantindo a qualidade da sua infraestrutura
Glauco Oliveira
1
Agenda
• Infraestrutura como código
• Ferramentas de configuração de servidores
• Práticas de engenharia de software
aplicadas à infraestrutura
• Testando sua infraestrutura
2
Infraestrutura como código
Recapitulando o conceito
3
Infraestrutura como código
• Definição e gerenciamento de infraestrutura através de
código-fonte
• Objetivos:
• Consistência
• Reprodutibilidade
• Confiança
• Facilidade de manutenção e crescimento
4
Desafios
5
Desafios
• Quando má empregada, pode causar
problemas em uma escala muito maior:
• Crescimento rápido e desordenado
• Flutuações nas configurações
• Servidores "floco de neve"
6
Ferramentas de
configuração de servidores
O que eu uso?
7
Ferramentas de configuração
de servidores
• Usar scripts para criar, provisionar e
atualizar servidores não é algo novo!
8
Categorias de ferramentas
9
Ferramentas para criação de
servidores
10
Ferramentas para
configuração de servidores
11
Ferramentas para criar
modelos de servidores
12
Ferramentas para executar
comandos em servidores
13
Fluxo de trabalho
Como faço isso?
14
Phoenix Servers
• Servidores são reconstruídos a cada
mudança na sua configuração
• Evita flutuações de configuração
15
Cria um modelo

de servidor
Cria um novo
servidor
a partir do
modelo
Substitui o
servidor
antigo pelo
novo
Remove o
servidor
antigo
16
Práticas de engenharia de
software aplicadas à
infraestrutura
Como assim?
17
Qualidade através de código
• Qualidade não é uma prática separada
• Seu código de infraestrutura deve:
• Ser fácil de compreender
• Ser simples de modificar
• Fornecer feedback rápido quando problemas
acontecem
18
Qualidade através de código
• Algumas práticas que nos dão mais confiança:
• Sistema de controle de versão
• Testes automatizados
• Integração contínua
• Entrega contínua
19
Testando sua infraestrutura
Isso é possível?
20
Testes automatizados
21
Testes automatizados
• Habilitam mudanças contínuas em um
sistema
• Garantem que o trabalho pode ser feito
rapidamente
• Identificam erros assim que possível
22
Pirâmide de testes
23
Medium level
Low level
Service/
Integration
UI
Unit
24
High
level
Provisioning/
Integration
Acceptance
Unit
Escrevendo um cookbook com
testes
• O que você precisa?
• Um editor de texto
• Chef
• Ruby
• Conexão com a internet*
• Vagrant (Virtualbox)
25
Escrevendo um cookbook com
testes
• A idéia é escrevermos um cookbook que
instala o Apache em um servidor
• Vamos seguir um fluxo guiado por testes
26
Testes de unidade
automatizados
27
ChefSpec
• Um framework de teste de unidade
automatizado para cookbooks Chef
• https://sethvargo.github.io/chefspec/
28
$ mkdir -p test/unit
$ mkdir recipes
$ touch Berksfile
$ touch metadata.rb
$ touch Gemfile
29
Berksfile
1 source 'https://supermarket.chef.io'
2
3 metadata
30
metadata.rb
1 name 'example'
2 maintainer 'Glauco Oliveira'
3 maintainer_email 'gl4uc0@gmail.com'
4 description 'An example of how to test infrastructure'
5 issues_url 'https://github.com/glauco/provisioning-tests-talk/issues'
6 source_url 'https://github.com/glauco/provisioning-tests-talk'
7 version '0.0.1'
8 depends 'apt'
9 depends 'yum'
31
Gemfile
1 # encoding: utf-8
2 source 'https://rubygems.org'
3
4 gem 'berkshelf', '~> 4.3.5'
5 gem 'bundler', '~> 1.5'
6 gem 'rake', '~> 10'
7
8 group :development do
9 gem 'chefspec', '~>4.7.0'
10 end
32
$ bundle install
Fetching gem metadata from https://rubygems.org/
Fetching version metadata from https://rubygems.org/
Fetching dependency metadata from https://rubygems.org/
Resolving dependencies.......
...
Bundle complete! 4 Gemfile dependencies, 77 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
33
$ bundle exec rspec test/unit
No examples found.
Finished in 0.00029 seconds (files took 0.51493 seconds to load)
0 examples, 0 failures
34
$ touch test/unit/apache_spec.rb
35
test/unit/apache_spec.rb
1 require 'chefspec'
2 require 'chefspec/berkshelf'
3
4 describe 'example::apache' do
5 let(:chef_run) do
6 ChefSpec::SoloRunner.converge(described_recipe)
7 end
8
9 it 'installs Apache server package' do
10 expect(chef_run).to install_package('apache2')
11 end
12 end
36
$ bundle exec rspec test/unit
===========================================================================
Recipe Compile Error
===========================================================================
Chef::Exceptions::RecipeNotFound
--------------------------------
could not find recipe apache for cookbook example
...
Finished in 0.84264 seconds (files took 2.6 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/unit/apache_spec.rb:9 # example::apache installs Apache server
package
37
recipes/apache.rb
1 # encoding: utf-8
2 package 'apache2' do
3 action :install
4 end
38
$ bundle exec rspec test/unit
.
Finished in 0.82665 seconds (files took 2.57 seconds to load)
1 example, 0 failures
39
test/unit/apache_spec.rb
1 require 'chefspec'
2 require 'chefspec/berkshelf'
3
4 describe 'example::apache' do
5 let(:chef_run) do
6 ChefSpec::SoloRunner.converge(described_recipe)
7 end
8
9 it 'installs Apache server package' do
10 expect(chef_run).to install_package('apache2')
11 end
12
13 it 'starts Apache server' do
14 expect(chef_run).to start_service('apache2')
15 end
16 end
40
$ bundle exec rspec test/unit
.F
Failures:
1) example::apache starts Apache server
Failure/Error: expect(chef_run).to start_service('apache2')
expected "service[apache2]" with action :start to be in Chef run.
Other service resources:
# ./spec/unit/apache_spec.rb:14:in `block (2 levels) in <top
(required)>'
Finished in 0.84234 seconds (files took 1.46 seconds to load)
2 examples, 1 failure
Failed examples:
rspec ./spec/unit/apache_spec.rb:13 # example::apache starts Apache server
41
recipes/apache.rb
1 # encoding: utf-8
2 package 'apache2' do
3 action :install
4 end
5
6 service 'apache2' do
7 action :start
8 end
42
$ bundle exec rspec test/unit
..
Finished in 0.85119 seconds (files took 1.63 seconds to load)
2 examples, 0 failures
43
Acelerando...
44
recipes/apache.rb
1 # encoding: utf-8
2 case node['platform']
3 when 'ubuntu'
4 include_recipe('apt')
5
6 package 'apache2' do
7 action :install
8 end
9
10 service 'apache2' do
11 action :start
12 end
13 when 'centos'
14 package 'httpd' do
15 action :install
16 end
17
18 service 'httpd' do
19 action :start
20 end
21 end
45
test/unit/apache_spec.rb
1 require 'chefspec'
2 require 'chefspec/berkshelf'
3
4 describe 'example::apache' do
5 context 'when applying recipe to Ubuntu' do
6 let(:chef_run) do
7 runner = ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04')
8 runner.converge(described_recipe)
9 end
10
11 it 'includes apt recipe' do
12 expect(chef_run).to include_recipe('apt')
13 end
14
15 it 'installs Apache server package' do
16 expect(chef_run).to install_package('apache2')
17 end
18
19 it 'starts Apache server' do
20 expect(chef_run).to start_service('apache2')
21 end
22 end
46
test/unit/apache_spec.rb
23
24 context 'when applying recipe to CentOS' do
25 let(:chef_run) do
26 runner = ChefSpec::SoloRunner.new(platform: 'centos', version: '7.1.1503')
27 runner.converge(described_recipe)
28 end
29
30 it 'installs Apache server package' do
31 expect(chef_run).to install_package('httpd')
32 end
33
34 it 'starts Apache server' do
35 expect(chef_run).to start_service('httpd')
36 end
37 end
38 end
47
$ bundle exec rspec test/unit
.....
Finished in 1.47 seconds (files took 3.07 seconds to load)
5 examples, 0 failures
48
Demo
49
O que mais posso testar?
• Arquivos & diretórios
• Usuários & grupos
• Pacotes do sistema operacional
• Serviços
• Requisições HTTP
• etc.
50
Alternativas
• Não uso Chef! E agora?
• rspec-puppet
• salttesting
• etc.
51
Problemas:

Testes reflexivos
52
1 file '/etc/login_service.yml'
2 owner ourapp
3 group ourapp
4 end
1 describe 'creating the configuration file for login_service' do
2 it 'gives the file the right attributes' do
3 expect(chef_run).to create_template('/etc/login_service.yml').with(
4 user: 'ourapp',
5 group: 'ourapp'
6 )
7 end
8 end
53
Testes de provisionamento
54
InSpec
• Um framework para testes e auditoria
• https://www.chef.io/inspec/
55
InSpec
1 describe package('apache2') do
2 it { should be_installed }
3 end
1 describe file('/etc/ssh') do
2 it { should be_directory }
3 end
1 describe command('env') do
2 its('stdout') { should_not match(/^MYSQL_PASS=/) }
3 end
56
Test Kitchen
• Ferramenta de integração para desenvolver
e testar seu código de infraestrutura
• https://github.com/test-kitchen/test-kitchen
57
Test Kitchen
1 ---
2 driver:
3 name: vagrant
4
5 provisioner:
6 name: chef_zero
7
8 platforms:
9 - name: centos-7.1
10 - name: ubuntu-14.04
11
12 suites:
13 - name: client
14 run_list:
15 - recipe[postgresql::client]
16 - name: server
17 run_list:
18 - recipe[postgresql::server]
58
$ mkdir -p test/integration/default
$ touch test/integration/default/apache_spec.rb
$ touch .kitchen.yml
59
1 # encoding: utf-8
2 if os[:family] == 'ubuntu'
3 package_name = 'apache2'
4 else
5 package_name = 'httpd'
6 end
7
8 describe package(package_name) do
9 it { should be_installed }
10 end
11
12 describe service(package_name) do
13 it { should be_installed }
14 it { should be_running }
15 end
16
17 describe port(80) do
18 it { should be_listening }
19 end
test/integration/default/
apache_spec.rb
60
.kitchen.yml
1 ---
2 driver:
3 name: vagrant
4
5 provisioner:
6 name: chef_zero
7
8 verifier:
9 name: inspec
10
11 platforms:
12 - name: centos-7.1
13 - name: ubuntu-14.04
14
15 suites:
16 - name: default
17 run_list:
18 - recipe[example::apache]
61
Gemfile
1 # encoding: utf-8
2 source 'https://rubygems.org'
3
4 gem 'berkshelf', '~> 4.3.5'
5 gem 'bundler', '~> 1.5'
6 gem 'rake', '~> 10'
7
8 group :development do
9 gem 'chefspec', '~>4.7.0'
11 gem 'kitchen-inspec', '~> 0.14.0'
12 gem 'kitchen-vagrant', '~> 0.20.0'
13 gem 'test-kitchen', '~> 1.10.2'
14 end
62
$ bundle update
Fetching gem metadata from https://rubygems.org/
Fetching version metadata from https://rubygems.org/
Fetching dependency metadata from https://rubygems.org/
Resolving dependencies..................
...
Bundle updated!
63
$ bundle exec kitchen list
Instance Driver Provisioner Verifier Transport Last Action
default-centos-71 Vagrant ChefZero Inspec Ssh <Not Created>
default-ubuntu-1404 Vagrant ChefZero Inspec Ssh <Not Created>
64
Demo
65
$ bundle exec kitchen test
-----> Starting Kitchen (v1.10.2)
66
-----> Creating <default-centos-71>...
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'bento/centos-7.1'...
...
-----> Converging <default-centos-71>...
Preparing files for transfer
...
Converging 2 resources
...
Recipe: example::apache
* yum_package[httpd] action install
- install version 2.4.6-40.el7.centos.1 of package httpd
* service[httpd] action start
- start service service[httpd]
...
Target: ssh://vagrant@127.0.0.1:2201
✔ System Package httpd should be installed
✔ Service httpd should be installed
✔ Port 80 should be listening
Summary: 3 successful 0 failures 0 skipped
67
-----> Creating <default-ubuntu-1404>...
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'bento/ubuntu-14.04'...
...
-----> Converging <default-ubuntu-1404>...
Preparing files for transfer
...
Converging 2 resources
...
Recipe: example::apache
* apt_package[apache2] action install
- install version 2.4.7-1ubuntu4.10 of package apache2
* service[apache2] action start (up to date)
...
Target: ssh://vagrant@127.0.0.1:2201
✔ System Package apache2 should be installed
✔ Service apache2 should be installed
✔ Port 80 should be listening
Summary: 3 successful 0 failures 0 skipped
68
Alternativas
• Serverspec
• https://github.com/mizzy/serverspec
• Beaker
• https://github.com/puppetlabs/beaker
69
Alternativas
• Outros drivers do Test Kitchen incluem:
• Docker
• EC2
• OpenStack
• etc.
70
Problemas:

Tempo de feedback
71
Testes de aceitação
72
Instalando uma nuvem
OpenStack
73
Instalando uma nuvem
OpenStack
74
Instalando uma nuvem
OpenStack
• Cada componente é desenvolvido de
maneira isolada
• A cada mudança aceita, os componentes
são integrados para garantir que continuam
funcionando corretamente
• https://github.com/openstack/tempest
75
Instalando uma nuvem
OpenStack
• Duas vezes por dia, um pacote era gerado
contendo uma versão potencial para
produção com todas as mudanças das
últimas x horas
76
Instalando uma nuvem
OpenStack
Preparar o

ambiente
Executar um
script de
instalação
Executar

a suite de
testes de integração
Reportar a
saída por email
e chat
77
Instalando uma nuvem
OpenStack
Preparar o

ambiente
Executar um
script de
instalação
Executar

a suite de
testes de integração
Reportar a
saída por email
e chat
~20 minutos
~40 minutos
~30 minutos
~20 segundos
78
Problemas:

Custo
&
Tempo de feedback
79
Uma suite balanceada
80
Uma suite de testes
balanceada
Verificação
de sintaxe
Análise estática
Testes
de unidade
Testes de
provisionamento
Testes de
aceitação
81
Testes de
Provisionamento
Infraestrutura
Garantindo a qualidade da sua infraestrutura
Glauco Oliveira
82
Links
• Repositório: https://github.com/glauco/infrastructure-tests-
talk/
• Infrastructure as code: https://www.amazon.com/
Infrastructure-Code-Managing-Servers-Cloud/dp/1491924357
• Snowflake server: http://martinfowler.com/bliki/
SnowflakeServer.html
• Phoenix server: http://martinfowler.com/bliki/
PhoenixServer.html
83
Links
• Pirâmide de testes: http://martinfowler.com/
bliki/TestPyramid.html
• Ruby: https://www.ruby-lang.org
• chefspec: https://github.com/sethvargo/chefspec
• rspec-puppet: https://github.com/puppetlabs/
rspec-puppet
84
Links
• InSpec: https://github.com/chef/inspec
• Serverspec: http://serverspec.org/
• Test Kitchen: https://github.com/test-
kitchen/test-kitchen
85
Obrigado!
gvinici@thoughtworks.com
twitter.com/glauco
github.com/glauco
86

Mais conteúdo relacionado

Mais procurados

Comunicação em Tempo Real com ASP.Net SignalR
Comunicação em Tempo Real com ASP.Net SignalRComunicação em Tempo Real com ASP.Net SignalR
Comunicação em Tempo Real com ASP.Net SignalREduardo Pires
 
Bibliotecas de interface rica no jsf 2
Bibliotecas de interface rica no jsf 2Bibliotecas de interface rica no jsf 2
Bibliotecas de interface rica no jsf 2Pablo Nóbrega
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebElenilson Vieira
 
Maven 3, Sonar e Hudson
Maven 3, Sonar e HudsonMaven 3, Sonar e Hudson
Maven 3, Sonar e HudsonRodrigo Branas
 
Infraestrutura imutável - A base das aplicações na nuvem
Infraestrutura imutável - A base das aplicações na nuvemInfraestrutura imutável - A base das aplicações na nuvem
Infraestrutura imutável - A base das aplicações na nuvemFernando Ike
 
Workshop Microservices - Microservices com Spring Cloud e Netflix OSS
Workshop Microservices - Microservices com Spring Cloud e Netflix OSSWorkshop Microservices - Microservices com Spring Cloud e Netflix OSS
Workshop Microservices - Microservices com Spring Cloud e Netflix OSSRodrigo Cândido da Silva
 
DevOps, Chef, Puppet, Ansible e como vender milhões na Black Friday com 100% ...
DevOps, Chef, Puppet, Ansible e como vender milhões na Black Friday com 100% ...DevOps, Chef, Puppet, Ansible e como vender milhões na Black Friday com 100% ...
DevOps, Chef, Puppet, Ansible e como vender milhões na Black Friday com 100% ...Bruno Luiz Pereira da Silva
 
Workshop Microservices - Arquitetura Microservices
Workshop Microservices - Arquitetura MicroservicesWorkshop Microservices - Arquitetura Microservices
Workshop Microservices - Arquitetura MicroservicesRodrigo Cândido da Silva
 
Deploy de aplicações Ruby com Mina - TDC Floripa 2014
Deploy de aplicações Ruby com Mina - TDC Floripa 2014Deploy de aplicações Ruby com Mina - TDC Floripa 2014
Deploy de aplicações Ruby com Mina - TDC Floripa 2014Ismael Stahelin
 
Segurança e automação na Amazon: Lições das trincheiras
Segurança e automação na Amazon: Lições das trincheirasSegurança e automação na Amazon: Lições das trincheiras
Segurança e automação na Amazon: Lições das trincheirasBruno Luiz Pereira da Silva
 
Construindo aplicações leves e performáticas com ASP.NET Core 1.0
Construindo aplicações leves e performáticas com ASP.NET Core 1.0Construindo aplicações leves e performáticas com ASP.NET Core 1.0
Construindo aplicações leves e performáticas com ASP.NET Core 1.0Fabrício Lopes Sanchez
 
Campus Party 2014 - Desenvolvimento Web com ASP.NET
Campus Party 2014 - Desenvolvimento Web com ASP.NETCampus Party 2014 - Desenvolvimento Web com ASP.NET
Campus Party 2014 - Desenvolvimento Web com ASP.NETEduardo Pires
 
Introdução ao Spring Framework
Introdução ao Spring FrameworkIntrodução ao Spring Framework
Introdução ao Spring FrameworkNatanael Fonseca
 
JBoss Fuse Service Works - O Fuse além da integração - PT-BR
JBoss Fuse Service Works - O Fuse além da integração - PT-BRJBoss Fuse Service Works - O Fuse além da integração - PT-BR
JBoss Fuse Service Works - O Fuse além da integração - PT-BRElvis Rocha
 
DevOps: desenvolvedores e sysadmins cooperando na prática
DevOps: desenvolvedores e sysadmins cooperando na práticaDevOps: desenvolvedores e sysadmins cooperando na prática
DevOps: desenvolvedores e sysadmins cooperando na práticaAri Stopassola Junior
 
Introdução ao Asp.NET MVC
Introdução ao Asp.NET MVCIntrodução ao Asp.NET MVC
Introdução ao Asp.NET MVCBenicio Ávila
 
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...Rodrigo Cândido da Silva
 
Criando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com AppiumCriando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com AppiumElias Nogueira
 
Spring: Overview do framework mais popular para desenvolvimento em Java
Spring: Overview do framework mais popular para desenvolvimento em JavaSpring: Overview do framework mais popular para desenvolvimento em Java
Spring: Overview do framework mais popular para desenvolvimento em JavaMariana de Azevedo Santos
 

Mais procurados (20)

Comunicação em Tempo Real com ASP.Net SignalR
Comunicação em Tempo Real com ASP.Net SignalRComunicação em Tempo Real com ASP.Net SignalR
Comunicação em Tempo Real com ASP.Net SignalR
 
Bibliotecas de interface rica no jsf 2
Bibliotecas de interface rica no jsf 2Bibliotecas de interface rica no jsf 2
Bibliotecas de interface rica no jsf 2
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
 
Maven 3, Sonar e Hudson
Maven 3, Sonar e HudsonMaven 3, Sonar e Hudson
Maven 3, Sonar e Hudson
 
Infraestrutura imutável - A base das aplicações na nuvem
Infraestrutura imutável - A base das aplicações na nuvemInfraestrutura imutável - A base das aplicações na nuvem
Infraestrutura imutável - A base das aplicações na nuvem
 
Workshop Microservices - Microservices com Spring Cloud e Netflix OSS
Workshop Microservices - Microservices com Spring Cloud e Netflix OSSWorkshop Microservices - Microservices com Spring Cloud e Netflix OSS
Workshop Microservices - Microservices com Spring Cloud e Netflix OSS
 
DevOps, Chef, Puppet, Ansible e como vender milhões na Black Friday com 100% ...
DevOps, Chef, Puppet, Ansible e como vender milhões na Black Friday com 100% ...DevOps, Chef, Puppet, Ansible e como vender milhões na Black Friday com 100% ...
DevOps, Chef, Puppet, Ansible e como vender milhões na Black Friday com 100% ...
 
Workshop Microservices - Arquitetura Microservices
Workshop Microservices - Arquitetura MicroservicesWorkshop Microservices - Arquitetura Microservices
Workshop Microservices - Arquitetura Microservices
 
Deploy de aplicações Ruby com Mina - TDC Floripa 2014
Deploy de aplicações Ruby com Mina - TDC Floripa 2014Deploy de aplicações Ruby com Mina - TDC Floripa 2014
Deploy de aplicações Ruby com Mina - TDC Floripa 2014
 
Segurança e automação na Amazon: Lições das trincheiras
Segurança e automação na Amazon: Lições das trincheirasSegurança e automação na Amazon: Lições das trincheiras
Segurança e automação na Amazon: Lições das trincheiras
 
Construindo aplicações leves e performáticas com ASP.NET Core 1.0
Construindo aplicações leves e performáticas com ASP.NET Core 1.0Construindo aplicações leves e performáticas com ASP.NET Core 1.0
Construindo aplicações leves e performáticas com ASP.NET Core 1.0
 
Java 9, 10 e ... 11
Java 9, 10 e ... 11Java 9, 10 e ... 11
Java 9, 10 e ... 11
 
Campus Party 2014 - Desenvolvimento Web com ASP.NET
Campus Party 2014 - Desenvolvimento Web com ASP.NETCampus Party 2014 - Desenvolvimento Web com ASP.NET
Campus Party 2014 - Desenvolvimento Web com ASP.NET
 
Introdução ao Spring Framework
Introdução ao Spring FrameworkIntrodução ao Spring Framework
Introdução ao Spring Framework
 
JBoss Fuse Service Works - O Fuse além da integração - PT-BR
JBoss Fuse Service Works - O Fuse além da integração - PT-BRJBoss Fuse Service Works - O Fuse além da integração - PT-BR
JBoss Fuse Service Works - O Fuse além da integração - PT-BR
 
DevOps: desenvolvedores e sysadmins cooperando na prática
DevOps: desenvolvedores e sysadmins cooperando na práticaDevOps: desenvolvedores e sysadmins cooperando na prática
DevOps: desenvolvedores e sysadmins cooperando na prática
 
Introdução ao Asp.NET MVC
Introdução ao Asp.NET MVCIntrodução ao Asp.NET MVC
Introdução ao Asp.NET MVC
 
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
 
Criando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com AppiumCriando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com Appium
 
Spring: Overview do framework mais popular para desenvolvimento em Java
Spring: Overview do framework mais popular para desenvolvimento em JavaSpring: Overview do framework mais popular para desenvolvimento em Java
Spring: Overview do framework mais popular para desenvolvimento em Java
 

Semelhante a Infrastructure Testing

Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
Experimentos envolvendo ações de Rejuvenescimento de Software
Experimentos envolvendo ações de Rejuvenescimento de SoftwareExperimentos envolvendo ações de Rejuvenescimento de Software
Experimentos envolvendo ações de Rejuvenescimento de SoftwareCarlos Eduardo
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium Mayron Cachina
 
Segurança Através de Gerência de Configurações
Segurança Através de Gerência de ConfiguraçõesSegurança Através de Gerência de Configurações
Segurança Através de Gerência de ConfiguraçõesJeronimo Zucco
 
Como migrar seu ambiente de desenvolvimento para Linux
Como migrar seu ambiente de desenvolvimento para LinuxComo migrar seu ambiente de desenvolvimento para Linux
Como migrar seu ambiente de desenvolvimento para LinuxMarcelo Sabadini
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHPFelipe Ribeiro
 
Tutorial instalacao-glpi-ocs
Tutorial instalacao-glpi-ocsTutorial instalacao-glpi-ocs
Tutorial instalacao-glpi-ocsJoao Muela
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
Usando containers com auto-escala de testes
Usando containers com auto-escala de testesUsando containers com auto-escala de testes
Usando containers com auto-escala de testesElias Nogueira
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosElias Nogueira
 
Oracle e SQL Server na prática mitos, semelhanças e diferenças
Oracle e SQL Server na prática mitos, semelhanças e diferençasOracle e SQL Server na prática mitos, semelhanças e diferenças
Oracle e SQL Server na prática mitos, semelhanças e diferençasLeonardo Pedroso Costa
 
Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Felipe Klerk Signorini
 

Semelhante a Infrastructure Testing (20)

Introdução ao Chef Ops
Introdução ao Chef OpsIntrodução ao Chef Ops
Introdução ao Chef Ops
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Experimentos envolvendo ações de Rejuvenescimento de Software
Experimentos envolvendo ações de Rejuvenescimento de SoftwareExperimentos envolvendo ações de Rejuvenescimento de Software
Experimentos envolvendo ações de Rejuvenescimento de Software
 
De 0 a DevOps
De 0 a DevOpsDe 0 a DevOps
De 0 a DevOps
 
Desafio Rest API
Desafio Rest APIDesafio Rest API
Desafio Rest API
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium
 
Segurança Através de Gerência de Configurações
Segurança Através de Gerência de ConfiguraçõesSegurança Através de Gerência de Configurações
Segurança Através de Gerência de Configurações
 
Como migrar seu ambiente de desenvolvimento para Linux
Como migrar seu ambiente de desenvolvimento para LinuxComo migrar seu ambiente de desenvolvimento para Linux
Como migrar seu ambiente de desenvolvimento para Linux
 
Cakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudouCakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudou
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
 
Ruby On Rails Regis
Ruby On Rails RegisRuby On Rails Regis
Ruby On Rails Regis
 
Tutorial instalacao-glpi-ocs
Tutorial instalacao-glpi-ocsTutorial instalacao-glpi-ocs
Tutorial instalacao-glpi-ocs
 
Puppet overview
Puppet overviewPuppet overview
Puppet overview
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Usando containers com auto-escala de testes
Usando containers com auto-escala de testesUsando containers com auto-escala de testes
Usando containers com auto-escala de testes
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
 
Oracle e SQL Server na prática mitos, semelhanças e diferenças
Oracle e SQL Server na prática mitos, semelhanças e diferençasOracle e SQL Server na prática mitos, semelhanças e diferenças
Oracle e SQL Server na prática mitos, semelhanças e diferenças
 
Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016
 

Mais de Glauco Vinicius Argentino de Oliveira (8)

Technology Radar Talks - NuGet
Technology Radar Talks - NuGetTechnology Radar Talks - NuGet
Technology Radar Talks - NuGet
 
Padrões de design orientado a objetos
Padrões de design orientado a objetosPadrões de design orientado a objetos
Padrões de design orientado a objetos
 
Estudo da aplicação da arquitetura orientada a serviços em um sistema de gest...
Estudo da aplicação da arquitetura orientada a serviços em um sistema de gest...Estudo da aplicação da arquitetura orientada a serviços em um sistema de gest...
Estudo da aplicação da arquitetura orientada a serviços em um sistema de gest...
 
Software livre, codigo aberto e licenças
Software livre, codigo aberto e licençasSoftware livre, codigo aberto e licenças
Software livre, codigo aberto e licenças
 
Relatório Técnico: .NET Framework, ASP.NET MVC 3 e Silverlight
Relatório Técnico: .NET Framework, ASP.NET MVC 3 e SilverlightRelatório Técnico: .NET Framework, ASP.NET MVC 3 e Silverlight
Relatório Técnico: .NET Framework, ASP.NET MVC 3 e Silverlight
 
Estudo de caso ASP.NET MVC e Silverlight
Estudo de caso ASP.NET MVC e SilverlightEstudo de caso ASP.NET MVC e Silverlight
Estudo de caso ASP.NET MVC e Silverlight
 
Boo - Introdução
Boo - IntroduçãoBoo - Introdução
Boo - Introdução
 
Apache Hadoop - Introdução
Apache Hadoop - IntroduçãoApache Hadoop - Introdução
Apache Hadoop - Introdução
 

Infrastructure Testing

  • 1. Testes de Provisionamento Garantindo a qualidade da sua infraestrutura Glauco Oliveira 1
  • 2. Agenda • Infraestrutura como código • Ferramentas de configuração de servidores • Práticas de engenharia de software aplicadas à infraestrutura • Testando sua infraestrutura 2
  • 4. Infraestrutura como código • Definição e gerenciamento de infraestrutura através de código-fonte • Objetivos: • Consistência • Reprodutibilidade • Confiança • Facilidade de manutenção e crescimento 4
  • 6. Desafios • Quando má empregada, pode causar problemas em uma escala muito maior: • Crescimento rápido e desordenado • Flutuações nas configurações • Servidores "floco de neve" 6
  • 7. Ferramentas de configuração de servidores O que eu uso? 7
  • 8. Ferramentas de configuração de servidores • Usar scripts para criar, provisionar e atualizar servidores não é algo novo! 8
  • 10. Ferramentas para criação de servidores 10
  • 12. Ferramentas para criar modelos de servidores 12
  • 14. Fluxo de trabalho Como faço isso? 14
  • 15. Phoenix Servers • Servidores são reconstruídos a cada mudança na sua configuração • Evita flutuações de configuração 15
  • 16. Cria um modelo
 de servidor Cria um novo servidor a partir do modelo Substitui o servidor antigo pelo novo Remove o servidor antigo 16
  • 17. Práticas de engenharia de software aplicadas à infraestrutura Como assim? 17
  • 18. Qualidade através de código • Qualidade não é uma prática separada • Seu código de infraestrutura deve: • Ser fácil de compreender • Ser simples de modificar • Fornecer feedback rápido quando problemas acontecem 18
  • 19. Qualidade através de código • Algumas práticas que nos dão mais confiança: • Sistema de controle de versão • Testes automatizados • Integração contínua • Entrega contínua 19
  • 22. Testes automatizados • Habilitam mudanças contínuas em um sistema • Garantem que o trabalho pode ser feito rapidamente • Identificam erros assim que possível 22
  • 25. Escrevendo um cookbook com testes • O que você precisa? • Um editor de texto • Chef • Ruby • Conexão com a internet* • Vagrant (Virtualbox) 25
  • 26. Escrevendo um cookbook com testes • A idéia é escrevermos um cookbook que instala o Apache em um servidor • Vamos seguir um fluxo guiado por testes 26
  • 28. ChefSpec • Um framework de teste de unidade automatizado para cookbooks Chef • https://sethvargo.github.io/chefspec/ 28
  • 29. $ mkdir -p test/unit $ mkdir recipes $ touch Berksfile $ touch metadata.rb $ touch Gemfile 29
  • 31. metadata.rb 1 name 'example' 2 maintainer 'Glauco Oliveira' 3 maintainer_email 'gl4uc0@gmail.com' 4 description 'An example of how to test infrastructure' 5 issues_url 'https://github.com/glauco/provisioning-tests-talk/issues' 6 source_url 'https://github.com/glauco/provisioning-tests-talk' 7 version '0.0.1' 8 depends 'apt' 9 depends 'yum' 31
  • 32. Gemfile 1 # encoding: utf-8 2 source 'https://rubygems.org' 3 4 gem 'berkshelf', '~> 4.3.5' 5 gem 'bundler', '~> 1.5' 6 gem 'rake', '~> 10' 7 8 group :development do 9 gem 'chefspec', '~>4.7.0' 10 end 32
  • 33. $ bundle install Fetching gem metadata from https://rubygems.org/ Fetching version metadata from https://rubygems.org/ Fetching dependency metadata from https://rubygems.org/ Resolving dependencies....... ... Bundle complete! 4 Gemfile dependencies, 77 gems now installed. Use `bundle show [gemname]` to see where a bundled gem is installed. 33
  • 34. $ bundle exec rspec test/unit No examples found. Finished in 0.00029 seconds (files took 0.51493 seconds to load) 0 examples, 0 failures 34
  • 36. test/unit/apache_spec.rb 1 require 'chefspec' 2 require 'chefspec/berkshelf' 3 4 describe 'example::apache' do 5 let(:chef_run) do 6 ChefSpec::SoloRunner.converge(described_recipe) 7 end 8 9 it 'installs Apache server package' do 10 expect(chef_run).to install_package('apache2') 11 end 12 end 36
  • 37. $ bundle exec rspec test/unit =========================================================================== Recipe Compile Error =========================================================================== Chef::Exceptions::RecipeNotFound -------------------------------- could not find recipe apache for cookbook example ... Finished in 0.84264 seconds (files took 2.6 seconds to load) 1 example, 1 failure Failed examples: rspec ./spec/unit/apache_spec.rb:9 # example::apache installs Apache server package 37
  • 38. recipes/apache.rb 1 # encoding: utf-8 2 package 'apache2' do 3 action :install 4 end 38
  • 39. $ bundle exec rspec test/unit . Finished in 0.82665 seconds (files took 2.57 seconds to load) 1 example, 0 failures 39
  • 40. test/unit/apache_spec.rb 1 require 'chefspec' 2 require 'chefspec/berkshelf' 3 4 describe 'example::apache' do 5 let(:chef_run) do 6 ChefSpec::SoloRunner.converge(described_recipe) 7 end 8 9 it 'installs Apache server package' do 10 expect(chef_run).to install_package('apache2') 11 end 12 13 it 'starts Apache server' do 14 expect(chef_run).to start_service('apache2') 15 end 16 end 40
  • 41. $ bundle exec rspec test/unit .F Failures: 1) example::apache starts Apache server Failure/Error: expect(chef_run).to start_service('apache2') expected "service[apache2]" with action :start to be in Chef run. Other service resources: # ./spec/unit/apache_spec.rb:14:in `block (2 levels) in <top (required)>' Finished in 0.84234 seconds (files took 1.46 seconds to load) 2 examples, 1 failure Failed examples: rspec ./spec/unit/apache_spec.rb:13 # example::apache starts Apache server 41
  • 42. recipes/apache.rb 1 # encoding: utf-8 2 package 'apache2' do 3 action :install 4 end 5 6 service 'apache2' do 7 action :start 8 end 42
  • 43. $ bundle exec rspec test/unit .. Finished in 0.85119 seconds (files took 1.63 seconds to load) 2 examples, 0 failures 43
  • 45. recipes/apache.rb 1 # encoding: utf-8 2 case node['platform'] 3 when 'ubuntu' 4 include_recipe('apt') 5 6 package 'apache2' do 7 action :install 8 end 9 10 service 'apache2' do 11 action :start 12 end 13 when 'centos' 14 package 'httpd' do 15 action :install 16 end 17 18 service 'httpd' do 19 action :start 20 end 21 end 45
  • 46. test/unit/apache_spec.rb 1 require 'chefspec' 2 require 'chefspec/berkshelf' 3 4 describe 'example::apache' do 5 context 'when applying recipe to Ubuntu' do 6 let(:chef_run) do 7 runner = ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') 8 runner.converge(described_recipe) 9 end 10 11 it 'includes apt recipe' do 12 expect(chef_run).to include_recipe('apt') 13 end 14 15 it 'installs Apache server package' do 16 expect(chef_run).to install_package('apache2') 17 end 18 19 it 'starts Apache server' do 20 expect(chef_run).to start_service('apache2') 21 end 22 end 46
  • 47. test/unit/apache_spec.rb 23 24 context 'when applying recipe to CentOS' do 25 let(:chef_run) do 26 runner = ChefSpec::SoloRunner.new(platform: 'centos', version: '7.1.1503') 27 runner.converge(described_recipe) 28 end 29 30 it 'installs Apache server package' do 31 expect(chef_run).to install_package('httpd') 32 end 33 34 it 'starts Apache server' do 35 expect(chef_run).to start_service('httpd') 36 end 37 end 38 end 47
  • 48. $ bundle exec rspec test/unit ..... Finished in 1.47 seconds (files took 3.07 seconds to load) 5 examples, 0 failures 48
  • 50. O que mais posso testar? • Arquivos & diretórios • Usuários & grupos • Pacotes do sistema operacional • Serviços • Requisições HTTP • etc. 50
  • 51. Alternativas • Não uso Chef! E agora? • rspec-puppet • salttesting • etc. 51
  • 53. 1 file '/etc/login_service.yml' 2 owner ourapp 3 group ourapp 4 end 1 describe 'creating the configuration file for login_service' do 2 it 'gives the file the right attributes' do 3 expect(chef_run).to create_template('/etc/login_service.yml').with( 4 user: 'ourapp', 5 group: 'ourapp' 6 ) 7 end 8 end 53
  • 55. InSpec • Um framework para testes e auditoria • https://www.chef.io/inspec/ 55
  • 56. InSpec 1 describe package('apache2') do 2 it { should be_installed } 3 end 1 describe file('/etc/ssh') do 2 it { should be_directory } 3 end 1 describe command('env') do 2 its('stdout') { should_not match(/^MYSQL_PASS=/) } 3 end 56
  • 57. Test Kitchen • Ferramenta de integração para desenvolver e testar seu código de infraestrutura • https://github.com/test-kitchen/test-kitchen 57
  • 58. Test Kitchen 1 --- 2 driver: 3 name: vagrant 4 5 provisioner: 6 name: chef_zero 7 8 platforms: 9 - name: centos-7.1 10 - name: ubuntu-14.04 11 12 suites: 13 - name: client 14 run_list: 15 - recipe[postgresql::client] 16 - name: server 17 run_list: 18 - recipe[postgresql::server] 58
  • 59. $ mkdir -p test/integration/default $ touch test/integration/default/apache_spec.rb $ touch .kitchen.yml 59
  • 60. 1 # encoding: utf-8 2 if os[:family] == 'ubuntu' 3 package_name = 'apache2' 4 else 5 package_name = 'httpd' 6 end 7 8 describe package(package_name) do 9 it { should be_installed } 10 end 11 12 describe service(package_name) do 13 it { should be_installed } 14 it { should be_running } 15 end 16 17 describe port(80) do 18 it { should be_listening } 19 end test/integration/default/ apache_spec.rb 60
  • 61. .kitchen.yml 1 --- 2 driver: 3 name: vagrant 4 5 provisioner: 6 name: chef_zero 7 8 verifier: 9 name: inspec 10 11 platforms: 12 - name: centos-7.1 13 - name: ubuntu-14.04 14 15 suites: 16 - name: default 17 run_list: 18 - recipe[example::apache] 61
  • 62. Gemfile 1 # encoding: utf-8 2 source 'https://rubygems.org' 3 4 gem 'berkshelf', '~> 4.3.5' 5 gem 'bundler', '~> 1.5' 6 gem 'rake', '~> 10' 7 8 group :development do 9 gem 'chefspec', '~>4.7.0' 11 gem 'kitchen-inspec', '~> 0.14.0' 12 gem 'kitchen-vagrant', '~> 0.20.0' 13 gem 'test-kitchen', '~> 1.10.2' 14 end 62
  • 63. $ bundle update Fetching gem metadata from https://rubygems.org/ Fetching version metadata from https://rubygems.org/ Fetching dependency metadata from https://rubygems.org/ Resolving dependencies.................. ... Bundle updated! 63
  • 64. $ bundle exec kitchen list Instance Driver Provisioner Verifier Transport Last Action default-centos-71 Vagrant ChefZero Inspec Ssh <Not Created> default-ubuntu-1404 Vagrant ChefZero Inspec Ssh <Not Created> 64
  • 66. $ bundle exec kitchen test -----> Starting Kitchen (v1.10.2) 66
  • 67. -----> Creating <default-centos-71>... Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'bento/centos-7.1'... ... -----> Converging <default-centos-71>... Preparing files for transfer ... Converging 2 resources ... Recipe: example::apache * yum_package[httpd] action install - install version 2.4.6-40.el7.centos.1 of package httpd * service[httpd] action start - start service service[httpd] ... Target: ssh://vagrant@127.0.0.1:2201 ✔ System Package httpd should be installed ✔ Service httpd should be installed ✔ Port 80 should be listening Summary: 3 successful 0 failures 0 skipped 67
  • 68. -----> Creating <default-ubuntu-1404>... Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'bento/ubuntu-14.04'... ... -----> Converging <default-ubuntu-1404>... Preparing files for transfer ... Converging 2 resources ... Recipe: example::apache * apt_package[apache2] action install - install version 2.4.7-1ubuntu4.10 of package apache2 * service[apache2] action start (up to date) ... Target: ssh://vagrant@127.0.0.1:2201 ✔ System Package apache2 should be installed ✔ Service apache2 should be installed ✔ Port 80 should be listening Summary: 3 successful 0 failures 0 skipped 68
  • 69. Alternativas • Serverspec • https://github.com/mizzy/serverspec • Beaker • https://github.com/puppetlabs/beaker 69
  • 70. Alternativas • Outros drivers do Test Kitchen incluem: • Docker • EC2 • OpenStack • etc. 70
  • 75. Instalando uma nuvem OpenStack • Cada componente é desenvolvido de maneira isolada • A cada mudança aceita, os componentes são integrados para garantir que continuam funcionando corretamente • https://github.com/openstack/tempest 75
  • 76. Instalando uma nuvem OpenStack • Duas vezes por dia, um pacote era gerado contendo uma versão potencial para produção com todas as mudanças das últimas x horas 76
  • 77. Instalando uma nuvem OpenStack Preparar o
 ambiente Executar um script de instalação Executar
 a suite de testes de integração Reportar a saída por email e chat 77
  • 78. Instalando uma nuvem OpenStack Preparar o
 ambiente Executar um script de instalação Executar
 a suite de testes de integração Reportar a saída por email e chat ~20 minutos ~40 minutos ~30 minutos ~20 segundos 78
  • 81. Uma suite de testes balanceada Verificação de sintaxe Análise estática Testes de unidade Testes de provisionamento Testes de aceitação 81
  • 82. Testes de Provisionamento Infraestrutura Garantindo a qualidade da sua infraestrutura Glauco Oliveira 82
  • 83. Links • Repositório: https://github.com/glauco/infrastructure-tests- talk/ • Infrastructure as code: https://www.amazon.com/ Infrastructure-Code-Managing-Servers-Cloud/dp/1491924357 • Snowflake server: http://martinfowler.com/bliki/ SnowflakeServer.html • Phoenix server: http://martinfowler.com/bliki/ PhoenixServer.html 83
  • 84. Links • Pirâmide de testes: http://martinfowler.com/ bliki/TestPyramid.html • Ruby: https://www.ruby-lang.org • chefspec: https://github.com/sethvargo/chefspec • rspec-puppet: https://github.com/puppetlabs/ rspec-puppet 84
  • 85. Links • InSpec: https://github.com/chef/inspec • Serverspec: http://serverspec.org/ • Test Kitchen: https://github.com/test- kitchen/test-kitchen 85