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