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

Tutorial Orquestração com Mcollective, Instalação e utilização do Facter, populando o arquivo facts.yaml, Utilizando o Mcollective para fazer consultas de inventários.

Introdução

O Mcollective é uma ferramenta que trabalha em conjunto com o Puppet para fazer a Orquestração e execução de tarefas nos hosts.

Muitas tarefas de orquestração precisa de plugin, então neste tutorial vamos aprender a instalar o plugin facter para fazer consultas de inventário via Mcollective.
Se você quiser por exemplo fazer a instalação de pacotres remotamente via Mcollective ou simplesmente reiniciar serviços, você precisará instalar os plugins necessários para esta atividade, e assim por diante.

O Plugin Facter não tem pacotes para a instalação via yum ou apt-get, é preciso copiar os arquivos “.rb” para as pastas “lib” do Mcollective.

Neste link Puppet Plugins tem a lista de plug-ins disponíveis para o puppet.

Alguns plugin tem o pacote para instalação via yum e apt-get.

Infraestrutura do ambiente

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

Pré-requisitos

Você precisa ter o Puppet Server, Puppet Agent e Mcollective funcionando. Você pode seguir estes 2 tutoriais:

Instalação do Puppet Server e Puppet Agent.
Como instalar o Puppet Server e clientes

Mcollective.
Instalação e orquestração via Mcollective

1. Configuração dos clientes/nodes

Faça o login nos seus clientes e copie o arquivo “yaml_facts.rb” para a pasta facts do mcollective.

O arquivo “yaml_facts.rb” já existe no sistema, ele foi instalado junto do Mcollective, e o Mcollective foi instalado junto do puppet-agent, sendo assim utilize o comando find para encontrar.

#find yaml_facts.rb

[root@puppetclient-01 /]# find / -name yaml_facts.rb 
/opt/puppetlabs/puppet/lib/ruby/vendor_ruby/mcollective/facts/yaml_facts.rb

Faça a copia para a pasta facts.

[root@puppetclient-01/]# mkdir /usr/libexec/mcollective/mcollective/facts

[root@puppetclient-01 /]# cp -v /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/mcollective/facts/yaml_facts.rb /usr/libexec/mcollective/mcollective/facts
‘/opt/puppetlabs/puppet/lib/ruby/vendor_ruby/mcollective/facts/yaml_facts.rb’ -> ‘/usr/libexec/mcollective/mcollective/facts/yaml_facts.rb’

Configure as linhas abaixo no arquivo: /etc/puppetlabs/mcollective/server.cfg.

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

Estas linhas já existem na verdade, mas você precisa garantir isto, sendo assim verifique.

Reincie o Mcollective.

#systemctl restart mcollective.service

Agora precisamos popular o arquivo facts.yaml.

[root@puppetclient-01 /]# facter --yaml > /etc/puppetlabs/mcollective/facts.yaml

2. Utilização do Mcollective – Fazendo consultas com o Mcollective

Faça o login no Puppet Server e faça a consulta.

[root@puppetserver-01 /]#mco inventory  puppetclient-01

Eu editei a saída pois são muitas coisas, mas é algo parecido com isto.

....
Facts:
      augeas => {"version"=>"1.4.0"}
      ...
      facterversion => 3.1.4
      filesystems => xfs
      identity => {"gid"=>"0", "group"=>"root", "uid"=>"0", "user"=>"root"}
      is_virtual => true
      kernel => Linux
      kernelmajversion => 3.10
      kernelrelease => 3.10.0-327.10.1.el7.x86_64
      kernelversion => 3.10.0
      load_averages => {"15m"=>"0.05", "1m"=>"0", "5m"=>"0.01"}
...

Perceba que a saída não é muito amigável, no entanto é completa. Abaixo vamos criar um módulo para a criação do facter.yaml de forma automática e com uma saída mais amigável.

É possível personalizar a consulta de inventário com filtros e scripts.
Como fazer os scripts você pode consultar aqui: http://docs.puppetlabs.com/mcollective/reference/ui/nodereports.html

Bom, tudo que nós fizemos aqui foi de forma manual para demonstrar, então o que fizemos foi:

Configuração do arquivo server.cfg
Copiamos o arquivo yaml_facts.rb para a pasta facts do Mcollective.
Populamos o arquivo facts.yaml.
Reiniciamos o Mcollective.

Porém obviamente estes 4 processos precisam ser feito via Puppet de forma automática.

3. Criando um módulo para a instalação automática do plugin facter e população do facts.yaml

O que será feito:


Cópia do arquivo server.cfg do mcollective.
Cópia do arquivo yaml_facts.rb para a pasta facts do Mcollective.
Criar o arquivo facts.yaml populado com os fatos.
Restart do Mcollective.

3.1. Primeiramente vamos criar um módulo, o nome pode ser Mcollective.

#cd /etc/puppetlabs/code/environments/production/modules
#puppet module generate --skip-interview devopslav-mcollective

Utilizei a opção “–-skip-interview” pois não quero responder ao monte de perguntas para a criação dos metadados do módulo, mas é interessante saber sobre isto.

3.2. Crie uma pasta “files” para o armazenamento dos arquivos server.cfg e yaml_facts.rb, já que estes 2 arquivos serão copiados para os clientes.

#mkdir /etc/puppetlabs/code/environments/production/modules/mcollective/files

#cp /etc/puppetlabs/mcollective/server.cfg /etc/puppetlabs/code/environments/production/modules/mcollective/files

#cp /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/mcollective/facts/yaml_facts.rb /etc/puppetlabs/code/environments/production/modules/mcollective/files

3.3. Vamos fazer a definir a classe para popular o arquivo facter.yaml.
Lembre-se que existem várias formas de definir uma classe

#cd /etc/puppetlabs/code/environments/production/modules/mcollective/manifests 
#vi facter.pp
class mcollective::facter {

#Dependencias
	package { 'puppet-agent':
  	ensure => 'installed',
	}

	service { 'mcollective.service':
  	ensure => 'running',
	}


#Criação do arquivo arquivo server.cfg
	file {"server.cfg":
	path	=> '/etc/puppetlabs/mcollective/server.cfg',
   	source 	=> 'puppet:///modules/mcollective/server.cfg',
#O arquivo server.cfg foi copiado para a pasta file do pupper master. 
#Crie a pasta file dentro do modulo.
#/etc/puppetlabs/code/environments/production/modules/mcollective/files/server.cfg 
	ensure	=> 'file',
    	owner   => 'root',
    	group   => 'root',
    	mode    => '0644',
    	require => Package['puppet-agent'],
    	notify  => Service['mcollective.service'],
  	}


#criação do diretorio facts.
	file { "/usr/libexec/mcollective/mcollective/facts/":
	ensure => 'directory',
    	owner  => 'root',
    	group  => 'root',
    	mode   => '0755',
	}


#copia do arquivo yaml_facts.rb para a pasta facts
	file { "yaml_facts.rb":
    	path     => "/usr/libexec/mcollective/mcollective/facts/yaml_facts.rb",
#O arquivo yaml_facts.rb esta dentro da pasta file do puppet master.
#Crie a pasta file dentro do modulo.
#/etc/puppetlabs/code/environments/production/modules/mcollective/files/yaml_facts.rb
    	source   => "puppet:///modules/mcollective/yaml_facts.rb",
	ensure   => 'file',
    	owner    => 'root',
    	group    => 'root',
    	mode     => '0644',
    	require  => File["/etc/puppetlabs/mcollective/server.cfg"],
  	}


#preencher o arquivo facts.yaml com os fatos. populate facts.yaml.
	file{"/etc/puppetlabs/mcollective/facts.yaml":
      	owner    => root,
      	group    => root,
      	mode     => '0640',
      	loglevel => debug, # reduce noise in Puppet reports
      	content  => inline_template("<%= scope.to_hash.reject { |k,v| k.to_s =~ /(uptime_seconds|timestamp|free)/ }.to_yaml %>"), # exclude rapidly changing facts
	notify   => Service['mcollective.service'],
    	}

}

3.4. Crie a definição do node

root@puppetserver-01 ~]# cd /etc/puppetlabs/code/environments/production/manifests 
[root@puppetserver-01 ~]# vi puppetclient-01.pp

node 'puppetclient-02.devopslab.com.br'  {
	include mcollective::facter
}

Agora execute no cliente puppetclient-01 o comando “puppet agente –t”.

[root@puppetclient-01 ~]# puppet agent -t

O comando vai baixar o arquivo server.cfg, popular o facter.yaml e reiniciar o mcollective.

Consulte o inventário.

[root@puppetserver-01 ~]# mco inventory puppetclient-01

Agora a saída está muito melhor certo? ficou melhor pois na definição da classe mcollective::facter foi colocado a opção:

content  => inline_template("<%= scope.to_hash.reject { |k,v| k.to_s =~ /(uptime_seconds|timestamp|free)/ }.to_yaml %>"),

Isto deixa a saída um pouco mais legível.

Referências:
http://docs.puppetlabs.com/mcollective/deploy/standard.html#step-4-configure-servers
https://docs.puppetlabs.com/mcollective/deploy/plugins.html#about-plugins–available-plugin-types
http://docs.puppetlabs.com/mcollective/reference/ui/nodereports.html

See you.

Leonardo

3 comentários sobre “Puppet – Facter – Orquestração via Mcollective – Instalação e utilização do Plugin Facter

  1. Excelente post Leandro,

    Porem meu mcollective não encontra nenhum host ja configurado no puppet…e no log não aparece nada de anormal…sabe o que pode ser?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *