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.

Criação de um Loadbalancer com Haproxy e containers Docker

1. Introdução

Segue uma stack utilizando o Loadbalancer HAproxy e containers Docker, portanto este tutorial irá abordar a criação de um Loadbalancer com HAProxy e balanceamento de carga entre containers Docker.

2. Pré-requisitos

Docker instaladoTutorial instalação do Docker.

Comunicação entre containers – Todos os containers precisam se comunicar, o ping tem que funcionar partindo de qualquer container em qualquer host docker.
Sugiro utilizar a rede Flannel para fazer esta comunicação, e aqui segue o tutorial de instalação do Flannel+Docker.

3. Criação da imagem e containers para o NGINX

Vamos criar as imagens utilizando o Dockerfile. O foco deste tutorial não é Dockerfile, mas em resumo Dockerfile são arquivos com instruções para a criação de imagens Docker.
Está bem intuitivo, se você nunca mexeu com Dockerfile não terá nenhum problema.

Definição do Dockerfile Nginx.
#vi Nginx-Dockerfile

#Utilizar o Centos Latest
FROM centos

#Quem mantem e criou a imagem - informacoes de contato.
MAINTAINER Leonardo DevOpsLab "leonardo@devopslab.com.br"

#Instala o Nginx e configura o Nginx.
RUN yum install -y epel-release
RUN yum install -y nginx
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

#Start do Nginx
CMD ["nginx"]

Criação da imagem “nginximg” utilizando o Dockerfile “Nginx-Dockerfile”.

# docker build -t nginximg -f Nginx-Dockerfile .

O ponto final no comando é proposital.

Start do container rodando o Nginx.

# docker run -d -v /root/nginx-templates/index.html:/usr/share/nginx/html/index.html --name servidor-nginx1 -h servidor-nginx1.devopslab.com.br

Arquivo index.html está sendo compartilhado entre o host docker e o container através do parâmetro:
-v /root/nginx-templates/index.html:/usr/share/nginx/html/index.html“.
Você configura o arquivo index.html do jeito que você quiser.

Eu não preciso expor (EXPOSE) a porta do container Nginx, pois estou utilizando a rede Flannel, sendo assim todos os containers estão se comunicando, tem ping e acesso a todas as portas partindo de qualquer container da rede.

Repita o comando “docker run…” para todos os containers que você for criar.

4. Criação da Imagem Haproxy e criação do container de Loadbalancer

Definição do Dockerfile HAProxy.
#vi Haproxy-Dockerfile

#Utilizar o Centos Latest
FROM centos

#Quem mantem e criou a imagem - informacoes de contato.
MAINTAINER Leonardo leonardo@devopslab.com.br

#Instala o HAproxy.
RUN yum install -y haproxy

#Expor a porta 5000TCP no container.
EXPOSE 5000

#Start do haproxy
CMD ["haproxy", "-f", "/etc/haproxy/haproxy.cfg", "-p", "/var/run/haproxy.pid"]

Criação da imagem “haproxyimg” utilizando o Dockerfile “Haproxy-Dockerfile”.

# docker build -t haproxyimg -f HAproxy-Dockerfile .

Start do container HAproxy.

# docker run -d -p 80:5000 -v /root/dockerfiles/haproxy/haproxy.cfg:/etc/haproxy/haproxy.cfg --name loadbalancer-haproxy -h loadbalancer-haproxy.devopslab.com.br haproxyimg

Arquivo haproxy.cfg está sendo compartilhado entre o host docker e o container Haproxy através do parâmetro:
“-v /root/dockerfiles/haproxy/haproxy.cfg:/etc/haproxy/haproxy.cfg”.

Mapeamos a porta 80 do host para a porta 5000 do container:
-p 80:5000

Diferente dos containers rodando o Nginx, o Loadbalacer Haproxy precisa ter a porta 80 exposta, pois ela será acessível para o mundo.

Quando eu falo acessível para o mundo, quero dizer disponível em produção, acessível para clientes externos, ou simplesmente disponível para todas as redes do seu ambiente que não seja a rede do Docker.

Arquivo haproxy.cfg.
O arquivo haproxy.cfg foi copiado de uma instalação padrão do Haproxy.
* Foi comentado a linha “daemon”.
* Adicionei o pool de containers para responder pelas requisições, 5 containers no total.
* Foi definido uma url, no caso “exemplo.devopslab.com.br”.
* Tipo de balanceamento Roundrobin.

Segue o arquivo “haproxy.cfg” completo.

#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    #daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:5000
    acl frontend-nginx	hdr(host) -i exemplo.devopslab.com.br
    use_backend servidores-nginx if frontend-nginx

backend servidores-nginx
    balance     roundrobin
    server  servidor-nginx1 10.0.96.2:80 check
    server  servidor-nginx2 10.0.12.3:80 check
    server  servidor-nginx3 10.0.89.3:80 check
    server  servidor-nginx4 10.0.58.2:80 check
    server  servidor-nginx5 10.0.91.2:80 check

5. Teste do Balanceamento de carga do HAproxy

Já está tudo pronto, então vamos testar.
Partindo de qualquer lugar da sua rede, faça um teste em direção do Loadbalancer; neste caso vou utilizar o comando “curl”.

$ for i in {1..10}; do echo "---------Teste curl $i-----------"; curl exemplo.devopslab.com.br; done
---------Teste curl 1-----------
SERVIDOR 1
servidor-nginx1

---------Teste curl 2-----------
SERVIDOR 2
servidor-nginx2

---------Teste curl 3-----------
SERVIDOR 3
servidor-nginx3

---------Teste curl 4-----------
SERVIDOR 4
servidor-nginx4

---------Teste curl 5-----------
SERVIDOR 5
servidor-nginx5

---------Teste curl 6-----------
SERVIDOR 1
servidor-nginx1

---------Teste curl 7-----------
SERVIDOR 2
servidor-nginx2

---------Teste curl 8-----------
SERVIDOR 3
servidor-nginx3

---------Teste curl 9-----------
SERVIDOR 4
servidor-nginx4

---------Teste curl 10-----------
SERVIDOR 5
servidor-nginx5

Utilizei um “for” bem simples, para fazer um get na url exemplo.devopslab.com.br.

6. Bônus

Docker Registry.
Se você tiver utilizando seu próprio Docker Registry para armazenar suas próprias imagens, o comando para iniciar um container seria algo assim:

# docker run -d -v /root/nginx-templates/index.html:/usr/share/nginx/html/index.html --name servidor-nginx5 -h servidor-nginx5.devopslab.com.br repo-dockerimages.devopslab.com.br:5000/nginximg

Segue aqui o Tutorial Docker Registry.

É nóis =)

[]’s
Leonardo

Puppet – Puppet Server, Cliente, orquestração com Mcollective, instalação de Plugins e Tuning

Segue esta série de tutoriais para a criação de uma infraestrutura gerenciada utilizando o Puppet, orquestração via Mcollective, instalação de plugins do Mcollective e por fim tuning do Puppet Server.

Como extra segue um lab para a instalação de agentes de monitoração Zabbix.

1. Puppet – Como instalar e configurar o Puppet Server, Puppet Cliente e Módulos de Configuração
Puppet – Como instalar e configurar o Puppet Server, Puppet Cliente e Módulos de Configuração

2. Puppet – Instalação e configuração do Mcollective, plugins e orquestração de clientes
Puppet – Instalação e configuração do Mcollective, plugins e orquestração de clientes

3. Puppet – Facter – Orquestração via Mcollective – Instalação e utilização do Plugin Facter
Puppet – Facter – Orquestração via Mcollective – Instalação e utilização do Plugin Facter

4. Puppet – Tuning do Puppet Server
Puppet – Tuning do Puppet Server

Extra aula
5. Puppet – Como instalar e configurar o zabbix-agent de forma automática via Puppet
Puppet – Como instalar e configurar o zabbix-agent de forma automática via Puppet

6. Puppet 4.x.x não precisa do Apache/Passenger
Puppet 4.x.x não precisa do Apache/Passenger

Puppet – Instalação e configuração do Mcollective, plugins e orquestração de clientes

Como instalar o Mcollective para fazer a orquestração de clientes.

1. Introdução

Para este tutorial você precisa ter Puppet Server funcionando.
Como instalar o Puppet Server e Puppet cliente

O puppet-agent é all-in-one, ele já contém o Mcollective, Hiera, Facter, e Puppet, sendo assim você não precisa instalar os pacotes mcollective-* como acontecia nas versões < Puppet 4.x.x. O Mcollective precisa de um serviço de mensageria, que é uma camada middleware para troca mensagens entre aplicações conhecido como “Broker”; neste caso vamos utilizar o serviço de mensageria Apache ActiveMQ, ou simplesmente ActiveMQ.
Também tem como opção o RabbitMQ, porém não será abordado neste tutorial.

2. Infraestrutura e pré-requisitos

Segue abaixo a infraestrutura utilizada neste lab, para que você utilize como exemplo.

Puppet Server: puppetserver-01.devopslab.com.br
Nodes/Clientes: puppetclient-01.devopslab.com.br, puppetclient-02.devopslab.com.br
S.O: Centos 7 – 64 bits instalação mínima.
Aplicações: puppetserver 2.2.1
puppet 4.3.2
puppet-agent 1.3.5

3. Instalação do ActiveMQ

No servidor do Puppet Server instale o repositório:

#rpm -hiv https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm

Instale o ActiveMQ.

# yum install activemq

Configuração. Definição de usuário e senha.

# vi /etc/activemq/credentials.properties
activemq.username=mcollective
activemq.password=marionette

O usuário e senha pode ser a que você quiser ok, aqui vou seguir o padrão do mcollective.

Crie um nome para a fila de mensagens do ActiveMQ.
Neste caso criei como: ‘brokerName=”puppetserver-01.devopslab.com.br”‘.

# vi /etc/activemq/activemq.xml

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="puppetserver-01.devopslab.com.br" dataDirectory="${activemq.data}"> 

Ainda no arquivo activemq.xml altere as configurações de memória e storage. O ActiveMQ vem configurado para utilizar 100GB de armazenamento, e para arquivos temporários ele pede 50GB de espaço, não convém utilizar tudo isto para um lab, então deixe mais ou menos assim:

# vi /etc/activemq/activemq.xml

<systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage percentOfJvmHeap="40" />
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="500 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

Segue todo meu arquivo activemq.xml.

<!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
<!-- START SNIPPET: example -->
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

    <!-- Allows us to use system properties as variables in this configuration file -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>file:${activemq.conf}/credentials.properties</value>
        </property>
    </bean>

    <!--
        The <broker> element is used to configure the ActiveMQ broker.
    -->
    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="puppetserver-01.devopslab.com.br" dataDirectory="${activemq.data}">

        <destinationPolicy>
            <policyMap>
              <policyEntries>
                <policyEntry topic=">" >
                    <!-- The constantPendingMessageLimitStrategy is used to prevent
                         slow topic consumers to block producers and affect other consumers
                         by limiting the number of messages that are retained
                         For more information, see:

                         http://activemq.apache.org/slow-consumer-handling.html

                    -->
                  <pendingMessageLimitStrategy>
                    <constantPendingMessageLimitStrategy limit="1000"/>
                  </pendingMessageLimitStrategy>
                </policyEntry>
              </policyEntries>
            </policyMap>
        </destinationPolicy>


        <!--
            The managementContext is used to configure how ActiveMQ is exposed in
            JMX. By default, ActiveMQ uses the MBean server that is started by
            the JVM. For more information, see:

            http://activemq.apache.org/jmx.html
        -->
        <managementContext>
            <managementContext createConnector="false"/>
        </managementContext>

        <!--
            Configure message persistence for the broker. The default persistence
            mechanism is the KahaDB store (identified by the kahaDB tag).
            For more information, see:

            http://activemq.apache.org/persistence.html
        -->
        <persistenceAdapter>
            <kahaDB directory="${activemq.data}/kahadb"/>
        </persistenceAdapter>


          <!--
            The systemUsage controls the maximum amount of space the broker will
            use before disabling caching and/or slowing down producers. For more information, see:
            http://activemq.apache.org/producer-flow-control.html
          -->
          <systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage percentOfJvmHeap="40" />
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="500 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

        <!--
            The transport connectors expose ActiveMQ over a given protocol to
            clients and other brokers. For more information, see:

            http://activemq.apache.org/configuring-transports.html
        -->
        <transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        </transportConnectors>

        <!-- destroy the spring context on shutdown to stop jetty -->
        <shutdownHooks>
            <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
        </shutdownHooks>

    </broker>

    <!--
        Enable web consoles, REST and Ajax APIs and demos
        The web consoles requires by default login, you can disable this in the jetty.xml file

        Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details
    -->
    <import resource="jetty.xml"/>

</beans>
<!-- END SNIPPET: example -->

Firewall
Libere a porta do ActiveMQ 61613/tcp no Firewall.

# firewall-cmd --permanent --add-port=61613/tcp
# systemctl reload firewalld

Inicie e habilite o ActiveMQ.

# systemctl enable activemq.service
# systemctl start activemq.service

Verificação dos logs do ActiveMQ.
# tail -f /var/log/activemq/activemq.log

2016-02-26 22:30:02,416 [main           ] INFO  XBeanBrokerFactory$1           - Refreshing org.apache.activemq.xbean.XBeanBrokerFactory$1@36f6e879: startup date [Fri Feb 26 22:30:02 BRT 2016]; root of context hierarchy
2016-02-26 22:30:03,395 [main           ] INFO  PListStoreImpl                 - PListStore:[/usr/share/activemq/data/puppetserver-01.devopslab.com.br/tmp_storage] started
2016-02-26 22:30:03,435 [main           ] INFO  BrokerService                  - Using Persistence Adapter: KahaDBPersistenceAdapter[/usr/share/activemq/data/kahadb]
2016-02-26 22:30:03,767 [main           ] INFO  MessageDatabase                - KahaDB is version 5
2016-02-26 22:30:03,789 [main           ] INFO  MessageDatabase                - Recovering from the journal ...
2016-02-26 22:30:03,803 [main           ] INFO  MessageDatabase                - Recovery replayed 355 operations from the journal in 0.024 seconds.
2016-02-26 22:30:03,951 [main           ] INFO  BrokerService                  - Apache ActiveMQ 5.9.1 (puppetserver-01.devopslab.com.br, ID:puppetserver-01-39882-1456536603823-0:1) is starting
2016-02-26 22:30:04,021 [main           ] INFO  TransportServerThreadSupport   - Listening for connections at: tcp://puppetserver-01:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600
2016-02-26 22:30:04,022 [main           ] INFO  TransportConnector             - Connector openwire started
2016-02-26 22:30:04,025 [main           ] INFO  TransportServerThreadSupport   - Listening for connections at: amqp://puppetserver-01:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600
2016-02-26 22:30:04,026 [main           ] INFO  TransportConnector             - Connector amqp started
2016-02-26 22:30:04,029 [main           ] INFO  TransportServerThreadSupport   - Listening for connections at: stomp://puppetserver-01:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600
2016-02-26 22:30:04,030 [main           ] INFO  TransportConnector             - Connector stomp started
2016-02-26 22:30:04,035 [main           ] INFO  TransportServerThreadSupport   - Listening for connections at: mqtt://puppetserver-01:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600
2016-02-26 22:30:04,035 [main           ] INFO  TransportConnector             - Connector mqtt started
2016-02-26 22:30:04,130 [main           ] INFO  Server                         - jetty-7.6.9.v20130131
2016-02-26 22:30:04,160 [main           ] INFO  ContextHandler                 - started o.e.j.s.ServletContextHandler{/,null}
2016-02-26 22:30:04,191 [main           ] INFO  AbstractConnector              - Started SelectChannelConnector@0.0.0.0:61614
2016-02-26 22:30:04,191 [main           ] INFO  WSTransportServer              - Listening for connections at ws://puppetserver-01:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600
2016-02-26 22:30:04,192 [main           ] INFO  TransportConnector             - Connector ws started
2016-02-26 22:30:04,193 [main           ] INFO  BrokerService                  - Apache ActiveMQ 5.9.1 (puppetserver-01.devopslab.com.br, ID:puppetserver-01-39882-1456536603823-0:1) started
2016-02-26 22:30:04,193 [main           ] INFO  BrokerService                  - For help or more information please see: http://activemq.apache.org
2016-02-26 22:30:04,350 [main           ] INFO  Server                         - jetty-7.6.9.v20130131
2016-02-26 22:30:04,578 [main           ] INFO  ContextHandler                 - started o.e.j.w.WebAppContext{/admin,file:/var/lib/activemq/webapps/admin/}
2016-02-26 22:30:04,710 [main           ] INFO  /admin                         - Initializing Spring FrameworkServlet 'dispatcher'
2016-02-26 22:30:04,761 [main           ] INFO  ndingBeanNameUrlHandlerMapping - Mapped URL path [/createDestination.action] onto handler '/createDestination.action'
2016-02-26 22:30:04,762 [main           ] INFO  ndingBeanNameUrlHandlerMapping - Mapped URL path [/deleteDestination.action] onto handler '/deleteDestination.action'
2016-02-26 22:30:04,762 [main           ] INFO  ndingBeanNameUrlHandlerMapping - Mapped URL path [/createSubscriber.action] onto handler '/createSubscriber.action'
2016-02-26 22:30:04,762 [main           ] INFO  ndingBeanNameUrlHandlerMapping - Mapped URL path [/deleteSubscriber.action] onto handler '/deleteSubscriber.action'
2016-02-26 22:30:04,762 [main           ] INFO  ndingBeanNameUrlHandlerMapping - Mapped URL path [/sendMessage.action] onto handler '/sendMessage.action'
2016-02-26 22:30:04,762 [main           ] INFO  ndingBeanNameUrlHandlerMapping - Mapped URL path [/purgeDestination.action] onto handler '/purgeDestination.action'
2016-02-26 22:30:04,763 [main           ] INFO  ndingBeanNameUrlHandlerMapping - Mapped URL path [/deleteMessage.action] onto handler '/deleteMessage.action'
2016-02-26 22:30:04,763 [main           ] INFO  ndingBeanNameUrlHandlerMapping - Mapped URL path [/copyMessage.action] onto handler '/copyMessage.action'
2016-02-26 22:30:04,763 [main           ] INFO  ndingBeanNameUrlHandlerMapping - Mapped URL path [/moveMessage.action] onto handler '/moveMessage.action'
2016-02-26 22:30:04,763 [main           ] INFO  ndingBeanNameUrlHandlerMapping - Mapped URL path [/deleteJob.action] onto handler '/deleteJob.action'
2016-02-26 22:30:04,885 [main           ] INFO  WebAppContext                  - ActiveMQ Console at http://0.0.0.0:8161/admin
2016-02-26 22:30:04,893 [main           ] INFO  ContextHandler                 - started o.e.j.w.WebAppContext{/camel,file:/var/lib/activemq/webapps/camel}
2016-02-26 22:30:04,897 [main           ] INFO  WebAppContext                  - WebApp@5395829 at http://0.0.0.0:8161/camel
2016-02-26 22:30:04,905 [main           ] INFO  ContextHandler                 - started o.e.j.w.WebAppContext{/demo,file:/var/lib/activemq/webapps/demo}
2016-02-26 22:30:04,907 [main           ] INFO  WebAppContext                  - WebApp@5395829 at http://0.0.0.0:8161/demo
2016-02-26 22:30:04,914 [main           ] INFO  ContextHandler                 - started o.e.j.w.WebAppContext{/fileserver,file:/var/lib/activemq/webapps/fileserver}
2016-02-26 22:30:04,918 [main           ] INFO  WebAppContext                  - WebApp@5395829 at http://0.0.0.0:8161/fileserver
2016-02-26 22:30:04,922 [main           ] INFO  AbstractConnector              - Started SelectChannelConnector@0.0.0.0:8161

Veja nos logs que o ActiveMQ foi iniciado com sucesso “starded”.

Verifique o bind da porta 61613, tem que estar escutando.

# netstat -tnpau| grep 61613
tcp6       0      0  :::61613		:::*	LISTEN	5075/java

4. Configuração do Mcollective Server e Cliente

Para a configuração do Mcollective Server e client basta fazer os devidos ajustes nos arquivos client.cfg e server.cfg do Mcollective.

Fique atento as linhas:

plugin.activemq.pool.1.host = puppetserver-01.devopslab.com.br
plugin.activemq.pool.1.port = 61613
plugin.activemq.pool.1.user = mcollective
plugin.activemq.pool.1.password = marionette

# vi /etc/puppetlabs/mcollective/server.cfg

main_collective = mcollective
collectives = mcollective

libdir = /opt/puppetlabs/mcollective/plugins

# consult the "classic" libdirs too
libdir = /usr/share/mcollective/plugins
libdir = /usr/libexec/mcollective

logfile = /var/log/puppetlabs/mcollective.log
loglevel = info
daemonize = 1

# Plugins
securityprovider = psk
plugin.psk = unset

connector = activemq
plugin.activemq.pool.size = 1
plugin.activemq.pool.1.host = puppetserver-01.devopslab.com.br
plugin.activemq.pool.1.port = 61613
plugin.activemq.pool.1.user = mcollective
plugin.activemq.pool.1.password = marionette
#plugin.activemq.pool.1.ssl = false

# Facts
factsource = yaml
plugin.yaml = /etc/puppetlabs/mcollective/facts.yaml

Configuração do Mcollective cliente.
# vi /etc/puppetlabs/mcollective/client.cfg

main_collective = mcollective
collectives = mcollective

libdir = /opt/puppetlabs/mcollective/plugins

# consult the "classic" libdirs too
libdir = /usr/share/mcollective/plugins
libdir = /usr/libexec/mcollective

logger_type = console
loglevel = warn

# Plugins
securityprovider = psk
plugin.psk = unset

connector = activemq
plugin.activemq.pool.size = 1
plugin.activemq.pool.1.host = puppetserver-01.devopslab.com.br
plugin.activemq.pool.1.port = 61613
plugin.activemq.pool.1.user = mcollective
plugin.activemq.pool.1.password = marionette

connection_timeout = 3

Reinicie o Mcollective.

# systemctl start mcollective.service
# systemctl enable mcollective.service

O Log do Mcollective tem que ter uma saída parecida a esta:
#tail –f /var/log/puppetlabs/mcollective.log

^[[AI, [2016-02-26T22:47:36.675684 #5211]  INFO -- : config.rb:167:in `loadconfig' The Marionette Collective version 2.8.7 started by /opt/puppetlabs/puppet/bin/mcollectived using config file /etc/puppetlabs/mcollective/server.cfg
I, [2016-02-26T22:47:36.675875 #5211]  INFO -- : mcollectived:64:in `<main>' The Marionette Collective 2.8.7 started logging at info level
I, [2016-02-26T22:47:36.679816 #5218]  INFO -- : activemq.rb:211:in `initialize' ActiveMQ connector initialized.  Using stomp-gem 1.3.3
I, [2016-02-26T22:47:36.681132 #5218]  INFO -- : activemq.rb:313:in `connection_headers' Connecting without STOMP 1.1 heartbeats, if you are using ActiveMQ 5.8 or newer consider setting plugin.activemq.heartbeat_interval
I, [2016-02-26T22:47:36.681669 #5218]  INFO -- : activemq.rb:114:in `on_connecting' TCP Connection attempt 0 to stomp://mcollective@puppetserver-01.devopslab.com.br:61613
I, [2016-02-26T22:47:36.690413 #5218]  INFO -- : activemq.rb:119:in `on_connected' Connected to stomp://mcollective@puppetserver-01.devopslab.com.br:61613

Veja que o Mcollective se conecta no ActiveMQ.

4.1 Configuração dos nodes/clientes da Rede

Copie o arquivo “client.cfg” e “server.cfg” para a pasta “/etc/puppetlabs/mcollective” de todos os seus clientes e reinicie o mcollective.

# systemctl start mcollective.service
# systemctl enable mcollective.service

5. Teste de funcionamento do Mcollective

Configurado o Mcollective no servidor do Puppet Server e configurados todos os clientes da rede, faça o Login no servidor Puppet Server e teste o Mcollective com o comando mco.

[root@puppetserver-01 ~]# mco find
puppetserver-01
puppetclient-02
puppetclient-01

[root@puppetserver-01 ~]# mco ping 
puppetserver-01                          time=23.88 ms
puppetclient-02                          time=64.69 ms
puppetclient-01                          time=65.56 ms
---- ping statistics ----
3 replies max: 65.56 min: 23.88 avg: 51.37

Foram descobertos 3 clientes Mcollective. Este é o funcionamento básico do Mcollective, que é o teste de comunicação “ping”, porém isto ainda não é a orquestração, ou seja, ainda não é possível executar comandos nos hosts, gerenciar o puppet e etc, para isto necessita-se da instalação de plug-ins.

6. Instalação de Plugins Mcollective – Plugin Puppet

Existem vários plug-ins que controlam vários aspectos do sistema.
Consulte aqui os tipos de plug-ins do Mcollective:
https://docs.puppetlabs.com/mcollective/deploy/plugins.html#about-plugins–available-plugin-types

Existem duas formas de instalar os plug-ins do Mcollective.
A primeira é através dos repositórios da PuppetLabs, que é o que vamos utilizar aqui, simplesmente rodando o comando “yum install plugin***”.

A segunda forma é copiando os arquivos os arquivos de configurações e executáveis (.erb, .rb, .dll) para as pastas das bibliotecas do Mcollective. Esta é a forma mais difícil, porém alguns plugins só podem ser instalados desta forma.

Vamos começar instalando os plug-ins para o gerenciamento remoto do Puppet.

Instale o repositório abaixo tanto no Puppet Server como nos nodes/clientes.

# rpm -hiv https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm

Puppet Server
No Puppet Server instale os Plugins: mcollective-puppet-client e mcollective-puppet-common.

[root@puppetserver-01 /]# yum install mcollective-puppet-client mcollective-puppet-common

No pacote “mcollective-puppet-client” entenda o “client” como se fosse a máquina que vai executar os comandos de orquestração, neste caso o Puppet Server vai executar a orquestração dos clientes.

Nodes/Clientes
Nos nodes/clientes instale os plug-ins: mcollective-puppet-agent e mcollective-puppet-common.

[root@puppetclient-01 /]# yum install mcollective-puppet-agent mcollective-puppet-common

No pacote “mcollective-puppet-agent” entenda o “agent” como sendo os hosts que vão receber os comandos de orquestração, sendo assim o “agent” vai ficar esperando os comandos de orquestração do cliente (Puppet Server).

Após ter instalado os plug-ins, reinicie o Mcollective.

# systemctl restart mcollective.service

6.1 Teste de Orquestração via Mcollective

Acabamos de configurar o Puppet Server e todos os clientes, sendo assim vamos testar, faça o login no Puppet Server para realizarmos alguns testes.

A. Consultar o status do Puppet nos clientes.

[root@puppetserver-01 ~]# mco puppet status -I puppetclient-01
 * [ ============================================================> ] 1 / 1
   puppetclient-01: Currently idling; last completed run 22 minutes 39 seconds ago
Summary of Applying:
   false = 1
Summary of Daemon Running:
   running = 1
Summary of Enabled:
   enabled = 1
Summary of Idling:
   true = 1
Summary of Status:
   idling = 1
Finished processing 1 / 1 hosts in 21.67 ms

B. Re-executar o Puppet em um cliente para que ele verifique o server por novas alterações.
Imagine que você criou uma nova configuração no Puppet Server, por exemplo a edição do arquivo de hosts dos clientes, e quer forçar a aplicação das alterações, para isto você vai executar um “runonce”. Veja:

[root@puppetserver-01 ~]# mco puppet runonce -I puppetclient-01 -I puppetclient-02
 * [ ============================================================> ] 2 / 2
Finished processing 2 / 2 hosts in 125.00 ms

Para saber todas as opções do comando “mco puppet” consulte o help.

# mco help puppet

Finalizamos a orquestração com Mcollective.
Para resumir o funcionamento do Mcollective você precisa ter instalado o ActiveMQ, configurado os arquivos server.cfg e client.cfg e instalação dos Plugins.

Atente-se para a diferença entre “mcollective-puppet-client” e “mcollective-puppet-agent”.

Conforme mencionado neste tutorial, existem vários plugins, por exemplo tem um Plugin que permite a execução de comandos via shell, muito legal este, pois é possível executar comandos do Linux via Mcollective.

Tem também um plugin do Facter, que permite consultar dados do sistema, fazer um inventário, como por exemplo verificar quantas CPUs, Memória, quais os IPs, interface de rede, versão de S.O, qualquer informação sobre o sistema operacional.

Leia: Tutorial Instalação e utilização do plugin Facter

Até a próxima.

Leonardo Macedo Cerqueira