O Chef nasceu como uma ferramenta DevOps para versionamento e gerenciamento de infraestrutura, escrito em Ruby e Erlang. Hoje em dia a empresa (que também chama Chef) se propõe a criar uma automação geral de TI, inclusive com deploy de código para integração contínua e outras ferramentas.
Nesse artigo falaremos apenas da parte de versionamento de infraestrutura e para isso utilizaremos o chef server e o chef client.
Caso queira se aprofundar e saber sobre os demais produtos: https://www.chef.io/
O Chef é suportado por uma grande quantidade de plataformas (FreeBSD, OS X, Solaris, Windows, Ubuntu, etc) e pode ser integrado com plataformas cloud-baed como Rackspace, google cloud, AWS, Azure.
Com ele você consegue criar e manter a configuração de diversos ambientes de forma flexível e dinâmica. A instalação e configuração dos softwares é feita via script e com isso você consegue recriar um servidor, criar um espelho, ambientes de homologação ou qualquer outro de forma muito fácil e rápida.
Os scripts são escritos em Ruby e ele utiliza o conceito de cookbooks e recipes para controle.
Conceitos principais:
cookbook: é um agregador de receitas. Quando você vai configurar um servidor, você faz através do cookbook
recipe: é um módulo de configuração, por exemplo se você quiser instalar e configurar o Apache no servidor, você pode criar uma recipe específica para isso
node: é o server que você quer configurar e manter
chef server: é onde os cookbooks e recipes ficam armazenadas para serem enviadas ao node. A comunicação é sempre entre o Chef Server e o node. Podemos usar um server próprio ou utilizar o hosted Chef (https://manage.chef.io/)
workstation: é a máquina onde você faz a manutenção dos scripts. Após a manutenção você envia a cópia atualizada para o Chef Server
Chef Supermarket: existe uma série de scrits prontos, que estão hospedados no Chef Supermarket. Você pode referenciá-los e utilizar suas funcionalidades facilmente
Como exercício prático mostrarei a configuração de um server com IIS e SQL server, e a publicação de um site utilizando um projeto .NET disponibilizado pelo próprio Chef.
Configuração inicial
Chef Server
Utilizaremos o free trial do hosted chef, se cadastrando em https://manage.chef.io/ e criando uma organização inicial para os testes
Node
Server com o Windows Server 2012 R2, instalado localmente e sem instalação de IIS ou SQL server.
Liberar as portas 5985, 5986 (WinRM), 3389 (RDP), 80 (HTTP) e 443 (HTTPS)
Workstation
Instalar Chef DK (https://downloads.chef.io/chef-dk/) e um editor de texto a sua escolha.
Para execução dos scripts utilizaremos o Poweshell
Vincular workstation com Chef Server
– Fazer download do starter kit no console do Chef Server (Administration -> Select Organization -> Left side menu Starter Kit)
– Descompactar na workstation, no diretório de trabalho escolhido. Será criada a pasta chef-repo, com as credenciais de acesso.
Criar repositório
– Via powershell, entrar no diretório de trabalho e executar o comando: chef generate repo ./chef-repo
Gerar cookbook e fazer upload para o chef server
– Executar comando para criação do cookbook, dentro da pasta chef-repo: chef generate cookbook cookbooks/list_customers
– Instalar knife windows plugin: chef gem install knife-windows
– Fazer upload do cookbook pro chef server: knife cookbook upload list_customers
Bootstrap node
O processo de bootstrap do node cria o vínculo entre o node e o Chef Server, além de enviar a versão inicial do cookbook. Executar o comando abaixo:
knife bootstrap windows winrm ADDRESS —-winrm-user USER —-winrm-password ‘PASSWORD’ —-node-name web_app_windows —-run-list ‘recipe[list_customers]’
Onde ADDRESS é o IP do node, USER/PASSWORD são as credenciais de um usuário com privilégios de admin e web_app_windows é o nome que você quer dar para o node
Com a execução desse comando será feito o upload do cookbook list_customers. Como ele está vazio, será apenas feito o vínculo com o node.
Criação e configuração das receitas (recipes)
Criaremos uma receita para controlar a instalação e configuração do IIS e outra receita para o SQL Server.
– Vamos utilizar os cookbooks sql_server e iis do Chef Supermarket, incluindo a referencia no metadata.rb (\chef-repo\cookbooks\list_customers\metadata.rb)
depends ‘sql_server’, ‘~> 2.4.0’
depends ‘iis’, ‘~> 4.1.1’
Seu metadata.rb deve ficar como o abaixo:
– Criar recipe webserver: chef generate recipe cookbooks/list_customers webserver
– Criar recipe database: chef generate recipe cookbooks/list_customers database
– Criar um arquivo de atributos para a instalação do SQL. Com um arquivo de atributos você pode sobrescrever os atributos da instalação padrão. Nesse caso a instalação do SQL utilizará esse arquivo para substituir as chaves do arquivo principal de atributos.
chef generate attribute cookbooks/list_customers default
– Criar script para criação do banco de dados: chef generate file cookbooks/list_customers create-database.sql
– Criar script para permissão no banco de dados: chef generate file cookbooks/list_customers grant-access.sql
Agora vamos sobrescrever o conteúdo dos arquivos criados com os scripts prontos. Dentro de cada script existem comentários sobre as ações.
Vale a pena entender cada ação. Download Scripts
A receita default.rb (list_customers/recipes/default.rb) controla a execução do cookbook, vamos adicionar nessa receita as chamadas para as receitas criadas
include_recipe ‘list_customers::webserver’
include_recipe ‘list_customers::database’
Com esses passos temos o nosso cookbook totalmente configurado, agora temos que atualizarmos no Chef Server e aplicá-lo no node.
Sempre que queremos atualizar o cookbook no Chef Server temos que alterar a versão no metadata.rb.
Como agora o nosso cookbook tem algumas referências e dependências, vamos utilizar o Berkshelf para atualização local e subida para o Chef Server.
Executar os comandos:
berks install (fará o download de todas as dependências para a workstation)
berks upload (subirá a última versão do cookbook já com os pacotes das dependências)
No console do Chef Server podemos verificar todos os cookbooks e recipes, na opção Policy.
A última etapa é a aplicação no node, para isso podemos fazer via winrm ou via chef-client, diretamente no node. Como o winrm requer algumas permissões adicionais para efetuar algumas instalações, utilizaremos o chef-client.
Acesse o node via RDP e via powershell (acessar powershell como administrador) execute o comando .\chef-client na pasta c:\opscode\chef\bin
Se tudo correr bem, ao final do processo o seu servidor estará configurado com IIS, SQL Server e com o site para apresentação dos registros do BD:
http://seuip/products/customers.aspx