Automatizando Ambientes com um toque do Chef
Quem sou?
- Matheus Fernandes
- Estudante de Engenharia de Software, UnB
- Desenvolvedor no LAPPIS
github.com/msfernandes
matheus.souza.fernandes@gmail.com
o que tem pra hoje?
- Apresentação das ferramentas
- Um pouco sobre o Vagrant
- Introdução ao Chef
- Integrando Vagrant e Chef
- Chef e Entrega Contínua
- Exemplos
Ferramentas
um pouco sobre o vagrant
o que é vagrant?
- Criar e configurar ambientes virtuais de desenvolvimento
- Permite modificar características físicas da VM, como RAM, HD, numero de CPUs, etc
- Interface de rede
- Pastas compartilhadas
- Automatização com scripts shell, Chef, Puppet, etc
- VirtualBox ou VMWare
por quê vagrant?
- Antigamente, era fácil manter ambientes
- PHP e MySQL, por exemplo
- Hoje, nem tanto...
- Inifinitas linguagens + Infinitos Bancos + Inifinitos servidores de aplicação = Inifinitas Possibilidades
- Tudo instalado e configurado manualmente
- Desenvolvimento != Produção
- "Ah... Mas na minha máquina funciona!"
- Diferentes sistemas operacionais
- Versionamento
Instalação
- Instalar VirtualBox ou VMWare
- yum install VirtualBox
- Baixar versão mais recente do Vagrant no site
- https://www.vagrantup.com/downloads
- Instalar Vagrant
- yum install vagrant_1.7.2_x86_64.rpm
hello vagrant
hello vagrant
hello vagrant
Outros comandos
- vagrant box
- vagrant status
- vagrant halt
- vagrant destroy
- vagrant package
- vagrant share
- etc...
introdução ao chef
Visão geral
- Automatiza como as aplicações são configuradas, implantadas e gerenciadas.
- Três grandes frentes:
-
Chef-Client:
- Instalado em uma máquina (virtual, física ou nuvem)
- Executa as configurações especificadas
-
Chef Server:
- Gerencia os clientes, controlando o quê, como, quando e onde as tarefas serão executadas
-
Chef Analytics:
- Métrica e análises de dados do Chef Server
-
Chef-Client:
alguns termos...
-
Chef-solo
- Versão stand-alone do Chef-client
-
Recipe (receita)
- Um arquivo .rb que contém as instruções para a configuração do ambiente
- Cookbook (livro de receitas)
-
Atributos
- JSON com informações que podem ser usadas em templates ou receitas.
-
Template
- Arquivo .erb usado para criar arquivos de configuração
ah! então é ruby?
- Ruby DSL (Domain-Specific Language)
- O que é necessário saber de Ruby?
- Manipular Strings
- Arrays
- Hash
- Expressões Regulares
- Estruturas de Decisões
- Declarar/Chamar métodos
- Declarar/Chamar classes
por que usar o chef?
- Configurações em um só lugar
- Possibilidade de versionamento
- Reuso de código
- O próprio código pode servir como documentação
- Automatizar configuração de ambientes
Instalação
$ cd ~
$ curl -L https://www.opscode.com/chef/install.sh | bash
Thank you for installing Chef!
$ chef-solo -v
Chef: 12.2.1
$ chef-solo -c solo.rb -j atributos.json
solo.rb
- Especifica detalhes da configuração do chef-solo
-
cookbook_path
- Subdiretório para os cookbooks que poderão ser utilizados (pode ser um array)
-
json_attribs
- Caminho para o arquivo que contém os atributos necessários
atributos.json
- Variáveis passadas para o Chef, usadas em receitas e templates
- Versão de um pacote
- Diretório
{
"nginx": {
"version": "1.6.0",
"install_method": "source",
"default_site_enabled": true,
"source": {
"modules": ["nginx::http_gzip_static_module", "nginx::http_ssl_module"]
}
},
"run_list": [
"recipe[nginx]"
]
}
cookbooks
-
Cookbook
- metada.rb
-
recipes
- default.rb
-
templates
- template.erb
-
files
- file_name
metadata.rb
- Contém informações básicas do Cookbook
- name
- maintaner
- maintaner_email
- license
- description
- version
- E dependências co cookbook
recipe.rb
- Contém as instruções de instalação e configuração do ambiente
directory "repo_dir" do
owner "vagrant"
group "vagrant"
path "#{REPO_DIR}"
recursive true
action :create
end
package "libmysqlclient-dev"
execute "create_database" do
command "mysqladmin create gestorpsi -u root"
not_if "mysql -u root -e 'use gestorpsi;'"
end
template "#{HOME}/.bashrc" do
owner "vagrant"
group "vagrant"
source "bashrc.erb"
variables({
:venv_dir => "#{VENV_DIR}",
:shared_dir => "#{SHARED_DIR}/repo",
:repo_dir => "#{REPO_DIR}"
})
end
template.erb
- Arquivo com espaços reservados para os atributos, muito usado para criar aquivos de configuração
upstream colab {
server 127.0.0.1:8001 fail_timeout=10s;
}
server {
listen *:80;
server_name <%= node['config']['external_hostname'] %>;
access_log /var/log/nginx/colab.access.log;
error_log /var/log/nginx/colab.error.log;
location ~ ^/static/img/logo\.[^.]+\.svg$ {
alias /var/lib/colab-assets/spb/logo.svg;
}
...
chef supermarket
- Conjunto de cookbooks mantido pela comunidade
- Forma de utilização de cada cookbook pode variar
- Livre para qualquer usuário Chef
- Podem exigir atributos específicos no JSON inicial
chef supermarket
include_recipe "python"
python_virtualenv "#{VENV_DIR}" do
owner "vagrant"
group "vagrant"
action :create
end
python_pip "" do
virtualenv "#{VENV_DIR}"
options "-r #{REPO_DIR}/requirements.txt"
end
include_recipe "git"
git "#{REPO_DIR}" do
repository "repo_url"
reference "branch"
action :sync
end
integrando vagrant e chef
vagrant
- Não prejudica ambiente local
- Facilidade na criação de ambientes
- Ambientes leves, reprodutíveis e portáteis
chef
- Automatiza a configuraçao de ambientes
- Código como documentação de ambiente
vagrant + chef
- Padronizar ambientes de desenvolvimento
- Ambiente de desenvolvimento mais parecido com de produção
- Fácil atualização de ambiente
vagrant + chef
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.network "forwarded_port", guest: 8000, host: 8080
config.vm.provision "chef_solo" do |chef|
chef.add_recipe "gestorpsi::development"
chef.json = {
"mariadb" => {
"db_name" => "gestorpsi",
"user" => "root",
"server_root_password" => "",
"install" => {
"version" => "5.5"
}
}
}
end
end
chef e entrega contínua
integração contínua
- Integração frequente do trabalho realizado
- Cada integração é verificada por um build automatizado
- Trabalho em equipe gera menos erros e reduz riscos
- Bugs não se acumulam e são detectados mais cedo
ta, e a entrega?
- Possibilidade de mandar o software para produção em qualquer momento do seu ciclo de vida
- Qualquer pessoa pode ter feedback rápido e automatizado sobre o quanto seus sistemas estão prontos para produção, sempre que uma mudança acontece
- Pode-se enviar qualquer versão do seu software para produção através do simples acionamento de um botão
fluxo - entrega continua
exemplos
radar parlamentar
- Aplicação que mostra a semelhança entre os parlamentares de forma gráfica
-
Processo de Deploy, antes
- Manual, com script sh
-
Processo de Deploy, depois
- Entrega contínua
- Jenkins - Fabric - Chef
radar parlamentar
Gestorpsi
- Aplicação para gerência de clínica de psicologia
-
Configuração de ambiente, antes
- INSTALL.md com passo-a-passo
-
Configuração de ambiente, depois
- Vagrant + Chef para automatizar e padronizar a configuração de ambiente
obrigado!
dúvidas?
matheus.souza.fernandes@gmail.com
chef
By Matheus Fernandes
chef
- 381