Instalação do chef server, chef worstation, instalação do chef client via bootstrap e criação do primeiro cookbook

Chef-Logo

1. Introdução

Bom, comecei a brincar com o Chef, estou achando bem interessante, tem um monte de features que quero explorar, principalmente o fluxo de Integração contínua, delivery e pipeline com Chef.

O Chef tem uma ferramenta de administração muito legal, se chama Knife, e é uma mão na roda, toda administração de nodes e cookbooks se faz através do Knife.

Achei interessante a boa quantidade de plugins para aumentar a extensão de funcionalidades do Chef, como por exemplo plugins para a gerencia e criação de instâncias nos maiores provedores de Cloud como Amazon EC2, Azure, Google CE, Rackspace, Digital Ocean, e também plugins para virtualização como Xen e Vmware-vsphere. Também tem plugin para o Docker.

Confesso que estou bastante empolgado com o Chef.

Neste tutorial vou compartilhar algumas coisas que fiz, então vamos instalar o Chef Server, Workstation “ChefDK”, configurar alguns nodes, e a criação de um cookbook/receita.

Para quem não sabe, de forma bem resumida, o Chef é um gerenciador de configurações e automação. Com ele é possível automatizar tarefas repetitivas, como deploys de novos servidores, instalação de pacotes e aplicações, execução de comandos, padronização de arquivos e configurações e orquestração de clientes. Através da orquestração você consegue executar tarefas e comandos em clientes. Os clientes serão referenciados como nodes.

Vamos conhecer alguns componentes do Chef
Chef Server → O Chef Server é core da infraestrutura de gerenciamento e automação, é nele que serão armazenados os cookbooks e receitas, assim como a comunicação e aplicação de receitas nos nodes.

Chef Client → Cada node precisa ter um cliente do Chef instalado; e este vai falar com o Chef Server, procurar por cookbooks e aplicá-los nos nodes.

Workstation → Workstation são os clientes administrativos do Chef Server.
Um Workstation pode ser seu próprio desktop, ou uma vm dedicada apenas para isto. É através do Workstation que criaremos nossos cookbooks e receitas e enviaremos para o Chef Server. Toda interação com o Chef Server será através do Workstation. Diferente de outros gerenciadores de configuração como Puppet e Ansible, da qual você se loga no servidor central (Puppet e Ansible) e faz as configurações diretamente no servidor, no Chef esta interação acontece da seguinte forma: Workstation → Chef Server.

Geralmente é um Workstation por administrador, cada integrante da equipe que vai trabalhar gerenciando o Chef pode ter seu próprio cliente workstation. Sua equipe tem 10 Sysadmins/Devops? Então você terá que ter 10 workstations, a não ser que queira dividir sua máquina com outras pessoas ;).

Nodes → Nodes são os clientes que receberão as configurações e automação. Neste caso são seus servidores, talvez desktops que você queira gerenciar as configurações, sua infra na nuvem, enfim, qualquer equipamento que você queira gerenciar.

Cookbook e Recipes → Cookbook e Receitas são as configurações que serão aplicadas nos nodes. Os cookbooks e receitas serão criadas nas máquinas de Workstation e enviadas para o Chef Server. Uma vez no Chef Server, as receitas serão enviadas e aplicadas nos nodes, sendo assim quando você quiser automatizar algum recurso nos nodes, você vai criar um cookbook com uma receita.
Exemplo: Vou criar um cookbook Pacotes, e dentro deste cookbook Pacotes, eu vou escrever uma receita, por exemplo install-mysql.rb, e dentro desta receita vou criar os passos necessários para instalar o mysql nos nodes.
Sendo assim eu tenho um cookbook chamado “Pacote”, e uma receita de instalação chamada “install-mysql.rb”.

Knife → É o command-line “CLI” tool do Chef, é com ele que você vai interagir com o Chef Server.

2. Pré-requisitos e infraestrutura

Chef-Infra
Dê uma olhada neste link para saber o quanto de memória, CPU, disco e etc para sua infraestrutura.
https://docs.chef.io/chef_system_requirements.html

Sistema Operacional:
Ubuntu 14.04 x86_64 – instalação mínima.

Versões utilizadas neste tutorial:
Chef server – 12.6.0-1
Chef DK – 0.14.25-1
Chef client – 12.10.24-1

Hostname
Todos os nodes precisam estar configurados com o correto FQDN.

# cat /etc/hosts | grep chef
10.0.2.40	chef-server-01.devopslab.com.br	chef-server-01

# cat /etc/hostname 
chef-server-01 

# hostname
chef-server-01

# hostname -d
devopslab.com.br

# hostname -f
chef-server-01.devopslab.com.br

Hosts
Chef Server
chef-server-01.devopslab.com.br

Chef Workstation
chef-workstation-01.devopslab.com.br

Chef nodes
chef-client-01.devopslab.com.br
chef-client-02.devopslab.com.br
chef-client-03.devopslab.com.br

3. Preparação do ambiente – Instalação do repositório apt

Os repositórios serão instalados tanto no chef-server como no chef workstation.

Ative o apt-get para poder buscar pacotes em urls https.

# apt-get install apt-transport-https

Adicione a Chave pública do Chef.

# wget -qO - https://downloads.chef.io/packages-chef-io-public.key | sudo apt-key add -

Crie um repositório Apt.

#cd /etc/apt/sources.list.d/
# echo "deb https://packages.chef.io/<CHANNEL>-apt <DISTRIBUTION> main" > chef-<CHANNEL>.list

Onde:
Substitua o CHANNEL por stable.
E DISTRIBUTION pelo o nome da sua distribuição Debian/Ubuntu.
Debian 6: squeeze
Debian 7: wheezy
For Debian 8: jessie
For Ubuntu 10.04: lucid
For Ubuntu 12.04: precise
For Ubuntu 14.04: trusty

# echo "deb https://packages.chef.io/stable-apt trusty main" > chef-stable.list

# cat chef-stable.list 
deb https://packages.chef.io/stable-apt trusty main

Atualize o cache do apt-get.

# apt-get update

4. Chef Server – Instalação do Servidor Chef – Chef Server

Antes da instalação verifique o hostname.

# hostname -f
chef-server-01.devopslab.com.br

# hostname
chef-server-01

Para prosseguir você precisa ter os repositórios instalados, coisa que já foi feito em um passo anterior.

# apt-get update
# apt-get install chef-server-core

Instalação de todos os serviços do Chef.

# chef-server-ctl reconfigure

Vai demorar alguns minutos, pois serão instalados vários componentes, como PostgreSQL, Redis, Nginx, RabbitMQ, Solr e Chef Server. O resultado será algo parecido como este:

Recipe: private-chef::partybus
  * execute[set initial migration level] action run
    - execute cd /opt/opscode/embedded/service/partybus && ./bin/partybus init
  * ruby_block[migration-level file sanity check] action run (skipped due to not_if)
Recipe: private-chef::opscode-chef-mover
  * execute[restart_opscode-chef-mover_log_service] action run
    - execute /opt/opscode/embedded/bin/sv restart /opt/opscode/sv/opscode-chef-mover/log
Recipe: private-chef::redis_lb
  * execute[restart_redis_lb_log_service] action run
    - execute /opt/opscode/embedded/bin/sv restart /opt/opscode/sv/redis_lb/log
Recipe: private-chef::nginx
  * execute[restart_nginx_log_service] action run
    - execute /opt/opscode/embedded/bin/sv restart /opt/opscode/sv/nginx/log

Running handlers:
Running handlers complete

Deprecated features used!
  An attempt was made to change sysvinit_id from "SV" to nil by calling sysvinit_id(nil). In Chef 12, this does a get rather than a set. In Chef 13, this will change to set the value to nil. at 1 location:
    - /var/opt/opscode/local-mode-cache/cookbooks/enterprise/recipes/runit.rb:31:in `block in from_file'

Chef Client finished, 394/461 resources updated in 05 minutes 47 seconds
Chef Server Reconfigured!

4.1. Criação de um usuário administrativo do Chef e uma organização

Você pode criar quantos usuários forem necessários. Este usuário será utilizado no chef workstation que vamos configurar depois deste passo.

Organização geralmente é um por empresa, mas nada te impede de criar mais.

Usuário
Sintaxe:
chef-server-ctl user-create NOME_USUARIO PRIMEIRO_NOME ULTIMO_NOME EMAIL ‘SENHA’ –filename USUARIO_CHAVE

# mkdir /root/.chef
# chef-server-ctl user-create adminleonardo Leonardo Admin leonardo@devopslab.com.br 'senha12345' --filename /root/.chef/adminleonardo.pem

Organização
Sintaxe:
chef-server-ctl org-create short_name ‘full_organization_name’ –association_user user_name –filename ORGANIZACAO-CHAVE.pem

# chef-server-ctl org-create devopslab 'DevOpsLab Technology ltda.' --association_user adminleonardo --filename /root/.chef/orgdevopslab.pem

Verificando o status do Chef Server.

root@chef-server-01:/# chef-server-ctl status
run: bookshelf: (pid 866) 1475s; run: log: (pid 842) 1475s
run: nginx: (pid 864) 1475s; run: log: (pid 840) 1475s
run: oc_bifrost: (pid 877) 1475s; run: log: (pid 876) 1475s
run: oc_id: (pid 862) 1475s; run: log: (pid 835) 1475s
run: opscode-erchef: (pid 863) 1475s; run: log: (pid 836) 1475s
run: opscode-expander: (pid 871) 1475s; run: log: (pid 868) 1475s
run: opscode-solr4: (pid 865) 1475s; run: log: (pid 843) 1475s
run: postgresql: (pid 872) 1475s; run: log: (pid 833) 1475s
run: rabbitmq: (pid 875) 1475s; run: log: (pid 869) 1475s
run: redis_lb: (pid 870) 1475s; run: log: (pid 839) 1475s

Sucesso!!!.

5. Chef Workstation – Instalação Chef Workstation

Instale o repositório do Chef.
O Workstation provavelmente será o seu próprio Desktop ou uma máquina virtual pequena, fica a seu critério.
Eu vou utilizar uma VM em Virtualbox só para ser meu chef workstation.

Instalação do Chef Development Kit.

# apt-get install chefdk

Verificação de todos os componentes instalados.

root@chef-workstation-01:~# chef verify
Running verification for component 'berkshelf'
Running verification for component 'test-kitchen'
Running verification for component 'tk-policyfile-provisioner'
Running verification for component 'chef-client'
Running verification for component 'chef-dk'
Running verification for component 'chef-provisioning'
Running verification for component 'chefspec'
Running verification for component 'generated-cookbooks-pass-chefspec'
Running verification for component 'rubocop'
Running verification for component 'fauxhai'
Running verification for component 'knife-spork'
Running verification for component 'kitchen-vagrant'
Running verification for component 'package installation'
Running verification for component 'openssl'
Running verification for component 'inspec'
Running verification for component 'delivery-cli'
Running verification for component 'git'
Running verification for component 'opscode-pushy-client'
Running verification for component 'chef-sugar'
Running verification for component 'knife-supermarket'
.................................................................................
Verification of component 'fauxhai' succeeded.
Verification of component 'kitchen-vagrant' succeeded.
Verification of component 'openssl' succeeded.
Verification of component 'delivery-cli' succeeded.
Verification of component 'inspec' succeeded.
Verification of component 'knife-supermarket' succeeded.
Verification of component 'berkshelf' succeeded.
Verification of component 'git' succeeded.
Verification of component 'opscode-pushy-client' succeeded.
Verification of component 'test-kitchen' succeeded.
Verification of component 'knife-spork' succeeded.
Verification of component 'chef-sugar' succeeded.
Verification of component 'tk-policyfile-provisioner' succeeded.
Verification of component 'chefspec' succeeded.
Verification of component 'generated-cookbooks-pass-chefspec' succeeded.
Verification of component 'rubocop' succeeded.
Verification of component 'package installation' succeeded.
Verification of component 'chef-client' succeeded.
Verification of component 'chef-dk' succeeded.
Verification of component 'chef-provisioning' succeeded.

Criação de um repositório para o Chef
Crie um repositório Chef, que será seu diretório de trabalho, pois serão armazenados todas as suas receitas do Chef (cookbooks).

# chef generate repo chef-repo

Configuração do Knife
Knife é uma ferramenta que faz uma interface entre o seu repositório local “chef-repo” e o Chef Server.
Quando você cria uma nova receita “cookbook”, você vai utilizar o Knife para jogar a configuração para o Chef Server.

Crie o diretório .chef.

# mkdir -p ~/chef-repo/.chef

Copie as 2 chaves que foi criada na instalação do Chef Server para a pasta .chef.
Lembra desta 2 chaves? Uma chave foi criada para a organização e uma para o usuário admin do Chef.

Chaves:
Admin: adminleonardo.pem
Organization: orgdevopslab.pem

root@chef-workstation-01:~# scp root@chef-server-01:/root/.chef/*.pem /root/chef-repo/.chef/
root@chef-server-01's password: 
adminleonardo.pem                                                                                                                                           100% 1678     1.6KB/s   00:00    
orgdevopslab.pem 100% 1674     1.6KB/s   00:00   

root@chef-workstation-01:~# ls /root/chef-repo/.chef
adminleonardo.pem  orgdevopslab.pem

Criação do arquivo knife.rb.
# cd /root/chef-repo/.chef
# knife configure

# knife configure
WARNING: No knife configuration file found
Where should I put the config file? [/root/.chef/knife.rb] /root/chef-repo/.chef/knife.rb        
Please enter the chef server URL: [https://chef-workstation-01:443] https://chef-server-01/organizations/devopslab
Please enter an existing username or clientname for the API: [leonardo] adminleonardo
Please enter the validation clientname: [chef-validator] devopslab-validator
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] /root/chef-repo/.chef/orgdevopslab.pem
Please enter the path to a chef repository (or leave blank): /root/chef-repo 
*****

You must place your client key in:
  /root/chef-repo/.chef/adminleonardo.pem
Before running commands with Knife

*****

You must place your validation key in:
  /root/chef-repo/.chef/orgdevopslab.pem
Before generating instance data with Knife

*****
Configuration file written to /root/chef-repo/.chef/knife.rb

Vou explicar cada linha.
1.
Where should I put the config file? [/root/.chef/knife.rb] /root/chef-repo/.chef/knife.rb
Aqui é a localização do arquivo knife.rb.

2.
Please enter the chef server URL: [https://chef-workstation-01:443] https://chef-server-01/organizations/devopslab

Url do Chef Server + organização. Para verificar esta url, faça o login no Chef Server e rode o comando:
chef-server-ctl org-show

# chef-server-ctl org-show
devopslab: https://127.0.0.1/organizations/devopslab

Substitua o 127.0.0.1 pelo nome fqdn no seu servidor Chef.

3.
Please enter an existing username or clientname for the API: [leonardo] adminleonardo

Aqui você coloca o usuário criado na instalação do Chef Server, no meu caso é o usuário “adminleonardo”. Substitua pelo usuário que você definiu na instalação.

4.
Please enter the validation clientname: [chef-validator] devopslab-validator

Aqui é um nome para identificar o Chef Server, definido ao seu critério. Eu sugiro algo como
ORGNIZATION-NAME-validator.

5.
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] /root/chef-repo/.chef/orgdevopslab.pem

Nesta linha é definido o caminho da chave criada para a organização. Esta chave foi criada na instalação do Chef Server, e no meu caso é a chave: “orgdevopslab.pem”.

6.
Please enter the path to a chef repository (or leave blank): /root/chef-repo

Simplesmente Informe a localização do seu repositório; que foi criado logo acima em “chef generate repo chef-repo”.

knife.rb completo.

# cat knife.rb
log_level                :info
log_location             STDOUT
node_name                'adminleonardo'
client_key               '/root/chef-repo/.chef/adminleonardo.pem'
validation_client_name   'devopslab-validator'
validation_key           '/root/chef-repo/.chef/orgdevopslab.pem'
chef_server_url          'https://chef-server-01/organizations/devopslab'
syntax_check_cache_path  '/root/chef-repo/.chef/syntax_check_cache'
cookbook_path [ '/root/chef-repo/cookbooks' ]

Importando o certificado SSL do Chef Server.
Você precisa estabelecer uma relação de confiança com o Chef Server importando o certificado SSL do mesmo.

# knife ssl fetch

root@chef-workstation-01:~/chef-repo# cd /root/chef-repo
root@chef-workstation-01:~/chef-repo# knife ssl fetch
WARNING: Certificates from chef-server-01 will be fetched and placed in your trusted_cert
directory (/root/chef-repo/.chef/trusted_certs).

Knife has no means to verify these are the correct certificates. You should
verify the authenticity of these certificates after downloading.

Adding certificate for chef-server-01 in /root/chef-repo/.chef/trusted_certs/chef-server-01.crt

Validação
Para validar a comunicação com o Chef Server execute o comando “knife client list”.

root@chef-workstation-01:~/chef-repo# knife client list
devopslab-validator

5.1. Ruby

Ao instalar o ChefDK, será instalado um versão do Ruby, no entando este Ruby não estará no PATH dos usuários, ou seja você não vai conseguir utilizar.

Sendo assim, configure a variável $PATH da Workstation de forma que o Ruby possa ser encontrado. Então logue na Workstation, com o usuário que vai administar o chef (knife e etc) e execute:

# echo ‘eval “$(chef shell-init bash)”‘ >> ~/.bash_profile
# source ~/.bash_profile

Para verificar se esta tudo ok faça:
# which ruby
/opt/chefdk/embedded/bin/ruby

O Ruby está mapeado no PATH.

5.2. Definindo um Editor

Ao editar cookbooks, recieitas, e outras configurações do Chef, será necessário ter um editor de texto definido.
Aí você escolhe o que você preferir, eu gosto do Vim.
# export EDITOR=’vim’

Ser for um nano
# export EDITOR=’nano’

6. Chef-client bootstrap – Instalação do cliente chef via bootstrap

Nossos clientes, ou seja todos os servidores, desktops, e qualquer máquina que será gerenciada pelo Chef-server será tratada como Nodes.

Chef-client é o agente que será instalado nos Nodes para fazer a comunicação com o Chef-Server. Todos os Nodes precisam ter um Chef-client instalado.

Vamos fazer uma instalação do Chef-client remotamente, via Bootstrap, ou seja, o próprio Chef vai fazer a instalação dos clientes nos Nodes.

A ferramenta que vai disparar o bootstrap é o Knife, que acabamos de configurar.
O Knife utiliza o SSH para fazer a instalação do Chef-client nos Nodes.
Você precisa ter um usuário com permissões de sudo.

Pode ser usado tanto SSH com senha ou SSH com chave de identificação para fazer a autenticação nos Nodes, tudo depende de como você utiliza o SSH na sua infraestrutura.

6.1. Instalação do Chef-client em um Ubuntu-Server-14.04 – Bootstrap chef client em Ubuntu 14

Vamos fazer a instalação do Chef-client no Ubuntu-Server-14.04 utilizando um usuário e senha com permissões de sudo.

Comando:
#knife bootstrap 192.168.0.21 -x username -P password –sudo
#knife bootstrap chef-client-02.devopslab.com.br -x meu_usuario -P minha_senha –sudo

# root@chef-workstation-01:~# cd chef-repo/

root@chef-workstation-01:~/chef-repo# knife bootstrap chef-client-02.devopslab.com.br -x meu_usuario -P minha_senha --sudo
Doing old-style registration with the validation key at /root/chef-repo/.chef/orgdevopslab.pem...
Delete your validation key in order to use your user credentials instead

Connecting to chef-client-02.devopslab.com.br
chef-client-02.devopslab.com.br -----> Installing Chef Omnibus (-v 12)
chef-client-02.devopslab.com.br downloading https://omnitruck-direct.chef.io/chef/install.sh
chef-client-02.devopslab.com.br   to file /tmp/install.sh.1081/install.sh
chef-client-02.devopslab.com.br trying curl...
chef-client-02.devopslab.com.br ubuntu 14.04 x86_64
chef-client-02.devopslab.com.br Getting information for chef stable 12 for ubuntu...
chef-client-02.devopslab.com.br downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12&p=ubuntu&pv=14.04&m=x86_64
chef-client-02.devopslab.com.br   to file /tmp/install.sh.1086/metadata.txt
chef-client-02.devopslab.com.br trying curl...
chef-client-02.devopslab.com.br sha1	7d30b300f95f00036919ee8bf3b95ab73429e57e
chef-client-02.devopslab.com.br sha256	663d6c42c90bbb9463bc02a7c5d777f7aa6ebd52c071a0c1963bc8c4db76dea2
chef-client-02.devopslab.com.br url	https://packages.chef.io/stable/ubuntu/14.04/chef_12.10.24-1_amd64.deb
chef-client-02.devopslab.com.br version	12.10.24
chef-client-02.devopslab.com.br downloaded metadata file looks valid...
chef-client-02.devopslab.com.br downloading https://packages.chef.io/stable/ubuntu/14.04/chef_12.10.24-1_amd64.deb
chef-client-02.devopslab.com.br   to file /tmp/install.sh.1086/chef_12.10.24-1_amd64.deb
chef-client-02.devopslab.com.br trying curl...
chef-client-02.devopslab.com.br Comparing checksum with sha256sum...
chef-client-02.devopslab.com.br Installing chef 12
chef-client-02.devopslab.com.br installing with dpkg...
chef-client-02.devopslab.com.br Selecting previously unselected package chef.
(Reading database ... 57726 files and directories currently installed.)
chef-client-02.devopslab.com.br Preparing to unpack .../chef_12.10.24-1_amd64.deb ...
chef-client-02.devopslab.com.br Unpacking chef (12.10.24-1) ...
chef-client-02.devopslab.com.br Setting up chef (12.10.24-1) ...
chef-client-02.devopslab.com.br Thank you for installing Chef!
chef-client-02.devopslab.com.br Starting the first Chef Client run...
chef-client-02.devopslab.com.br Starting Chef Client, version 12.10.24
chef-client-02.devopslab.com.br Creating a new client identity for chef-client-02.devopslab.com.br using the validator key.
chef-client-02.devopslab.com.br resolving cookbooks for run list: []
chef-client-02.devopslab.com.br Synchronizing Cookbooks:
chef-client-02.devopslab.com.br Installing Cookbook Gems:
chef-client-02.devopslab.com.br Compiling Cookbooks...
chef-client-02.devopslab.com.br [2016-05-29T09:31:46-03:00] WARN: Node chef-client-02.devopslab.com.br has an empty run list.
chef-client-02.devopslab.com.br Converging 0 resources
chef-client-02.devopslab.com.br 
chef-client-02.devopslab.com.br Running handlers:
chef-client-02.devopslab.com.br Running handlers complete
chef-client-02.devopslab.com.br Chef Client finished, 0/0 resources updated in 03 seconds

Validando:
knife node list
knife client list

root@chef-workstation-01:~/chef-repo# knife node list
chef-client-02.devopslab.com.br

root@chef-workstation-01:~/chef-repo# knife client list
chef-client-02.devopslab.com.br
devopslab-validator

root@chef-workstation-01:~/chef-repo# 

Veja que o Chef detecta automaticamente qual Sistema operacional está sendo utilizado.

chef-client-02.devopslab.com.br ubuntu 14.04 x86_64
chef-client-02.devopslab.com.br Getting information for chef stable 12 for ubuntu...
chef-client-02.devopslab.com.br downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12&p=ubuntu&pv=14.04&m=x86_64

6.2. Instalação do Chef-client em um Centos 7 x86_64 – Bootstrap chef client em Centos 7

Vamos fazer a instalação do Chef-client no Centos 7 utilizando um usuário e senha com permissões de sudo.
# root@chef-workstation-01:~# cd chef-repo/
# knife bootstrap chef-client-03.devopslab.com.br -x meu_usuario -P minha_senha –sudo

root@chef-workstation-01:~/chef-repo# knife bootstrap chef-client-03.devopslab.com.br -x meu_usuario -P minha_senha --sudo
Doing old-style registration with the validation key at /root/chef-repo/.chef/orgdevopslab.pem...
Delete your validation key in order to use your user credentials instead

Connecting to chef-client-03.devopslab.com.br
chef-client-03.devopslab.com.br -----> Installing Chef Omnibus (-v 12)
chef-client-03.devopslab.com.br downloading https://omnitruck-direct.chef.io/chef/install.sh
chef-client-03.devopslab.com.br   to file /tmp/install.sh.3048/install.sh
chef-client-03.devopslab.com.br trying wget...
chef-client-03.devopslab.com.br el 7 x86_64
chef-client-03.devopslab.com.br Getting information for chef stable 12 for el...
chef-client-03.devopslab.com.br downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12&p=el&pv=7&m=x86_64
chef-client-03.devopslab.com.br   to file /tmp/install.sh.3053/metadata.txt
chef-client-03.devopslab.com.br trying wget...
chef-client-03.devopslab.com.br sha1	4def83368a1349959fdaf0633c4d288d5ae229ce
chef-client-03.devopslab.com.br sha256	6f00c7bdf96a3fb09494e51cd44f4c2e5696accd356fc6dc1175d49ad06fa39f
chef-client-03.devopslab.com.br url	https://packages.chef.io/stable/el/7/chef-12.10.24-1.el7.x86_64.rpm
chef-client-03.devopslab.com.br version	12.10.24
chef-client-03.devopslab.com.br downloaded metadata file looks valid...
chef-client-03.devopslab.com.br downloading https://packages.chef.io/stable/el/7/chef-12.10.24-1.el7.x86_64.rpm
chef-client-03.devopslab.com.br   to file /tmp/install.sh.3053/chef-12.10.24-1.el7.x86_64.rpm
chef-client-03.devopslab.com.br trying wget...
chef-client-03.devopslab.com.br Comparing checksum with sha256sum...
chef-client-03.devopslab.com.br Installing chef 12
chef-client-03.devopslab.com.br installing with rpm...
chef-client-03.devopslab.com.br warning: /tmp/install.sh.3053/chef-12.10.24-1.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
chef-client-03.devopslab.com.br Preparing...                          ################################# [100%]
chef-client-03.devopslab.com.br Updating / installing...
chef-client-03.devopslab.com.br    1:chef-12.10.24-1.el7              ################################# [100%]
chef-client-03.devopslab.com.br Thank you for installing Chef!
chef-client-03.devopslab.com.br Starting the first Chef Client run...
chef-client-03.devopslab.com.br Starting Chef Client, version 12.10.24
chef-client-03.devopslab.com.br Creating a new client identity for chef-client-03.devopslab.com.br using the validator key.
chef-client-03.devopslab.com.br resolving cookbooks for run list: []
chef-client-03.devopslab.com.br Synchronizing Cookbooks:
chef-client-03.devopslab.com.br Installing Cookbook Gems:
chef-client-03.devopslab.com.br Compiling Cookbooks...
chef-client-03.devopslab.com.br [2016-05-29T10:37:20-03:00] WARN: Node chef-client-03.devopslab.com.br has an empty run list.
chef-client-03.devopslab.com.br Converging 0 resources
chef-client-03.devopslab.com.br 
chef-client-03.devopslab.com.br Running handlers:
chef-client-03.devopslab.com.br Running handlers complete
chef-client-03.devopslab.com.br Chef Client finished, 0/0 resources updated in 03 seconds

Versão do Sistema Operacional detectada.

chef-client-03.devopslab.com.br el 7 x86_64
chef-client-03.devopslab.com.br Getting information for chef stable 12 for el...
chef-client-03.devopslab.com.br downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12&p=el&pv=7&m=x86_64

Verificando.

root@chef-workstation-01:~/chef-repo# knife node list
chef-client-02.devopslab.com.br
chef-client-03.devopslab.com.br

6.3. Instalação do Chef-client em um S.O AmazonAMI – Bootstrap chef client em AmazonAMI

Vou fazer uma instalação na Amazon, em uma instância do tipo AmazonAMI utilizando chaves de autenticação.

A instalação vai falhar pois eu preciso criar uma VPN entre a minha rede interna e a Amazon, para que a instância AmazonAMI se comunique com meu Chef-server.

Porém segue apenas uma demonstração de como seria a instalação na Amazon. Tudo funciona, menos a comunicação com meu Chef-server devido uma falta de VPN, mas se você já tiver a comunicação entre o Chef-Server e a rede da Amazon é um abraço meu amigo =)

A VPN não vou criar agora. Mas quando for fazer, como é minha rede interna, de casa, vou utilizar o OpenVPN mesmo.

Então segue uma demonstração de instalação do Chef-client na Amazon.
A única coisa que muda em relação as instalações anteriores é que ao invés de um usuário e senha, será passado a chave de autenticação na Amazon.

# knife bootstrap ec2-52-67-1-43.sa-east-1.compute.amazonaws.com -x ec2-user -i /root/AMAZON/amazonkey/AMAZON-KEY.pem –sudo

root@chef-workstation-01:~/chef-repo# knife bootstrap ec2-52-67-1-43.sa-east-1.compute.amazonaws.com -x ec2-user -i /root/AMAZON/amazonkey/AMAZON-KEY.pem --sudo
Doing old-style registration with the validation key at /root/chef-repo/.chef/orgdevopslab.pem...
Delete your validation key in order to use your user credentials instead

Connecting to ec2-52-67-1-43.sa-east-1.compute.amazonaws.com
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com -----> Installing Chef Omnibus (-v 12)
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com downloading https://omnitruck-direct.chef.io/chef/install.sh
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com   to file /tmp/install.sh.2672/install.sh
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com trying wget...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com el 6 x86_64
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Getting information for chef stable 12 for el...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12&p=el&pv=6&m=x86_64
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com   to file /tmp/install.sh.2687/metadata.txt
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com trying wget...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com sha1	faec4e0bc2cc236170b400426cd3b51b5657fe90
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com sha256	445b64e38827d8c787267bda57d2cd6be797b6f6f70eb34ec846eceee8f6fae9
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com url	https://packages.chef.io/stable/el/6/chef-12.10.24-1.el6.x86_64.rpm
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com version	12.10.24
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com downloaded metadata file looks valid...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com downloading https://packages.chef.io/stable/el/6/chef-12.10.24-1.el6.x86_64.rpm
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com   to file /tmp/install.sh.2687/chef-12.10.24-1.el6.x86_64.rpm
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com trying wget...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Comparing checksum with sha256sum...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Installing chef 12
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com installing with rpm...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com warning: /tmp/install.sh.2687/chef-12.10.24-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Permission denied)
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Installation failed
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Version: 12
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com 
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Please file a Bug Report at https://github.com/chef/omnitruck/issues/new
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Alternatively, feel free to open a Support Ticket at https://www.chef.io/support/tickets
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com More Chef support resources can be found at https://www.chef.io/support
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com 
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Please include as many details about the problem as possible i.e., how to reproduce
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com the problem (if possible), type of the Operating System and its version, etc.,
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com and any other relevant details that might help us with troubleshooting.
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com 
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com mkdir: cannot create directory ‘/etc/chef’: Permission denied
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com sh: line 179: /etc/chef/validation.pem: No such file or directory
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com chmod: cannot access ‘/etc/chef/validation.pem’: No such file or directory
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com sh: line 210: /etc/chef/encrypted_data_bag_secret: No such file or directory
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com chmod: cannot access ‘/etc/chef/encrypted_data_bag_secret’: No such file or directory
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com mkdir: cannot create directory ‘/etc/chef’: Permission denied
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com sh: line 216: /etc/chef/trusted_certs/chef-server-01.crt: No such file or directory
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com sh: line 245: /etc/chef/client.rb: No such file or directory
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com sh: line 255: /etc/chef/first-boot.json: No such file or directory
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Starting the first Chef Client run...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com sh: line 262: chef-client: command not found
root@chef-workstation-01:~/chef-repo# knife bootstrap ec2-52-67-1-43.sa-east-1.compute.amazonaws.com -x ec2-user -i /root/AMAZON/amazonkey/AMAZON-KEY.pem --sudo
Doing old-style registration with the validation key at /root/chef-repo/.chef/orgdevopslab.pem...
Delete your validation key in order to use your user credentials instead

Connecting to ec2-52-67-1-43.sa-east-1.compute.amazonaws.com
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com -----> Installing Chef Omnibus (-v 12)
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com downloading https://omnitruck-direct.chef.io/chef/install.sh
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com   to file /tmp/install.sh.2751/install.sh
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com trying wget...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com el 6 x86_64
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Getting information for chef stable 12 for el...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12&p=el&pv=6&m=x86_64
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com   to file /tmp/install.sh.2756/metadata.txt
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com trying wget...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com sha1	faec4e0bc2cc236170b400426cd3b51b5657fe90
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com sha256	445b64e38827d8c787267bda57d2cd6be797b6f6f70eb34ec846eceee8f6fae9
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com url	https://packages.chef.io/stable/el/6/chef-12.10.24-1.el6.x86_64.rpm
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com version	12.10.24
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com downloaded metadata file looks valid...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com downloading https://packages.chef.io/stable/el/6/chef-12.10.24-1.el6.x86_64.rpm
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com   to file /tmp/install.sh.2756/chef-12.10.24-1.el6.x86_64.rpm
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com trying wget...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Comparing checksum with sha256sum...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Installing chef 12
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com installing with rpm...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com warning: /tmp/install.sh.2756/chef-12.10.24-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Preparing...                          ################################# [100%]
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Updating / installing...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com    1:chef-12.10.24-1.el6              ################################# [100%]
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Thank you for installing Chef!
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Starting the first Chef Client run...
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Starting Chef Client, version 12.10.24
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Creating a new client identity for chefnode-amazonami-01 using the validator key.
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com [2016-05-29T13:58:02+00:00] ERROR: Error connecting to https://chef-server-01/organizations/devopslab/clients, retry 1/5
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com [2016-05-29T13:58:07+00:00] ERROR: Error connecting to https://chef-server-01/organizations/devopslab/clients, retry 2/5
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com [2016-05-29T13:58:12+00:00] ERROR: Error connecting to https://chef-server-01/organizations/devopslab/clients, retry 3/5
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com [2016-05-29T13:58:17+00:00] ERROR: Error connecting to https://chef-server-01/organizations/devopslab/clients, retry 4/5
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com [2016-05-29T13:58:22+00:00] ERROR: Error connecting to https://chef-server-01/organizations/devopslab/clients, retry 5/5
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com 
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com ================================================================================
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com Chef encountered an error attempting to create the client "chefnode-amazonami-01"
ec2-52-67-1-43.sa-east-1.compute.amazonaws.com ================================================================================

6.4. Instalação do Chef-client em um Ubuntu-Server-14.04 – Bootstrap chef client no Ubuntu 14 com Chef + SSH Keys

Vamos fazer a instalação do Chef-client no Ubuntu-Server-14.04 utilizando chave de autenticação SSH.

root@chef-workstation-01:~/chef-repo# knife bootstrap chef-client-01.devopslab.com.br -x leonardo -i ~/.ssh/id_rsa --sudo
Doing old-style registration with the validation key at /root/chef-repo/.chef/orgdevopslab.pem...
Delete your validation key in order to use your user credentials instead

Connecting to chef-client-01.devopslab.com.br
chef-client-01.devopslab.com.br -----> Installing Chef Omnibus (-v 12)
chef-client-01.devopslab.com.br downloading https://omnitruck-direct.chef.io/chef/install.sh
chef-client-01.devopslab.com.br   to file /tmp/install.sh.1086/install.sh
chef-client-01.devopslab.com.br trying wget...
chef-client-01.devopslab.com.br ubuntu 14.04 x86_64
chef-client-01.devopslab.com.br Getting information for chef stable 12 for ubuntu...
chef-client-01.devopslab.com.br downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12&p=ubuntu&pv=14.04&m=x86_64
chef-client-01.devopslab.com.br   to file /tmp/install.sh.1090/metadata.txt
chef-client-01.devopslab.com.br trying wget...
chef-client-01.devopslab.com.br sha1	7d30b300f95f00036919ee8bf3b95ab73429e57e
chef-client-01.devopslab.com.br sha256	663d6c42c90bbb9463bc02a7c5d777f7aa6ebd52c071a0c1963bc8c4db76dea2
chef-client-01.devopslab.com.br url	https://packages.chef.io/stable/ubuntu/14.04/chef_12.10.24-1_amd64.deb
chef-client-01.devopslab.com.br version	12.10.24
chef-client-01.devopslab.com.br downloaded metadata file looks valid...
chef-client-01.devopslab.com.br downloading https://packages.chef.io/stable/ubuntu/14.04/chef_12.10.24-1_amd64.deb
chef-client-01.devopslab.com.br   to file /tmp/install.sh.1090/chef_12.10.24-1_amd64.deb
chef-client-01.devopslab.com.br trying wget...
chef-client-01.devopslab.com.br Comparing checksum with sha256sum...
chef-client-01.devopslab.com.br Installing chef 12
chef-client-01.devopslab.com.br installing with dpkg...
chef-client-01.devopslab.com.br Selecting previously unselected package chef.
(Reading database ... 57754 files and directories currently installed.)
chef-client-01.devopslab.com.br Preparing to unpack .../chef_12.10.24-1_amd64.deb ...
chef-client-01.devopslab.com.br Unpacking chef (12.10.24-1) ...
chef-client-01.devopslab.com.br Setting up chef (12.10.24-1) ...
chef-client-01.devopslab.com.br Thank you for installing Chef!
chef-client-01.devopslab.com.br Starting the first Chef Client run...
chef-client-01.devopslab.com.br Starting Chef Client, version 12.10.24
chef-client-01.devopslab.com.br Creating a new client identity for chef-client-01.devopslab.com.br using the validator key.
chef-client-01.devopslab.com.br resolving cookbooks for run list: []
chef-client-01.devopslab.com.br Synchronizing Cookbooks:
chef-client-01.devopslab.com.br Installing Cookbook Gems:
chef-client-01.devopslab.com.br Compiling Cookbooks...
chef-client-01.devopslab.com.br [2016-05-29T11:41:45-03:00] WARN: Node chef-client-01.devopslab.com.br has an empty run list.
chef-client-01.devopslab.com.br Converging 0 resources
chef-client-01.devopslab.com.br 
chef-client-01.devopslab.com.br Running handlers:
chef-client-01.devopslab.com.br Running handlers complete
chef-client-01.devopslab.com.br Chef Client finished, 0/0 resources updated in 03 seconds

Validação:

root@chef-workstation-01:~/chef-repo# knife node list
chef-client-01.devopslab.com.br
chef-client-02.devopslab.com.br
chef-client-03.devopslab.com.br
root@chef-workstation-01:~/chef-repo# knife client list
chef-client-01.devopslab.com.br
chef-client-02.devopslab.com.br
chef-client-03.devopslab.com.br
devopslab-validator

7. Primeiro Cookbook Chef

Agora que você já preparou sua cozinha, chegou a hora de cozinhar, então vamos fazer nossa primeira receita.
Seguinte!!! Vamos fazer um Nhoque com molho bolonhesa. Molho de tomate caseiro, a moda Italiana, vamos amassar o tomate.

Brincadeira… mas você já reparou que no Chef tudo é cozinha, receitas e utensílios, que coisa louca rsrsrs.

Vamos criar um cookbook para instalar um pacote qualquer. Vamos instalar aqui o pacote telnet.

Criação do Cookbook.
# knife cookbook create telnet

~/chef-repo# knife cookbook create telnet
** Creating cookbook telnet in /root/chef-repo/cookbooks
** Creating README for cookbook: telnet
** Creating CHANGELOG for cookbook: telnet
** Creating metadata for cookbook: telnet

O Cookbook fica armazenado dentro da pasta ~/chef-repo/cookbooks

#cd ~/chef-repo/cookbooks/telnet
# ls
attributes  CHANGELOG.md  definitions  files  libraries  metadata.rb  providers  README.md  recipes  resources templates

Veja que dentro da pasta telnet foi criado toda uma estrutura de diretórios. Por hora vamos direto para a pasta “recipes”, que é onde vamos escrever o procedimento de instalação do pacote telnet.

Crie um arquivo .rb com o seguinte conteúdo:
# vi default.rb

package 'telnet' do
  action :install
end

Veja que é bem intuitivo, foi declarado um recurso “package” e uma ação “install”. Fica bem claro que será instado o pacote telnet.

Faça uma verificação nas receitas para procurar por erros.
# knife cookbook test telnet

root@chef-workstation-01:~/chef-repo# knife cookbook test telnet
WARNING: DEPRECATED: Please use ChefSpec or Rubocop to syntax-check cookbooks.
checking telnet
Running syntax check on telnet
Validating ruby files
Validating templates

Sem erros, apenas um Warning informando para você utilizar o ChefSpec ou Rubocop ao invés do knife test, fica a seu critério qual das ferramentas utilizar para a verificação da sintaxe das suas receitas.

Agora faça o upload do cookbook para o Chef-server.

# knife cookbook upload telnet

root@chef-workstation-01:~/chef-repo# knife cookbook upload telnet
Uploading telnet       [0.1.0]
Uploaded 1 cookbook.

Vamos fazer um link entre os nodes e o cookbook. Basicamente vamos dizer quais cookbooks aplicar para determinados nodes.

# knife node run_list add chef-client-01.devopslab.com.br “recipe[telnet]”

root@chef-workstation-01:~/chef-repo# knife node run_list add chef-client-01.devopslab.com.br "recipe[telnet]"
chef-client-01.devopslab.com.br:
  run_list: recipe[telnet]

“recipe[telnet]” é equivalente a “recipe[telnet::default]”, pois a receita é default.rb.
Se a receita tivesse outro nome, por exemplo pacotes, a sintaxe ficaria assim: “recipe[telnet::pacotes]”.

Verificando quais cookbooks estão associados ao node.

root@chef-workstation-01:~/chef-repo# knife node show chef-client-01.devopslab.com.br
Node Name:   chef-client-01.devopslab.com.br
Environment: _default
FQDN:        chef-client-01.devopslab.com.br
IP:          10.0.2.42
Run List:    recipe[telnet]
Roles:       
Recipes:     
Platform:    ubuntu 14.04
Tags: 

Faça o login no node e execute o comando chef-client para baixar a receita de instalação do Chef-server.

root@chef-client-01:~# chef-client 
Starting Chef Client, version 12.10.24
resolving cookbooks for run list: ["telnet"]
Synchronizing Cookbooks:
  - telnet (0.1.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 1 resources
Recipe: telnet::default
  * apt_package[telnet] action install
    - install version 0.17-36build2 of package telnet

Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 08 seconds
root@chef-client-01:~# 


root@chef-client-01:~# dpkg -l| grep telnet
ii  telnet                             0.17-36build2                    amd64        The telnet client

No comando acima foi executado o chef-client e o comando “dpkg -l”. Veja que o telnet foi instalado conforme o esperado.

Deixa eu testar em um Centos 7 só para ver o comportamento.
Primeiramente associar o cookbook telnet ao node chef-client-03.devopslab.com.br.

root@chef-workstation-01:~/chef-repo# knife node run_list add chef-client-03.devopslab.com.br "recipe[telnet]"
chef-client-03.devopslab.com.br:
  run_list: recipe[telnet]
root@chef-workstation-01:~/chef-repo# 


root@chef-workstation-01:~/chef-repo# knife node show chef-client-03.devopslab.com.br
Node Name:   chef-client-03.devopslab.com.br
Environment: _default
FQDN:        chef-client-03.devopslab.com.br
IP:          10.0.2.44
Run List:    recipe[telnet]
Roles:       
Recipes:     
Platform:    centos 7.2.1511
Tags:   

Agora vou executar o comando chef-client no node chef-client-03.devopslab.com.br (Centos 7).

[root@chef-client-03 ~]# chef-client 
Starting Chef Client, version 12.10.24
resolving cookbooks for run list: ["telnet"]
Synchronizing Cookbooks:
  - telnet (0.1.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 1 resources
Recipe: telnet::default
  * yum_package[telnet] action install
    - install version 0.17-59.el7 of package telnet

Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 42 seconds
[root@chef-client-03 ~]# 

[root@chef-client-03 ~]# rpm -qa | grep telnet
telnet-0.17-59.el7.x86_64

Repare que tanto no Ubuntu como no Centos foi instalado bonitinho o pacote telnet, e o melhor foi que você não se preocupou se foi utilizado apt-get ou yum, rpm ou dpkg, pois o Chef e sua camada de abstração trata isto para você. O seu trabalho é apenas fazer a receita de instalação.

Referência:
https://docs.chef.io/packages.html
https://docs.chef.io/release/server_12-6/install_server.html#standalone
https://docs.chef.io/release/devkit/install_dk.html
https://docs.chef.io/install_bootstrap.html
https://docs.chef.io/knife_bootstrap.html
https://www.linode.com/docs/applications/chef/creating-your-first-chef-cookbook
https://www.linode.com/docs/applications/chef/deploy-a-chef-server-workstation-and-node-on-ubuntu-14-04/

Faça o que é difícil e a vida será mais fácil. Faça o que é fácil e a vida será mais difícil.

The Foreman – Instalação de hosts EC2 Amazon Web Services via Foreman – parte 3/3

The Foreman – Lifecycle, Provisioning, Configuration, Orchestration and Monitoring.

Vamos fazer a instalação de um host na Amazon Web Services utilizando o The Foreman.

Parte 1 – Como instalar e configurar o the foreman
Parte 2 – The Foreman instalacao de hosts via pxe bootstrap bare metal vms parte2

Compute Resources suportados pelo The Foreman
http://theforeman.org/manuals/1.10/index.html#5.2ComputeResources

Plugins
http://projects.theforeman.org/projects/foreman/wiki/List_of_Plugins

1. Usuário Amazon WS

A primeira coisa a se fazer é ter um usuário na Amazon WS com permissões administrativas no EC2 e com as chaves de acesso (Access Key ID e Secret Access Key).
Você pode criar um usuário gratuito na AmazonWS. Sendo assim tenha o Access Key ID e Secret Access Key em mãos.

2. Instalação do Compute Resource Foreman-ec2

Logado no servidor do Foreman instale o compute resource EC2 para habilitar o suporte a AmazonWS EC2.

#yum install foreman-ec2
#systemctl reload httpd

foreman-ec2.noarch : Foreman Amazon Web Services (AWS) EC2 support

3. Configuração do EC2 AmazonWS no Foreman

Em Home-The-Foreman -> Infrastructure -> Compute Resources -> New Compute Resurce
Preencha os dados de configuração informando Access Key, Secret Key e Provider EC2.
theforeman-rec-ec1

Faça um teste de conexão e escolha a região. São Paulo a região é sa-east-1.
Clique em “Submit”.

O Foreman vai gerar um para de chaves para comunicação com o EC2. Para verificar a chave logue no console da AmazonWS: http://console.aws.amazon.com -> EC2 -> Network & Security -> Key Pairs.

4. Criação de um Sistema Operacional genérico

Nós precisamos criar um Sistema Operacional no Foreman, da mesma forma que na instalação Bare Metal no tópico parte2.

É um Sistema Operacional genérico pois de fato ele não será usado, o que vai ser usado serão as imagens da Amazon do tipo ami-xxxxx, ami-27b3094b e etc.
theforeman-ami-27b3094b

4.1. Associar o template user data ao novo Sistema Operacional

Associe o template “Kickstart default user data” ao novo Sistema Operacional. Este é um template do tipo user data, em resumo ele é um script que vai instalar e configurar o Puppet e alterar a senha do usuário ec2-user e root.
theforeman-template1

theforeman-template2

Observação:
No template “Kickstart default user data” eu adicionei as linhas:

- RedHat 6
- RedHat 7
#
#Enable password on ssh
/bin/echo ec2-user:senha123456 | chpasswd
/bin/echo root:senha123456 | chpasswd
/bin/sed -i s/PasswordAuthentication\ no/PasswordAuthentication\ yes/g /etc/ssh/sshd_config
/bin/systemctl reload sshd

Template “Kickstart default user data” na íntegra:

<%#
kind: user_data
name: Kickstart default user data
oses:
- CentOS 4
- CentOS 5
- CentOS 6
- CentOS 7
- Fedora 16
- Fedora 17
- Fedora 18
- Fedora 19
- Fedora 20
- RedHat 6
- RedHat 7
-%>
#!/bin/bash

<%# Cloud instances frequently have incorrect hosts data %>
<%= snippet 'fix_hosts' %>

<%
  # safemode renderer does not support unary negation
  pm_set = @host.puppetmaster.empty? ? false : true
  puppet_enabled = pm_set || @host.params['force-puppet'] && @host.params['force-puppet'] == 'true'
%>
<% if puppet_enabled %>
yum install -y puppet
cat > /etc/puppet/puppet.conf << EOF
<%= snippet 'puppet.conf' %>
EOF

# Setup puppet to run on system reboot
/sbin/chkconfig --level 345 puppet on

/usr/bin/puppet agent --config /etc/puppet/puppet.conf --onetime --tags no_such_tag <%= @host.puppetmaster.blank? ? '' : "--server #{@host.puppetmaster}" %> --no-daemonize
<% end -%>

# UserData still needs wget to mark as finished
/usr/bin/wget --quiet --output-document=/dev/null --no-check-certificate <%= foreman_url('built') %>

# Enable password on ssh
/bin/echo ec2-user:senha123456 | chpasswd
/bin/echo root:senha123456 | chpasswd
/bin/sed -i s/PasswordAuthentication\ no/PasswordAuthentication\ yes/g /etc/ssh/sshd_config
/bin/systemctl reload sshd

5. Definição de imagens EC2

Antes de fazer a instalação de um novo host, você precisa antes definir quais imagens estarão habilitadas para o uso.
Em Home-The-Foreman -> Infrastructure -> Compute Resources -> *EC2-AmazonWS-SaoPaulo -> New image

Você precisa ter uma imagem criada na AmazonWS, pode ser uma própria sua, da comunidade, ou uma da AmazonWS.
Eu vou utilizar uma padrão que a própria AmazonWS fornece.
Imagem Amazon: ami-27b3094b
thefoerman-Amazonimagem1

No Foreman a imagem ficou assim:
theforeman-imagemec2-2
Perceba a referência a imagem ami-27b3094b.

*EC2-AmazonWS-SaoPaulo é o nome que eu dei para a zona de instalação de hosts. No seu caso coloque um nome de sua preferência

6. Deploy na Amazon via Foreman

Agora basta iniciar a criação de um servidor na Amazon via Foreman, então entre em
Home-The-Foreman -> Hosts -> New Hosts e crie uma nova instalação.
A minha instância se chama servidorec2aws-1.devopslab.com.br.

Então preencha os campos Host, Puppet Classes, Interfaces e Operating System, Virtual Machine (tipo de instância, neste caso vamos usar a t2.micro) e clique em Submit.

Host
theforeman-aws1

Interface
theforeman-aws2

Operating System
theforeman-aw3

Virtual Machine
theforeman-aw4

Submit – Processo de instalação
theforeman-aws5

theforeman-aws6

Consulte no EC2 AmazonWS a nova instância
theforeman-amazonec2-a

Consulte no Foreman a nova instância (clique em All hosts)
theforeman-amazonec2-b

theforeman-amazonec2-c

Pronto, provisionado um servidor na AmazonWS EC2 via Foreman.

The Foreman – Instalação de hosts via PXE – Bootstrap – Bare Metal – VMs – parte 2/3

The Foreman – Lifecycle, Provisioning, Configuration, Orchestration and Monitoring.

Instalação de hosts via PXE – BootStrap. O intuito é provisionar um novo host já integrado com o Puppet.
Você pode instalar tanto VMs como hosts físicos “Bare Metal”.
Assumo que você já tenha a aplicação The Foreman instalada e configurada conforme a parte 1 http://devopslab.com.br/como-instalar-e-configurar-o-the-foreman/

1. Criação do Sistema Operacional

Vamos instalar o CentOS 7.
Em Home-The-Foreman -> Hosts -> Operating Systems -> New Operating System
Operating System preencha os dados do Sistema Operacional.
Name: CentOS7
Major version: 7
Description: CentOS 7
Family: RedHat
Architectures: X86_64
theforeman-OSCentos1

Partition Table
Você vai definir particionamento do Sistema Operacional.
Selecione: Kickstart Default
theforeman-ptables1

Installation Media
Selecione: CentOS Mirror
theforeman-centosmirror1
Você pode ter um mirror local via NFS ou Http, neste caso, por facilidade optamos por instalar utilizando o mirror CentOS público.
Se você optar por criar seu próprio repositório de imagens (recomendado) pode seguir este tutorial:
http://devopslab.com.br/como-criar-e-configurar-um-repositorio-local-centos/

2. Templates de instalação

Home-The-Foreman -> Hosts -> Provisioning Templates
Clique nos templates abaixo e associe ao Sistema Operacional CentOS7.
Template—————————–Tipo
Kickstart default PXELinux———–PXELinux
Kickstart RHEL default—————provision
Kickstart default finish————-Finish

theforeman-templates1
Clique em Submit.

3. Criação do Sistema Operacional – parte 2 final

Vá para Home-The-Foreman -> Hosts -> Operating Systems -> Centos 7.0 -> Templates
Associe os templates ao Sistema Operacional.
theforeman-template2
Clique em Submit.

4. Configuração do Servidor de Provisionamento – SmartProxys DHCP, DNS e FTP

Antes de fazer a instalação via rede, precisamos preparar o servidor do Foreman ativando os serviços de DHCP, DNS e TFTP.
O TFTP já foi instalado quando executamos o “Foreman-installer”.

Set up Provisioning
Vá para Home-The-Foreman -> Infrastructure -> Provisioning setup -> Set up Provisioning
Em “Pre-requisites” selecione sua rede.
theforeman-prov1

Network Config
Em “Network Config” preencha os dados da sua rede conforme exemplo do print e clique em Submit.
theforeman-prov2

Você terá um resultado como este:

foreman-installer \
  --enable-foreman-proxy \
  --foreman-proxy-tftp=true \
  --foreman-proxy-tftp-servername=10.0.0.170 \
  --foreman-proxy-dhcp=true \
  --foreman-proxy-dhcp-interface=enp0s3 \
  --foreman-proxy-dhcp-gateway=10.0.0.110 \
  --foreman-proxy-dhcp-range=" " \
  --foreman-proxy-dhcp-nameservers="10.0.0.170" \
  --foreman-proxy-dns=true \
  --foreman-proxy-dns-interface=enp0s3 \
  --foreman-proxy-dns-zone=devopslab.com.br \
  --foreman-proxy-dns-reverse=0.0.10.in-addr.arpa \
  --foreman-proxy-dns-forwarders=8.8.8.8 \
  --foreman-proxy-dns-forwarders=208.67.222.222 \
  --foreman-proxy-dns-forwarders=200.221.11.100 \
  --foreman-proxy-foreman-base-url=https://theforeman01.devopslab.com.br \
  --foreman-proxy-oauth-consumer-key=PYUixcJi5EQwFKqR9nHDTLe7AVjV \
  --foreman-proxy-oauth-consumer-secret=AobRoR8RqHi6kPTj7qwQKV9uQxwv

theforeman-priv4

Execute este trecho de código no servidor do Foreman

[root@theforeman01 ~]# foreman-installer \
>   --enable-foreman-proxy \
>   --foreman-proxy-tftp=true \
>   --foreman-proxy-tftp-servername=10.0.0.170 \
>   --foreman-proxy-dhcp=true \
>   --foreman-proxy-dhcp-interface=enp0s3 \
>   --foreman-proxy-dhcp-gateway=10.0.0.110 \
>   --foreman-proxy-dhcp-range=" " \
>   --foreman-proxy-dhcp-nameservers="10.0.0.170" \
>   --foreman-proxy-dns=true \
>   --foreman-proxy-dns-interface=enp0s3 \
>   --foreman-proxy-dns-zone=devopslab.com.br \
>   --foreman-proxy-dns-reverse=0.0.10.in-addr.arpa \
>   --foreman-proxy-dns-forwarders=8.8.8.8 \
>   --foreman-proxy-dns-forwarders=208.67.222.222 \
>   --foreman-proxy-dns-forwarders=200.221.11.100 \
>   --foreman-proxy-foreman-base-url=https://theforeman01.devopslab.com.br \
>   --foreman-proxy-oauth-consumer-key= PYUixcJi5EQwFKqR9nHDTLe7AVjV \
>   --foreman-proxy-oauth-consumer-secret= AobRoR8RqHi6kPTj7qwQKV9uQxwv
Installing  Done  [100%] [............................]
  Success!
  * Foreman is running at https://theforeman01.devopslab.com.br
      Initial credentials are admin / LcuFswt8wjGLAn7wK
  * Foreman Proxy is running at https://theforeman01.devopslab.com.br:8443
  * Puppetmaster is running at port 8140
  The full log is at /var/log/foreman-installer/foreman-installer.log
[root@theforeman01 ~]#

Installation Media
Na próxima aba “Installation Media” selecione CentOS Mirror.
theforeman-priv3
Agora basta finalizar a configuração.

5. Instalação de um servidor via PXE

Vamos para a parte de instalação propriamente dita, então clique em New Host e siga os passos abaixo.

Nós vamos utilizar o recurso Bare Metal. Bare Metal é um Compute Resource.
Compute Resourses são serviços que podem gerar um host pode exemplo AmazonWS, Docker, OpenStack, Google Compute Engine, Rackspace e etc.

Home-The-Foreman -> Hosts -> New Host

Host
Preencha os campos:
Name: nome-do-servidor
Host Group:
Deploy on: Bare Metal
Environment: production
Puppet CA: theforeman01.devopslab.com.br
Puppet Master: theforeman01.devopslab.com.br
theforeman-host1

Puppet classes
Selecione as classes do Puppet.
theforeman-ntpclass1

Interfaces
Preencha os dados de rede, você precisa ter o MAC Address do servidor alvo da instalação.
O campo “identifier” é referente a placa de rede (eth0, enp0s3 …).
theforeman-interfaces1

Operationg System
Preencha os campos:
Architecture
Operating system
Build mode: Enable this host for provisioning
Media
Partition table
Root password
theforeman-so2

Adittional information
Escolha do tipo de Hardware.
theforeman-addinfo1

Após configurado Host, Puppet Classes, Interfaces, Operating System, Parameters, e Additional Information clique em Submit.
theforeman-end1

Agora ligue a VM ou host físico, selecione o boot via rede (PXE) que a instalação vai começar.
theforeman-redeboot1
theforeman-redeboot2

Pronto, host provisionado e integrado ao Puppet.

The Foreman – Como instalar e configurar o Foreman – Parte 1/3

The Foreman – Lifecycle, Provisioning, Configuration, Orchestration and Monitoring.

Parte 1 de 3.

The Foreman é uma ferramenta para gerenciamento do ciclo de vida de servidores físicos e virtuais, ele te permite instalar VMs em Clouds como AmazonWS, Google Compute Engine, OpenStack, VMWare e também a instalação de servidores físicos e VMs via PXE (Bootstrap), tudo integrado com a gestão de configuração como Puppet, Ansible, Salt e Chef.

Também tem suporte ao container Docker.

Eu acho um problema quando uma empresa tem vários tipos de Cloud, por exemplo VMware e AmazonWS, sem uma ferramenta de gerência como The Foreman, existirão duas interfaces para gestão, gerencia descentralizada de VMs, é difícil ter uma visão global do ambiente, e o The Foreman centraliza tudo isto, todos os servidores em uma única ferramenta e isto é agilidade.

Com ferramentas como esta, você tem um forte aliado para colocar em prática a cultura DevOps, pois você vai integrar os times em uma única ferramenta, todo mundo vai falar a mesma língua, o time de desenvolvimento vai poder fazer seus deploys e integrações tranquilamente de forma autônoma, o time de Administração estará vendo e controlando tudo que acontece no ambiente, todo mundo vai poder ver e administrar o ambiente, e os ganhos todos sabem, times mais próximos, problemas resolvidos mais rápidos e entregas com mais rapidez e qualidade.

E sem falar que com times mais próximos aumenta a grana para poder rachar o churrasco no fim de semana.

Dê uma lida na introdução sobre o The Foreman:
http://theforeman.org/introduction.html

Entre no site do projeto:
http://theforeman.org/

Github
https://github.com/theforeman/foreman

Parte 1 – Instalação e configuração do The Foreman

1. Pré requisitos
Sistema Operacional Centos 7 X64 – instalação mínima.

Para facilitar desative o Selinux e Firewall mas considere utilizar ambas opções no seu ambiente.

#sed -i "s/enforcing/disabled/g" /etc/selinux/config
#setenforce 0

#systemctl stop firewalld
#systemctl disable firewalld

2. Hostname fqdn
Configure o fqdn do servidor conforme exemplo:

#vi /etc/hosts
10.0.0.170	theforeman01.devopslab.com.br	 theforeman01

#hostname -f
theforeman01.devopslab.com.br

3. Instalação dos repositórios

#rpm -hiv http://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm
#rpm -hiv http://yum.theforeman.org/releases/1.10/el7/x86_64/foreman-release.rpm
#yum install epel-release

4.Instalação do foreman-installer

#yum install foreman-installer

5.Execução do instalador
Execute o “foreman-installer”. O instalador por padrão vai executar de forma não interativa, mas você pode adicionar o “–i” para uma instalação interativa.

#foreman-installer

Após terminar a execução do foreman-installer você terá um resultado como este:

[root@theforeman01 ~]# foreman-installer 
Installing  Done  [100%] [............................]
  Success!
  * Foreman is running at https://theforeman01.devopslab.com.br
      Initial credentials are admin / LfcuPwtw7jCLAn8wK
  * Foreman Proxy is running at https://theforeman01.devopslab.com.br:8443
  * Puppetmaster is running at port 8140
  The full log is at /var/log/foreman-installer/foreman-installer.log

Agora você já pode logar na interface do The Foreman com as credenciais fornecidas. Entre no The Foreman e altere sua senha.
foremanlogin1

6. Puppet
Execute o puppet agent para a finalização da instalação. O puppet vai aplicar algumas configurações.

#puppet agent -t

Após o término da execução do puppet faça o login no The Foreman e vá para a aba “Hosts”, vai aparecer o próprio servidor do The Foreman, com o status, versão do S.O e etc.
theforemanhome1

theforemanhost1-b
6.1. Gerenciamento do Puppet – instalação do módulo Ntp
É muito importante manter o horário do servidor Foreman e clientes sincronizados portanto instale um módulo ntp no puppet e configure com os servidores ntp da sua localidade.

#puppet module install -i /etc/puppet/environments/production/modules saz/ntp

Após a instalação do módulo ntp faça o login no The Foreman e vá para: Home-The-Foreman –> Configure –> Classes e importe a classe ntp.
theforeman-ntp1-b

Configure o classe Ntp com os servidores de sua preferência.
Home-The-Foreman –> Configure –> Classes –> Ntp –> Smart Class Parameter –> Server List

Para facilitar segue a lista de servidores Ntp Brasileiros: http://www.pool.ntp.org/zone/br
Após a alteração clique no final em “Submit”. Faça o mesmo para a classe “ntp::ntpdate”.

6.2. Inclusão da classe Ntp com o Servidor The Foreman
Após configurado as classes ntp e ntp::update inclua as mesmas ao host The Foreman.

Vá para Home-The-Foreman –> Hosts –> selecione o servidor do Foreman –> clique em Edit

Em Edit –> Puppet Classes –> +NTP (adicione a classe NTP ao host the Foreman) –> Submit
theforeman-ntp3
Por fim rode do comando “puppet agent –t” no Servidor do Foreman para concluir a instalação e configuração do Ntp.

Lembre-se, o processo de instalar um módulo no Puppet, modificar os parâmetros da classe e associar aos hosts é algo que vai acontecer sempre.

Parte 1 – Instalação e configuração finalizada.

Parte 2 – The Foreman – Instalação de hosts via PXE – Bootstrap
Parte 3 – The Foreman – instalação de hosts em Cloud – Amazon Web Services

Abraços

Leonardo Macedo Cerqueira