Gerenciando infraestrutura com Salt

Cléber Zavadniak

Apresentação

Cléber Zavadniak 

  • Desenvolvedor sênior
  • Python
  • Linux
  • CTO DroneMapp 

 

  https://medium.com/clebertech

Gerenciamento de infra

Pets versus Gado

Pet

Pet

  • Tem um nome
  • Lembro quando chegou em casa
  • Tem carteira de vacinação
  • Tem data de aniversário
  • Se morrer eu fico triste

Gado

Gado

  • Não tem nome
  • Não lembro quando chegou
  • Quando vacina, vacina todos
  • Não cabe no carro
  • Não vou chorar se morrer

Mission accomplished

Servidor Pet

  • Eu lembro quando chegou
  • Acesso via SSH
  • Configurado a mão
  • Se morrer eu fico triste

Servidor Gado

  • Sei lá quando subiu
  • Gerenciado via ferramentas
  • Nunca acesso via SSH
  • Se morrer é só subir outro, na hora

"This machine is a server

DO NOT power it down!!"

Tim Berners Lee

on the first web server ever.

Your filesystem
And HD are damaged
Beyond repair.

Hello darkness, my old friend...

Servidor Pet

  • Dificuldade de manutenção aumenta exponencialmente
    • Duvida? Aumente de 10 máquinas para 1000...
  • É fácil deixar escapulir alguma "receita".
    • "Agora não mexe, porque não sei fazer de novo do mesmo jeito."

Servidor Gado

  • Gerencia-se 10.000 do mesmo jeito que se gerencia 1.
  • Só trabalha-se com as "receitas", então é difícil perdê-las.

Ferramentas

Configuração

  • Chef
  • Puppet
  • Salt
  • Ansible
  • Outros...

Infraestrutura

  • Terraform
  • Salt

Por que não o Ansible?

!OPINIÃO PESSOAL ALERT!
Cultura ruim.

Esse tipo de diálogo é frequente nas Github Issues do projeto:

 

Contributor A: "Ei, por que não implementamos <x>? Isso tornaria o sistema mais simples, mais acessível aos usuários iniciantes, mais rápido, mais bonito, mais correto e mais cheiroso!"

Contributor B: "+1. Ficaria bem bom, mesmo."

Contributor C: "+1. Sempre achei que deveria ser assim."

Tomador de decisão: "Não. Tá bom do jeito que está."

Salt

Salt

  • Aka "saltstack"
  • Gerenciamento de configuração
  • Gerenciamento de infra (via salt-cloud)
  • Arquitetura master-minion
    • Ou masterless
    • Ou multi-master
  • É rápido
  • Escala muito bem
  • Escrito em Python
    • Muito fácil estender
    • Fácli de integrar com outros sistemas

Primeiro problema:

Nomenclatura!

"Configuração"

  • Config do servidor: "configuração"
  • Config do Salt: "configuração"
  • Config das máquinas: "configuração"
  • Config do Salt nas máquinas: "configuração"
  • Características das máquinas: "configuração"
  • "Configuração": "configuração"

Grains
Pillars
States

Grains

  • Processador
  • Discos
  • Memória
  • Sistema operacional
  • Kernel
  • Distro
  • Versão
  • Interfaces de rede
    • IPs
  • Outros...
  • Grains personalizados

Custom Grains

Pillars

  • Dados relativos ao sistema todo
    • E não apenas uma máquina

States

State != state template

  • "State" é a situação (ou "estado") de uma máquina
  • "State template" é um arquivo que coopera no gerenciamento de estados.

State Templates

Possibilidades quase infinitas...

  • Pacotes
  • Serviços do sistema
  • Arquivos e diretórios
  • Usuários
  • Interfaces de rede
  • Rotas IP
  • O que mais você precisar...

Não só nos minions

Você pode configurar o próprio master, também.

Como são APLICADOS

Os templates de estado?

Template de estado sendo aplicado:

Templates de Estado

Como faz?

Templates de estado

  • YAML
  • Jinja2

"Instalação" de HStore e PostGIS no Postgres

{% set company = salt['grains.get']('company') %}

  • Variável Jinja2 normal
  • "salt" serve como "dicionário de funções"
  • Função "salt.grains.get" é chamada
    • Com argumento 'company'

{% set profile = salt['pillar.get']('aws:region:us-east-1:profile') %}

  • Credenciais da AWS salvas num pillar

{% set

db_endpoint = salt.boto_rds.get_endpoint(dB_name, profile=profile) %}

  • Chamada a um "execution module"
    • salt.boto_rds.get_endpoint
  • Mais para retornar valores do que para fazer coisas

postgres_extension.present

  • Garante que determinada extensão está presente
  • `if_not_exists`:
    • só tentará instalar se já não estiver instalada

Dicas

Gerencie o salt-master usando salt

  • Vários arquivos dependem da situação dos minions
  • Vários arquivos dependem de outros arquivos
  • Serviços externos configurados via estados do salt-master

Divida os estados em "estágios"

  • Templates ficam mais simples
  • Aplicação pode ser amarrada a eventos

Domine o "publish"

  • É um conceito não-trivial
  • Mas pode vir bem a calhar

 

{% for host, data in salt['publish.publish']('*', 'grains.items').items() %}

salt-cloud

salt-cloud

Gerencia máquinas

(No meu caso, instâncias EC2)

Você consegue criar instâncias EC2 com o salt, mas instalar e configurar essa instância como minion poder ser complicado.

 

O salt-cloud facilita esse trabalho todo.

Mapas

`sudo salt-cloud -m /etc/salt/cloud.maps/v2.sls`

 

  • Gerencie o arquivo de mapeamento usando salt!
  • No meu caso, ele depende do pillar "companies".
    • Ao adicionar uma nova empresa à lista, quero que atualize o arquivo de mapeamento.

Mapeamento de máquinas

salt-cloud + salt = poder

Exemplo: um sistema que cria novas máquinas sob demanda:

 

  • Quando ocorrer determinado evento,
  • Aplique o highstate ao salt-master,
    • Que já puxa os dados de pillar de, digamos, um banco de dados externo
    • Isso atualiza o arquivo de mapeamento
  • Rode o salt-cloud
    • O que cria, de fato, as novas máquinas
  • Regra: tão logo um novo minion seja criado, aplicar o highstate nele.
  • O highstate configurará o minion de acordo com os grains,
    • que foram setados justamente pelo salt-cloud,
    • que foi configurado via salt

Obrigado

https://medium.com/clebertech

https://medium.com/dronemapp

Gerenciando Infraestrutura com Salt

By Cléber Zavadniak

Gerenciando Infraestrutura com Salt

  • 462