Usando o Chef, parte 3

chef-3_start

A primeira parte trouxe os conceitos básicos do Chef enquanto que a segunda, com o cookbook, mostrou como sofisticadas e tornar tudo mais flexível porém,até o momento, ainda não se viu muito da tal configuração automática de hosts. Exceto, claro, no próprio host onde a ferramenta está a executar — algo que não tem a menor graça — então é hora de fazer o Chef mexer em outros hosts! 🙂

Outros conceitos

Antes de começar, mais alguns conceitos sobre o Chef:

  • Chef Server — É um serviço que gerencia recursos do Chef (atributos, hosts, receitas etc) funcionando como uma espécie de repositório.
  • Node (nó)  — É um host, ou melhor, um host gerenciado pelo Chef.
  • Workstation (estação de trabalho, literalmente) — É o computador onde o Chef DK está instalado e onde receitas são escritas, testados e também executadas.

Neste caso o termo workstation, serve para dar nome ao host que se esteve usando até agora.

Chef Server

Como dito antes a Chef vende um serviço de gerenciamento e hospedagem. Há até um período gratuito para testes e que eu até poderia ter usado mas resolvi que seria bem mais interessante implementar a infraestrutura da ferramenta por completo.

Instalação do programa

A primeira coisa é baixar o Chef Server:

chef-2_chefserver

No momento em que escrevo a versão mais recente do Chef é a 12.2.0 e o sistema operacional usado é outra máquina virtual com Ubuntu Server 15.04 — por mais que ele também peça a 14.04.

O arquivo tem 438 MiB, logo o download demorará um pouco e ao terminar:

$ sudo dpkg -i chef-server-core_12.2.0-1_amd64.deb

Pronto? Não! Como ele é composto de diversos outros componentes é necessário reconfigurá-los para esta nova instalação mas antes um pequeníssimo ajuste:

$ sudo mkdir /usr/lib/systemd/system

Ao menos com o Ubuntu Server 15.04 foi necessário criar este diretório, caso contrário ele começará a reconfiguração e abortará após um tempo informando que ele não existe.

Agora sim:

$ sudo chef-server-ctl reconfigure
...
Chef Client finished, 403/478 resources updated in 869.41510474 seconds
Chef Server Reconfigured!

E enquanto reconfigura vá tomar um café (só lembrando que 869 segundos são pouco mais de 14 minutos).

Criando usuário e organização

É necessário criar um usuário — a linha é única, só quebrei para facilitar a leitura:

$ sudo chef-server-ctl user-create giovanni \
  Giovanni Nunes \
  giovanni@localhost \
  senha12345 \
  --filename /opt/opscode/keys/giovanni.pem

O que estou fazendo é criar um usuário com o seguinte:

  • Login → giovanni
  • Nome do usuário → Giovanni Nunes
  • Endereço de e-mail → giovanni@localhost
  • Senha (de altíssima complexidade) → senha12345

A chave será gerada automaticamente e colocada no diretório “/opt/opscode/keys” — ele é uma invenção minha já que não existe um critério sobre onde armazenar das chaves, no meu caso preferi deixá-las dentro da estrutura da ferramenta mesmo.

Com o usuário inserido, é a vez de criar uma organização e, também aqui, deixei as linhas quebradas são para melhorar a legibilidade:

$ sudo chef-server-ctl org-create giovannireisnunes \
  "Giovanni dos Reis Nunes" \
  --association_user giovanni \
  --filename /opt/opscode/keys/giovannireisnunes-validator.pem

Estou criando a organização chamada “Giovanni dos Reis Nunes” — inspiração zero 🙂 —  e colocando nela o usuário “giovanni”. Asim como na ação anterior a criação da chave é automática e valem as mesmas considerações.

Instalando o Chef Manage

Também é “legal” incluir o console de gerenciamento web da ferramenta, o Chef Manage:

$ sudo chef-server-ctl install opscode-manage

Após a instalação o Chef Server, precisará ser novamente reconfigurado:

$ sudo chef-server-ctl reconfigure
...
Chef Client finished, 31/441 resources updated in 133.405831639 seconds
Chef Server Reconfigured!

Depois será a vez de reconfigurar também o Chef Manage:

$ sudo opscode-manage-ctl reconfigure
...
Chef Client finished, 74/80 resources updated in 218.493608585 seconds
opscode-manage Reconfigured!

Aliás, percebam que o Chef usa a si próprio para fazer os ajustes.

Terminadas as etapas basta abrir o navegador e acessá-lo diretamente via HTTP — e ele direcionará automaticamente para HTTPS — usando o IP (ou nome) do host:

chef-3_login

Daí é usar o usuário e senha criados antes para o acesso — por padrão este sujeito é também o administrador — se bem que ainda não há muito para ver. Mas antes de fechar a janela há algo a ser feito!

Baixando o Starter Kit

Na aba “Administration“, clique em “Organizations“, selecione sua organização — no meu caso a “giovannireisnunes” –, clique em “Starter Kit“, depois no botão “Download Starter Kit” e salve este arquivo, o “chef-starter.zip”.

chef-3_starterkit

O que este arquivo contém? Ele possui um esqueleto de repositório do Chef (“chef-repo”) já devidamente configurado para usar este Chef Server com esta organização e usuário.

.
└── chef-repo
    ├── .chef
    │   ├── giovanni.pem
    │   ├── giovannireisnunes-validator.pem
    │   └── knife.rb
    ├── cookbooks
    │   ├── chefignore
    │   └── starter
    │       ├── attributes
    │       │   └── default.rb
    │       ├── files
    │       │   └── default
    │       │       └── sample.txt
    │       ├── metadata.rb
    │       ├── recipes
    │       │   └── default.rb
    │       └── templates
    │           └── default
    │               └── sample.erb
    ├── .gitignore
    ├── README.md
    └── roles
        └── starter.rb

Aliás este procedimento também é realizado quando você assina o serviço e, em tese, é meio como a coisa que deveríamos ter feito primeiro. 🙂

Alterando minha receita

Primeiro, para ajudar a compreender esta etapa, vale lembrar que até o momento existem dois hosts:

  • chef (192.168.0.9) — Aqui está instalado o Chef DK e é onde foi montado aquele cookbook que instala o Apache.
  • chefserver (192.168.0.10) –Com o Chef Server, o que acabou de ser instalado.

Para aplicar o cookbook, providenciei outros dois sujeitos:

  • ubuntu (192.168.0.3) — Uma instalação nova de Ubuntu Server 15.04 configurada para o SSH e sudo não pedirem senha.
  • centos (192.168.0.7) — Uma instalação nova de CentOS 7 também configurada para SSH e sudo sem senha.

Agora um pequeno detalhe: as distribuições Linux podem empacotar um mesmo programa com nomes distintos. E é o que acontece no caso do Apache que é o “apache2” nas baseadas em Debian e o “httpd” naquelas baseadas em Red Hat.

Portanto esta simpática diferença precisa ser “explicada” de alguma forma ao Chef:

Primeiro verifico qual é a plataforma onde a receita está sendo executada, sendo CentOS, Fedora ou RHEL (esqueci alguém?) instalo o pacote “httpd” (no registro do serviço tem uma pequena diferença também) e incluo no firewall uma regra para liberar acessos externo para a porta 80/tcp. Sendo Debian ou Ubuntu continuo usando a parte original e o resto é Ruby.

Duas considerações:

  • um erro de lógica aqui  pois se a distribuição não for CentOS, Debian, Fedora, RHEL ou Ubuntu ele não instalará o Apache, tenho ciência da barbeiragem.
  • Não precisa ficar assim feio, os trechos específicos de cada distribuição poderiam estar em arquivos separados e chamados com “include_recipe” mas preferi deixar tudo em um arquivo só.

Juntando tudo

Transferi o arquivo “chef-starter.zip” para o host chef, renomeei o “chef-repo” que já estava lá, descompactei o zip e coloquei o cookbook “instalar_apache2” no local correto, dentro de “./chef-repo/cookbooks”.

Já que mexi na receita, aproveitei para alterar a versão deste cookbook no arquivo “metadata.rb”:

name 'instalar_apache2'
maintainer 'Giovanni Nunes'
maintainer_email 'giovanni@localhost'
license 'gplv3'
description 'Installs/Configures instalar_apache2'
long_description 'Installs/Configures instalar_apache2'
version '1.0.0'

Agora envio este cookbook para o Chef Server usando o comando knife (toda a interface com o servidor é feita através deste comando):

~/chef-repo$ knife cookbook upload instalar_apache2 
Uploading instalar_apache2 [1.0.0]
Uploaded 1 cookbook.

Claro, o knife agradece (muito) se você executá-lo dentro do diretório “~/chef-repo”, é onde ele sabe que encontrará seus arquivos de configuração.

Para verificar se o cookbook foi corretamente enviado (e também mostrar que eu subi outras versões):

chef-3_cookbook_1.0.0

Também é possível fazê-lo pelo console:

~/chef-repo$ knife cookbook list
instalar_apache2   1.0.0

Finalmente, é o momento de mandar o Chef preparar “duas porções” de Apache! 🙂

A começar pelo Ubuntu:

~/chef-repo$ knife bootstrap 192.168.0.3 --ssh-user giovanni \
  --sudo --node-name ubuntu1 \
  --run-list 'recipe[instalar_apache2]'
Connecting to 192.168.0.3
192.168.0.3 -----> Existing Chef installation detected
192.168.0.3 Starting first Chef Client run...
192.168.0.3 Starting Chef Client, version 12.5.1
192.168.0.3 resolving cookbooks for run list: ["instalar_apache2"
...

Detalhe, o cliente da ferramenta — Chef Client — é automaticamente instalado durante o primeiro acesso, no caso do Ubuntu ele já estava instalado pois já tinha rodado o “knife bootstrap” nele — as coisas precisam ser testadas.

No CentOS será a primeira vez e veja só o que acontece:

~/chef-repo$ knife bootstrap 192.168.0.7 --ssh-user giovanni \
  --sudo --node-name centos1 \
  --run-list 'recipe[instalar_apache2]'
Connecting to 192.168.0.7
192.168.0.7 -----> Installing Chef Omnibus (-v 12)
192.168.0.7 downloading https://www.opscode.com/chef/install.sh
192.168.0.7   to file /tmp/install.sh.21566/install.sh
192.168.0.7 trying curl...
192.168.0.7 Downloading Chef 12 for el...
192.168.0.7 downloading https://www.opscode.com/chef/metadata?v=12&
            prerelease=false&nightlies=false&p=el&pv=7&m=x86_64
(...)

Ele mesmo se encarregará de instalar o cliente do Chef caso seja necessário. O resultado final, claro, serã dois hosts com o Apache devidamente instalado e com páginas iniciais idênticas 🙂

Agora ambos aparecem na lista de nós do Chef Server:

chef-3_nodes

Legal, não?

E para terminar

Aqui encerro esta primeira introdução sobre o Chef englobando criação de receitas, disponibilização em um repositório central com o Chef Server e o uso deste para instalação e configuração automática de hosts. Por ser um assunto extenso, espero ter conseguido ser suficientemente didático no texto e nos exemplos utilizados e, assim que possível, retornarei outra vez a este assunto.

Anúncios

5 comentários sobre “Usando o Chef, parte 3

  1. Pingback: Usando o Chef, parte 3 - Peguei do

  2. Pingback: Troca da senha pelo Chef Manage | giovannireisnunes

  3. Amigo na hora de rodar o Bootstrap esta dando erro de ssl sabe como resolver?

    Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
    Please provide the contents of the stacktrace.out file if you file a bug report
    ERROR: SSL Error connecting to https://vmux1-045app/organizations
    FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s