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

  1. Instalar VirtualBox ou VMWare
    • yum install VirtualBox
  2. Baixar versão mais recente do Vagrant no site
    • https://www.vagrantup.com/downloads
  3. 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

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