On Github dgmorales / talk-puppet-ansible-salt
Diego Morales
morales@propus.com.br @dgmorales
Meu nome é Diego Morales. Sysadmin há 15+ anos. Trabalho na Propus, que presta serviços de infraestrutura de TI e de BigData e NoSQL.
Origem da palestra
Meu histórico as ferramentas
Então, quem aí usa? Puppet? Ansible? Salt?
Vai ser interessante ter a visão e a experiência de vocês. Mas o tempo vai ser apertado.
Online: http://dgmorales.info/talks/cm-pas
Pressione S para Speaker's Notes
A proposta aqui não é fácil. Cada uma certamente precisa de uma palestra inteira ou mais para ser devidamente apresentada.
Objetivo: apresentar o mínimo básico sobre cada ferramenta e sobre o "ecossistema" de cada uma, e dar caminhos para vocês conhecerem mais.
Vou direto ao ponto, fiquem à vontade de interromper para perguntar ou acrescentar e eu à vontade de dizer guardar para depois a discussão.
Ferramentas de gerência de configuração, infraestrutura como código.
Concorrentes ou complementares? Há controvérsias.
Minha visão: concorrentes. Os diferentes focos e abordagens diferentes formam um espectro, puppet e ansible nos extremos, salt buscando tudo. Chuto que o crescimento de cada um vai agravar a concorrência.
4 principais players + o pai de todos, cfengine.
Deixei o Chef de fora. Ele é muito popular. Deve ser ótimo. Achei "muito parecido" com puppet (até mais complexo) e eu apostei no Puppet.
Puppet: Maturidade
Ansible: Simplicidade
Salt: Flexibilidade
Se eu tivesse que dizer só uma palavra sobre cada um...
Descobri fazendo essa palestra que eles mesmos se descrevem assim (ansible e salt, ao menos).
Criado em 2005, por um sysadmin, Luke Kanies.
Bem velhinho já, mais que o Chef até. Cfgengine nasceu em 93, though.
Alguns clientes...
Ruby: facts feitos em ruby, mas cada vez menos necessários.
Tem uma CA interna super fácil de usar, mas suporta apontar para um CA externa também
Como eu queria um modo push. Código vivo na minha máquina, lê aqui, vai lá e faz. Feio e perigoso, eu sei.
Faz um tempo que eu não procuro, mas não tinha nada muito interessante.
Mcollective muito utilizado para disparar agent runs.
É o mais maduro em suporte a windows.
Um dos pontos a favor da maturidade.
Orchestrator: define os componentes de um app, a relação entre eles, onde roda cada um, e ele se vira com o resto.
Ao meu ver Puppet App Orchestrator é uma resposta da PuppetLabs aos features de orquestração de Ansible e Salt, com o jeito Puppet de ser.
Ainda um privilégio do Enterprise. Não se sabe até quando.
Puppet Explorer: meu atual favorito.
Puppet Dashboard é mais velho. Abandonado? Há dúvidas...
Foreman: ainda não suporta o Puppet 4. Projeto maior, mais abrangente.
PCP do Guto Carvalho e Miguel Di Ciurcio Filho da Instruct, com ajuda de outros da comunidade puppet Brasil. Inclui Server, PuppetDB, Explorer e Mcollective.
"Ansible’s main goals are simplicity and ease-of-use."
Criado em 2012, por Michael DeHaan.
Recentemente adquirido pela RedHat.
Michael DeHaan se afastou, e parece bem afastado.
Alguns clientes...
Depende de um inventário de hosts, que pode ser dinâmico, um script, vários prontos.
Orquestração: vai no balanceador e tira máquinas x, y, z do serviço, vai em x, y e z e atualiza a aplicação, reboota elas, e aguarda voltarem, vai lá no balanceador e põe elas de volta.
Pode até não ser tão bom quanto o Puppet Enterprise, mas parece muito interessante.
Rundeck já é uma ferramenta de execução remota (SSH, plugin pra salt e outros tb), mas focada na usabilidade pela web, controle de acesso e auditoria/logging.
Casam muito bem
Semaphore: único projeto público específico para ansible que eu ouvi falar até agora.
Criado em 2011, por Thomas Hatch.
Alguns clientes...
É o mais rápido.
Segurança é uma preocupação. Rodar salt na internet não parece uma boa. E não suporta CA externas
"Salt crypto is partly ... " Estão explorando novos transportes. RAET Feito em casa, inclusive a crypto. Projeto que será aberto e independente. O novo com tornado está sendo feito no LinkedIn.
Salt-SSH é outra história
?
Agora tem uma interface GUI. Antes era só suporte.
Tudo muito escondido ainda.
Saltpad tem uma fama de ter seus problemas. Tudo meio alpha.
Slide com Meme gif: check!
Ufa.
Se fosse possível fazer apenas isso, já seria muita coisa.
package { 'openssh-server': ensure => installed, } file { '/etc/ssh/sshd_config': source => 'file:///vagrant/puppet/sshd_config', owner => 'root', group => 'root', mode => '0644', notify => Service['ssh'] # require => Package['openssh-server'], } service { 'ssh': ensure => running, enable => true, }
O require não é mais necessário no 4.x, ele segue a ordem do manifest
package, file e service são resources
Limpo e organizado, não?
- hosts: all name: Install SSH Server tasks: - package: name=openssh-server state=present - template: src: sshd_config dest: /etc/ssh/sshd_config owner: root group: root mode: 0644 notify: - restart ssh - service: name=ssh state=started handlers: - name: restart ssh service: name=ssh state=restarted
Não me ajuda na tese de simplicidade, eu sei
Install SSH Server é uma play, aplicada em all hosts
package (new in 2.0), template e service são modules
Simples?
YAML: "é só dados", "não é uma linguagem de programação". Sei, como se isso ajudasse neste caso.
Mas tem a vantagem de ser mais facilmente consumível programaticamente.
Note o handler separado.
Cada task pode ter um name. Mas é opcional.
openssh-server: pkg.installed: - name: openssh-server service.running: - name: ssh - enable: True file.managed: - name: /etc/ssh/sshd_config - source: salt://sshd_config - user: root - group: root - mode: 644 - watch_in: - service: openssh-server
Esta é uma formula, pkg.installed, service.running e file.managed descrevem states dentro da fórmula.
State functions vs Execution functions
Loops é um caso interessante de se examinar pois são:
3 maneiras bem diferentes...
... que dizem muito sobre o estilo de cada um.
$binaries = ["run", "build", "update", "foo"] $binaries.each |String $binary| { file {"/usr/local/bin/myapp-$binary": ensure => link, target => "/opt/myapp/bin/$binary", } }
Requer puppet 4.x ou parser=future
each, slice, filter, map, e mais
No puppet 3.x o workaround é defined types + resource-title-arrays, muito mais trabalhoso e limitado.
- hosts: all tasks: - name: create symlinks for our app file: > state=link src=/opt/myapp/bin/{{ item }} dest=/usr/local/bin/myapp-{{ item }} force=yes with_items: - run - build - update - foo
with_dict, with_nested, with_fileglobs, e mais...
outros jeitos de quebrar ... >
... linhas
Aproveitando: Idempotência?
Idempotência: uma bandeira do Puppet. Ele é provavelmente o melhor dos 3 nisso, mas não é como se os outros ignorassem esse conceito.
{% for binary in ['run', 'build', 'update', 'foo'] %} /usr/local/bin/myapp-{{ binary }}: file.symlink: - target: /opt/myapp/bin/{{ binary }} {% endfor %}
Jinja. Dentro da sua formula salt.
Programe o seu código. Pode ser bom, pode ser ruim.
Usado por tudo, inclusive pillar (definição condicional de variáveis).
Já vi cara reclamando muito disso tender a gerar bugs difíceis de debugar no seu código. Mensagens de erro péssimas.
Puppet Forge: 4000+ módulos, 36 Supported, 79 Approved. E alguns poucos tipos nativos.
Ansible: batteries included, muitos módulos. E 5000+ roles no Galaxy.
E o Salt sendo o Salt: temos execution modules, state modules, e mais. Tem de tudo no salt-contrib, e agora no SaltStarters.
Como referência é bem interessante. Como tutorial, era ruim, mas essa nova linha do getting started tá resolvendo isso.
Puppet, pacote completo: listas br e en, telegram, IRC #puppet-br, #puppet, meetup. Empresa BR: Instruct e outras...
https://telegram.me/joinchat/AejjFQIq_2kBH1EQ7mVfjw
Ansible... em inglês: #ansible, lista. Meetups BR parados: SP e RJ.
Salt ... em inglês: #salt, lista. Comunidade muito forte, campeão em contribuidores (1500+). No Brasil, nada...
Receptividade de fixes das comunidades: salt é mais permissivo e aberto. Ansible mais cuidadoso e limitador.
De novo: maturidade, flexibilidade, simplicidade. Qual é o mais importante?
Github repo: em breve mais.
https://github.com/dgmorales/vagrant-cfgmgmt-sandbox
Puppet é o que tem mais classe, é o mais "bonito". Adoro a DSL, acho que é o código mais fácil de ler. E o forge é algo insanamente útil (e mais útil que as alternativas dos outros dois).
Mas a simplicidade do Ansible tem um valor imenso. É muito mais fácil de começar do que os outros: não subestime o valor disso para muitos ambientes.
E a flexibilidade do Salt é sedutora também. Ele faz o que você quer, do jeito que você quiser. Eu vou lendo aquela documentação e vendo videos e descobrindo mais e mais coisas interessantes. Até um Reactor system para responder a eventos no ambiente.
Diego Morales morales@propus.com.br @dgmorales Do, Automate, Repeat: http://doauto.wordpress.com
Slides: http://dgmorales.info/talks/cm-pas
Github repo: em breve mais.