Por muito tempo desenvolvedores e administradores de infraestrutura tentam fazer integrações para que a implantação (deployment) seja mais efetiva, com menos sofrimento ao portar do ambiente de desenvolvimento para homologação/produção.
Essa apresentação introduz ao movimento DevOps, que aproxima desenvolvedores e administradores de sistema (sysadmin), para que trabalhem em maior sinergia.
A proposta é ilustrar os pilares da cultura DevOps, bem como os softwares que a permeia, focada em ferramentas e práticas reais, com exemplos do ecossistema PHP.
2. Bacharel em Informática com ênfase em Análise de
Sistemas pela Unisinos, cursou mestrado em Engenharia
Informática e de Computadores pelo Instituto Superior
Técnico da Universidade Técnica de Lisboa (Portugal),
perito judicial ad hoc especializado em TI (mantenedor do
site PERITO.inf.br), Zend Certified Engineer (PHP 5.3), Zend
Certified PHP Engineer (PHP 5.5) e Zend Framework 2
Certified Architect (ZFCA) #ZEND004019, Certified
ScrumMaster pela Scrum Alliance #203613, Microsoft
Certified Professional (MCP), idealizador do projeto
Certificamp, consultor web e PHP evangelist.
Ari Stopassola Junior
5. Realidade
• Estruturada x Orientada à Objetos
• Relacional x NoSQL
• Waterfall x Agile
• FTP x git push
• Equipes remotas
• Virtualização
• Curriculum Vitae x GitHub | Stack
Overflow
• Cloud
6. "A harmonia do mundo depende da
retificação dos nomes."
Confúcio
551-479 a.C.
7. Introdução
• Termo "DevOps" foi cunhado em
2009 por Patrick Debois
• Movimento que enfatiza a comunicação
entre desenvolvedores e administradores
de sistema
• Desenvolvedores adicionam novos
recursos enquanto que Administradores
mantém o sistema estável, seguro e
performático
• Diminiur riscos de implantação através da
cultura + ferramental
Foto:https://www.linkedin.com/in/patrickdebois
10. em.pa.ti.a
Ação de se colocar no
lugar de outra pessoa,
buscando agir ou pensar
da forma como ela
pensaria ou agiria nas
mesmas circunstâncias.
11. Cultura
• Interesses da companhia são
superiores aos EGOs de
sysadmins e desenvolvedores
• DevOps são práticas
• Através da automação, tem-se
como resultado a melhoria
contínua
• Postura amistosa: respeito,
jamais esconda o problema,
evite dizer não, confiança, seja
transparente, evite
fingerpointing.
Foto: http://cshr.cmb.ac.lk/?page_id=1678
31. Infrastructure as code
Puppet, Chef e Ansible
package "ntpd" do
action :install
end
template "/etc/ntpd.conf" do
source "ntpd.conf.erb"
owner "0755"
notifies :restart, "service[ntpd]"
end
service "ntpd" do
action [:start, :enable]
end
["site1", "site2", "site3"].each do |dir|
directory "/srv/vhosts/#{dir}" do
mode 0775
owner "root"
group "root"
action :create
recursive true
end
end
32. Provisionamento
• SaltStack
www.saltstack.com
• Phansible (focado em PHP)
www.phansible.com
• PuPHPet
https://puphpet.com
• Windows PowerShell Desired State
Configuration
https://technet.microsoft.com/en-
us/library/dn249912.aspx
45. By Martin Fowler
"Continuous Integration is a software
development practice where members of a
team integrate their work frequently, usually
each person integrates at least daily -
leading to multiple integrations per day.
Each integration is verified by an
automated build (including test) to detect
integration errors as quickly as possible.
Many teams find that this approach leads
to significantly reduced integration
Foto: https://www.flickr.com/photos/adewale_oshineye/2933030620/
53. O que seria um build no PHP?
• Submeter aos testes (unitário, comportamento e
integração)
• Executar as migrations
• Concatenar e minificar arquivos JavaScript e CSS
• Comprimir imagens
• Compilar Sass e LESS
• Atribuir permissões em arquivos/pastas
• Produzir arquivos estáticos, como HTMLs
• Agendamentos na CRON
• php.ini local x php.ini do servidor x php.ini do CLI
• Transformar código de ECMA6 para ECMA5
61. //Carrega o Gulp e seus plug-ins
var gulp = require('gulp');
var jshint = require('gulp-jshint');
var sass = require('gulp-sass');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
//Analisa o código
gulp.task('lint', function() {
return gulp.src('src/js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'));
});
//Compila o Sass
gulp.task('sass', function() {
return gulp.src('scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('css'));
});
//Concatena e minifica o JavaScript
gulp.task('scripts', function() {
return gulp.src('src/js/*.js')
.pipe(concat('src/js/all.js'))
.pipe(gulp.dest('dist'))
.pipe(rename('src/js/all.min.js'))
.pipe(uglify())
.pipe(gulp.dest('dist'));
});
// Default Task
gulp.task('default', ['lint', 'sass', 'scripts']);
Grunt e Gulp
62. Lock-in
• Banco de dados específico daquela
hospedagem
• Mecanismo de filas exclusivo
• Replica em diferentes data-centers
(worldwide) e troca automática de DNS
• S3 criptografado, gera token para acesso
ao documento que usa UMA vez e expira
Foto: https://flic.kr/p/bAUx5j
63. • DevOps é habilidade
• Trata-se de gestão de
configuração
• Outsourced é
impraticável
• Focado em sistemas
modernos
• DevOps é ideologia
• Trata-se de
comunicação
• Outsourced é
totalmente viável
• Para qualquer tipo de
sistema
Administradores leia-se: administradores de sistema, administradores de rede, sysadmin, infraestrutura, segurança e outros.
Workers (mecanismo de filas como ActiveMQ), Querys SQL x MapReduce.
Recomenda-se autenticar via par de chaves, ao invés de login/senha.Karma Level.Arquitetura de cloud: IaaS x Paas- Exexmplos de IaaS: Digital Ocean, AWS, Linode, Azure, Rackspace e Open Stack
- Exemplos de PaaS: OpenShift, Heroku, Google App Engine (Google Cloud), AppFog, Pagoda Box, Fortrabbit, Laravel Forge
Estereótipos: Cena do seriado Silicon Valley da HBO numa das eternas brigas do Dinesh (desenvolvedor) e Gilfoyle (administrador de sistemas).
Não é minha máquina, é o seu código! Não é meu código, é o seu servidor.
Palestra "Empathy Gives You Superpowers" por Matt Stauffer [ Laracon EU 2015 ]
https://www.youtube.com/watch?v=fMFjO2szDnk
Dê acesso aos desenvolvedores.Atualmente estão surgindo cargos de DevOps, que antes não existia.Perde-se o medo de errar.
Qual administrador daqui já abriu código para averiguar o que estava acontecento? Certamente poucos…
Há tempos existe demanda para desenvolvedores full stack, então muitos já estão familiarizados com SO, plataforma, banco, servidor de aplicação e linguagem (pilha completa).
Voltando a serem mais generalistas com equipes multifuncionais.
LAMP stack está dando lugar ao NGINX, MongoDB e outras versões de PHP (HHVM e Hack).
Geralmente criam-se canais # onde cada canal é um projeto.Cada commit pode aparecer na interface do Slack e com um clique é possível enxergar as mudanças, ver se (por acaso) alguém mexeu no mesmo código que você está trabalhando etc.O Laravel integra de forma nativa os warnings e todo o tipo de erro gerado.A RedHat usa IRC.
Totalmente integrado ao GitHub.
Gitter tem um setup mais fácil.
Compartilhar a visão
Visibilidade, transparência, o que está acontecendo agora, quem está trabalhando e onde, compartilhar código, rastrear tarefas, gerenciar o backlog (Scrum).O MSProject perdeu mercado em função da sua complexidade e pela falta de integração com os repositórios.Cada pessoa tem um perfil: alguns preferem papel e artefatos "físicos".https://trello.com/atomicopenshiftNo Trello é possível "votar" para aprovar ou mensurar alguma demanda.
Da 37signals (dos autores do Ruby On Rails), que agora tornaram-se Basecamp.
O ambiente de HomeOffce foi muito beneficiado com esse tipo de software, pois é possível ter um acompanhamento global remotamente.
Resposta rápida, triagem de solicitações, prioridades.Mais pertinente no contexto onde há necessidade de feedback ao cliente, onde ele possa acompanhar o desenvolvimento das demandas.BugZilla, Trac, Mantis e o próprio issues do GitHub.
https://bugzilla.redhat.com/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=MODIFIED&bug_status=ON_DEV&classification=Red%20Hat&list_id=3982480&order=bug_severity%2Cpriority%2Cassigned_to%20DESC%2Cbug_id%20DESC&product=OpenShift%20Origin&query_format=advanced&short_desc=\[fork\]&short_desc_type=notregexp&version=3.xÉ possível parametrizar de modo que o ticket só seja fechado pelo time de QA. Permite também upload privado, em caso de dados sigilosos que necessitem serem enviados para o desenvolvedor.
One time now (da Axosoft), porém mais focado em Scrum.Ele não permitia dois responsável por uma tarefa (princípio fundamental do Pair programming – XP).Target Process, Mantis, Bugzilla
Alarmes, verificação periódica da saúde das máquinas, tempo de resposta, obtém as exceções – quando o aplicativo já está online.
https://pt.wikipedia.org/wiki/ISO_8601
Coletar, extrair, parsing, explorar logsAnalisa UM log é fácil. Analisar milhares é muito complicado.
ISO 8601.
Nagios também tem esse propósito, embora seja mais "old school".GitHub Status também é um indício interessante, embora menos preciso e com um certo delay.ZendServer tem uma solução muito robusta para trabalhar com PHP.New relic, além de monitoramento, é considerado uma ferramenta bastante poderosa como Analytics.
Manter o estado consistente
Animal de estimação x rebanho
Preparar um servidor pode levar dois dias de trabalho, ou mais. E se forem 200 servidores?Chef salva tempo e a sanidade mental.Preparar a Stack para servir a aplicação.Chef e Puppet são os precursores.Quando a aplicação cresce demais, é necessário apelar para Chef e Puppet.Puppet, Chef, PuPHPet e Ansible/PhansiblePossuem mecanismos de failover, lidam com problemas que possam ocorrer na instalação
DECLARATIVA
Provisionamento é uma arte.SaltStack tem programa de certificaçãoPuppet promove conferências em todo o mundo (também tem certificação).Powershell DSC permite mexer no registro do Windows e muitas outras tarefas.Salt e Ansible são mais focados nos desenvolvedores. Salt utiliza YAML, enquanto que Ansible usa SSH (não requer instalação de recursos na máquina client)
Phansible é uma solução mais voltada para o desenvolvimento (não em produção).Homestead do Laravel.
Rastrear mudanças
Era pré-Git os administradores eram os "inimigos".
Gitosis e Gitorious pode-se baixar e instalar num servidor local. Através de um servidor, é possível ter maior controle sobre os dados.Existe também o Garrit e outros...
Hook é no sentido de interceptar.Existem hooks no lado do cliente e outros no servidor.touch .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
É agnóstico do ponto de vista de linguagem.
Mashup
Tudo isso foi possível com o advento do GitHub (SaaS), lembrando que Git é apenas o versionamento – enquanto que o GitHub é a plataforma social de código.
Cada pull request dispara Hooks (ganchos) para outros aplicativos, fazendo com que o processo seja automático. Através de Single SignOn (OAuth2) é possível se habilitar em qualquer outro serviço
Replicar toda a stack do servidor de aplicação
Espelhamento de ambientes.Qual a imagem usar, que script Chef executar, habilitar rede, pastas compartilhadas.
Com uma linha é possível testar em diferentes versões de sistema operacional e combinações de configuração.
Usa Hyper-V (Microsoft), VirtualBox (Oracle), KVM, VMWare etc.Orientado a ambientes de desenvolvimento, pois utilizam uma camada de vitualização – prejudicando a performance.Criar um ambiente que possa ser reproduzido, quando se precisa de algo que fuja do LAMP, compatibilidade cross-platform, time trabalhando em diferentes SO. Provisionamento: setup automatizado, quanto tempo para subir uma máquina, maximizar dev/prod parity, isolamento de ambientes,
Docker não usa virtualização. Ele sobe uma instância do kernel, monta um filesystem criptografado, isola num processo – formando um "container", que pode ser facilmente portado em uma cloud como OpenShift, AWS, DigitalOcean etc.Muito mais performático que o Vagrant.A montagem da configuração da máquina de produção é feita uma única vez e depois é distribuída entre os desenvolvedores.Usa a técnica de kernel namespaces. Em https://hub.docker.com é possível baixar uma imagem Docker (definição) e executando-a transforma-se em "container". Vantagens são segurança, velocidade e granularidade.Ex.: docker pull nome | docker run nome
O Docker ganhou destaque (com relação ao LXC), pois utiliza os "Docker file".Lembre-se que ele não guarda estados, portanto é necessário montar um volume externo para persistir algum dado.
Kubernetes, Mesos e Docker Swarm
Social development onde você pode praticar Pair programming com outro desenvolvedor remoto.
Enxerga as mudanças no código em tempo real.
Integração Contínua é teste!Jenkins, Travis, GitLab CI, Bamboo, Liquibase, TeamCity e Code Climate.
Antecipar gargalos e problemas ANTES de colocar em produção. Progresso incremental.
É possível realizar o commit e evitar o disparo do CI. Ex.: git commit –m "mensagem [CI SKIP]"http://docs.travis-ci.com/user/languages/php/
E o SaaS (Software as a Service)?
Garantia de qualidade
Inspeção
Ele confronta o código com uma série de ferramentas de QA: http://phpqatools.orgSumariza a saida das principais ferramentas de qualidade. Roda uma série de análises.Métricas.Faz revisão do código, atribui badges (selos) onde a nota 4 é a máxima,
Automatização de forma simples, previsível e reversível.Compacta, transfere, descompacta, executa as migrations etc.É mais fácil realizar um Hot Deploy (atômico) em PHP, comparado ao Java – pois os binários do Java estão em memória, enquanto que os bytecodes PHP são gerados em tempo de execução.
Booking fazem várias entregas DIÁRIAS (releases).GlassFish e Jboss possuem mecanismos de hotdeploy incorporados no servidor de aplicação.Na nuvem, é possível fazer a implantação horizontal: sobe um servidor com a versão nova do software e desce um com a versão antiga, e vai fazendo o shift gradativamente.Capistrano, Deployer, Magallanes, Rocketeer, Juju, Envoyer e Phing (manual)
Habilitar SSL (Certificação digital) nos servidores, gerar documentação, Stress test: Apache Bench e SeigeECMAScript 5 é mais compatível.
Proposed Standards Recommendation
Phing é baseado no Apache Ant.
Workflow bastante utilizado
Integração contínua x Entrega contínua
Siga esse mantra
Simples: procure concentrar o processo de implantação e dispará-lo em apenas UM comando.
Previsível : saber o que está acontecendo. Se houver efeitos colaterais, mantenha a versão corrente.
Reversível: UM comando e o sistema volta ao que era.
Implementados em Node.jsUsa o gerenciador de pacotes NPM. Grunt e Gulp são mais focados em FrontEnd.Extraído de:
https://travismaynard.com/writing/getting-started-with-gulp
1) Instale o Node.js
https://nodejs.org
2) Crie um diretório, entre nele e execute:
npm init
[ preencha as perguntas que ele for perguntando ]
3) sudo npm install --global gulp
[ para habilitar o utilitário gulp por linha de comando ]
4) npm install --save-dev gulp
5) instale os complementos
npm install gulp-jshint gulp-sass gulp-concat gulp-uglify gulp-rename --save-dev
5) Crie o arquivo gulpfile.js e coloque:
var gulp = require('gulp');
gulp.task('default', function() {
// place code for your default task here
});
6) Execute:
gulp
CloudFormation usa o conceito de template (em JSON) onde é possível especificar os requisitos desejados (ou até mesmo usar um templete pré-pronto), então ele será criado na cloud. Definir número de instâncias etc.Capistrano, Deployer, Magallanes, Rocketeer e Juju.Envoyer vende a possibilidade de "Zero Downtime", caso contrário execute php artisan down (para suspender o serviço temporariamente).
Por força bruta é possível quebrar uma senha.
Ou "vendor lock-in" geralmente afeta o sysadmin (infraestrutura)Google Cloud restringe demais a migração para outra plataforma.
Testes de aceitação (Codeception) são mais proveitosos para times pequenos. Emulam a navegação no site/sistema, experimentando o funcionamento como um todo.