CMDB as Code, simples, fácil e rápido!

O que é um CMDB?

Se você trabalha na área de TI certamente já ouviu alguém falar sobre CMDB. CMDB é uma ferramenta com um banco de dados para guardar todos os ICs da empresa, hãããnn!? CMDB?!? ICs??! calma, calma, calma!! :). Explicando melhor, CMDB significa Configuration Management Database, e IC, Item de Configuração (IC), um IC é qualquer elemento tecnológico pertencente aos serviços de TI que necessite uma configuração ou uma gestão de configuração, ficou mais claro agora?

No folclore internético existe um ditado que diz assim, “There are only two hard things in Computer Science: cache invalidation and naming things.” –Phil Karlton, numa tradução livre seria “Há apenas duas coisas difíceis na Ciência da Computação: invalidação de cache e dar nomes a coisas”, eu, humildemente acrescentaria um terceiro ponto a esse folclore, criar e manter um (CMDB) consistente é uma coisa bem difícil. Difícil por inúmeras razões, aquisição da ferramenta, custo, administração e gestão da consistência dos [itens de configuração](https:// en.wikipedia.org/wiki/Configuration_management_database#Configuration_item_types).

Não é porque uma coisa é difícil que ela seja impossível de ser feita, e é exatamente esse o ponto do Ansible-CMDB, como fazer um levantamento do seu parque de máquinas e ter um resumo das características principais de maneira rápida?

Rápido e fácil

Como fazer um levantamento do seu parque de máquinas e ter num relatório das principais características de maneira rápida? Para ilustrar essa ideia é utilizado o Vagrant para criar um parque de máquinas com dez hosts simulando um ambiente de empresa.

O código abaixo é um vagrantfile que contém todas as definições do ambiente. Caso queira relembrar os passos de instalação e comandos básicos do Vagrant veja o post anterior Conhecendo o Vagrant.

 1# -*- mode: ruby -*-
 2# vi: set ft=ruby :
 3
 4# variaveis
 5
 6 vhosts =[
 7  { :hostname => "infra-as-code-br", :box => "bento/ubuntu-18.04", :ip =>"10.10.10.100", :memory => "1024"},
 8  { :hostname => "bo",        :box => "minimal/centos6",  :ip =>"10.10.10.101", :memory => "256"},
 9  { :hostname => "stretch",     :box => "minimal/centos7",  :ip =>"10.10.10.102", :memory => "256"},
10  { :hostname => "jessie",      :box => "minimal/centos7",  :ip =>"10.10.10.103", :memory => "512"},
11  { :hostname => "squeeze",     :box => "minimal/centos6",  :ip =>"10.10.10.104", :memory => "256"},
12  { :hostname => "etch",       :box => "minimal/xenial64",  :ip =>"10.10.10.105", :memory => "256"},
13  { :hostname => "sarge",      :box => "minimal/centos6",  :ip =>"10.10.10.106", :memory => "512"},
14  { :hostname => "slink",      :box => "minimal/centos7",  :ip =>"10.10.10.107", :memory => "256"},
15  { :hostname => "woody",      :box => "minimal/xenial64",  :ip =>"10.10.10.108", :memory => "512"},
16  { :hostname => "potato",      :box => "minimal/trusty64",  :ip =>"10.10.10.109", :memory => "256"},
17  { :hostname => "rex",       :box => "minimal/centos6",  :ip =>"10.10.10.110", :memory => "512"},
18 ]
19
20Vagrant.configure("2") do |config|
21
22 vhosts.each do |vhost|
23
24  config.vm.define vhost[:hostname] do |node|
25   node.vm.box = vhost[:box]
26   node.vm.hostname = vhost[:hostname]
27   node.vm.box_url = vhost[:box]
28   node.vm.boot_timeout = 3600
29   node.vm.network :private_network, ip: vhost[:ip], virtualbox__intnet: true
30   node.vm.provider :virtualbox do |v|
31    v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
32    v.customize ["modifyvm", :id, "--memory", vhost[:memory]]
33    v.customize ["modifyvm", :id, "--name", vhost[:hostname]]
34   end
35   if vhost[:hostname] == "infra-as-code-br"
36    node.vm.provision "shell",
37     inline: "sudo apt update ; sudo apt install python-pip sshpass -y ; cp /vagrant/hosts.ini /home/vagrant/hosts.ini"
38   end
39  end
40 end
41end

Criando o ambiente de testes.

$ wget https://raw.githubusercontent.com/leoml/blog-infraascode/master/posts/CMDB-as-code/Vagrantfile $ vagrant up

A máquina infra-as-code-br será utilizada como base para disparar comandos de coleta e extração de dados do ambiente.

$ vagrant ssh infra-as-code-br $$ vagrant@infra-as-code-br:

Ferramentas de automação

Nessa etapa são utilizadas duas ferramentas de automação, Ansible para a coleta de dados e Ansible-CMDB para a do CMDB e geração de relatórios. Ansible é uma ferramenta de automação de tarefas voltada para realizar configurações de ambientes computacionais. Essa é uma explicação bastante sucinta sobre o Ansible mas por ora vamos ficar com ela. (Prometo em breve um post mais completo sobre Ansible ;) ).

Os procedimentos de instalação do Ansible é o seguinte.

vagrant@infra-as-code-br:$ sudo pip install ansible

Ferramenta de CMDB

O processo de instalação do Ansible-CMDB é tão simples quanto o seguinte comando.

vagrant@infra-as-code-br:$ sudo pip install ansible-cmdb

Gerando um CMDB do seu ambiente

Com o Ansible-CMDB instalado a geração do relatório se dá em duas etapas, são elas:

Coleta de dados com o Ansible

vagrant@infra-as-code-br:$ ansible infra_as_code_br -i hosts.ini -m setup – tree saida

Criação do relatório

vagrant@infra-as-code-br:$ ansible-cmdb saida/ CMDB_as_code.html

Resultados

O Ansible-CMDB é capaz de gerar um resultado nos seguintes formatos de saída: HTML, JSON, CSV, SQL entre outros. Como resultado foram utilizados dois modelos de formatação de saída um em HTML e outro no formato TXT.

Formatado em HTML

O resultado completo da saída HTML pode ser encontrado nesse link HTML, melhor visualização é salvando e abrindo localmente.

Formatado em TXT

O resultado completo em formato TXT pode ser encontrado neste link TXT.

Name     OS      IP     Mem CPUs 
------------ ------------ --------- --- ---- 
10.10.10.110 CentOS 6.6  10.0.2.15 0g  1   
10.10.10.106 CentOS 6.6  10.0.2.15 0g  1   
10.10.10.107 CentOS 7.0  10.0.2.15 0g  1   
10.10.10.104 CentOS 6.6  10.0.2.15 0g  1   
10.10.10.105 Ubuntu 16.04 10.0.2.15 0g  1   
10.10.10.102 CentOS 7.0  10.0.2.15 0g  1   
10.10.10.103 CentOS 7.0  10.0.2.15 0g  1   
10.10.10.100 Ubuntu 18.04 10.0.2.15 1g  1   
10.10.10.101 CentOS 6.6  10.0.2.15 0g  1   
10.10.10.108 Ubuntu 16.04 10.0.2.15 0g  1   
10.10.10.109 Ubuntu 14.04 10.0.2.15 0g  1   

Conclusão

Para a gestão de TI um CMDB é fundamental ter uma visão completa dos componentes gerenciados, extrair relatórios de estados e planejar mudanças. O Ansible-CMDB funciona de maneira simples e se mostra uma alternativa viável e acessível para se conhecer minimamente as características de um ambiente. A ferramenta ainda apresenta um baixo custo de instalação, baixo custo de manutenção e uma curva de aprendizado muito pequena.

Outro ponto a ressaltar por ser simples, fácil de instalar de utilizar o Ansible-CMDB não possui muitas funcionalidade quando comparada com outras ferramentas de mercado que são muito bem pagas. Entretanto, o objetivo do Ansible-CMDB é ser tão simples quando descrito em sua documentação oficial que diz assim, “O Ansible-cmdb pega a saída da coleta de fatos gerados pelo Ansible e as converte em uma página estática de visão geral de HTML que contém informações de configuração do sistema”.

Boa sorte com a gestão dos seus ambientes!!

Dicas duca!!

 - O Ansible-CMDB gera relatórios em JSON, você pode alimentar uma outra base de CMDB.  - Você pode jogar tudo num arquivo CSV e trabalha no Excel.  - Pode gerar uma saída no formato Markdown e gerar um documento formatado da sua infraestrutura.  - Você pode gerar uma saída SQL e importa no MySQL ou no SQL Server.  - Não limite sua criatividade ;)

Referências

 - Vagrant file: https://raw.githubusercontent.com/leoml/blog-infraascode/master/posts/CMDB-as-code/Vagrantfile  - Ansible: https://ansible-cmdb.readthedocs.io/en/latest/usage/  - Todos os fontes deste post: https://github.com/leoml/blog-infraascode/tree/master/posts/CMDB-as-code  - Origem do nomes das máquinas: https://wiki.debian.org/DebianReleases

Convido você a ver os outros posts do Infra-as-Code


Eu adoraria ouvir suas outras histórias e situações semelhantes ao que acabei de escrever neste post, você pode me encontrar em @infraascode_br ou linkedin.com/in/leonardoml/ .

Te convido a ver os outros posts do blog Infra-as-Code garanto que tem coisas legais lá!!


--- --- IMPORTANTE --- ---
As opiniões aqui expressas são pessoais e de responsabilidade única e exclusiva do autor, elas não refletem necessariamente a posição das empresas que eu trabalho(ei) e/ou presto(ei) serviço.