Infraestrutura Ágil

Soluções e métodos inteligentes para sua infra

Instalando ActiveMQ 5.9 para Mcollective 2.8.2 do Puppet Agent 1.2.2 no CentOS 7 (v1.0)

1. Mcollective no Puppet 4

O Puppet Agent 1.2.2 do Puppet 4.2 já traz o Mcollective embutido, se você instalou o agente do puppet você também instalou o Mcollective. Neste post vou mostrar como instalar o ActiveMQ e como configurar o Mcollective do Puppet Agent 1.2.2 do Puppet 4 para falar com o ActiveMQ.

Este post é resultado de um dia de hacklab que fiz com o Miguel Filho (@mciurcio).

2. Dependências

Instalar o Puppet Agent e Server do Puppet 4.2 conforme o post anterior é pré-requisito, vamos usar a mesma VM para rodar o ActiveMQ e utilizar o Mcollective.

2.1 Cenário

Vagrant+Virtualbox rodando VM com CentOS 7
Puppet Agent 1.2.2 (Puppet 4.2)
Mcollective 2.8.2 embutido no puppet-agent 1.2.2 (Puppet 4.2)
ActiveMQ 5.9

3. Apache ActiveMQ 5.9

O ActiveMQ é o serviço de fila utilizado pelo Mcollective.

3.2 Instalando Repositório

Para instalar o ActiveMQ é necessário utilizar pacotes do Puppet 3.x pois ele ainda não está no repositório PC1 do Puppet 4.2.

[root@puppetserver4 ~]# yum install http://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm -y

3.1 Instalando ActiveMQ

[root@puppetserver4 ~]# yum install activemq -y

3.2 Configurando ActiveMQ

Edite o arquivo de configuração do Mcollective Server

[root@puppetserver4 ~]# vim /etc/activemq/activemq.xml

Apague o conteúdo anteriror, adicione o conteúdo abaixo ao arquivo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:amq="http://activemq.apache.org/schema/core"
  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-2.0.xsd
  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd
  http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd">

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="puppetserver4.hacklab" useJmx="true">
        <managementContext>
            <managementContext createConnector="false"/>
        </managementContext>


        <plugins>
          <statisticsBrokerPlugin/>
          <simpleAuthenticationPlugin>
            <users>
              <authenticationUser username="mcollective" password="marionette" groups="mcollective,everyone"/>
              <authenticationUser username="admin" password="admin" groups="mcollective,admins,everyone"/>
            </users>
          </simpleAuthenticationPlugin>
          <authorizationPlugin>
            <map>
              <authorizationMap>
                <authorizationEntries>
                  <authorizationEntry queue=">" write="admins" read="admins" admin="admins" />
                  <authorizationEntry topic=">" write="admins" read="admins" admin="admins" />
                  <authorizationEntry topic="mcollective.>" write="mcollective" read="mcollective" admin="mcollective" />
                  <authorizationEntry queue="mcollective.>" write="mcollective" read="mcollective" admin="mcollective" />
                  <authorizationEntry topic="ActiveMQ.Advisory.>" read="everyone" write="everyone" admin="everyone"/>
                </authorizationEntries>
              </authorizationMap>
            </map>
          </authorizationPlugin>
        </plugins>

        <systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="20 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb" name="foo"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="100 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

        <transportConnectors>
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
            <transportConnector name="stomp+nio" uri="stomp://0.0.0.0:61613"/>
        </transportConnectors>
    </broker>

</beans>

Salve

:wq

Crie o link simbólico do diretório data

[root@puppetserver4 ~]# ln -s /usr/share/activemq/activemq-data /usr/share/activemq/data

Há um issue aberto para corrigir essa questão do link, vote pela correção!

https://github.com/puppetlabs/puppetlabs-activemq/pull/38

3.3 Iniciando ActiveMQ

Inicie o serviço com o comando abaixo

[root@puppetserver4 ~]# systemctl start activemq

3.4 Verificando Serviço

Verifique no arquivo de log do serviço se ele subiu

[root@puppetserver4 ~]# tail -f  /var/log/activemq/activemq.log

Uma linha similar a esta deve estar presente nas últimas linhas

2015-08-21 19:50:40,791 [main           ] INFO  BrokerService                  - Apache ActiveMQ 5.9.1 (puppetserver4.hacklab, ID:puppetserver4.hacklab-52815-1440186640199-0:1) started

Verifique se a porta 61613 TCP está em modo LISTEN

[root@puppetserver4 activemq]# netstat -ntpl|grep 61613
 tcp6       0      0 :::61613                :::*                    LISTEN      19183/java

Se teve todas essas saídas seu ActiveMQ está ok!

4. Mcollective 2.8.2

O Mcollective é o oquestrador do Puppet, o principal objetivo dele é invocar o agente do puppet de forma direta e paralela caso necessário, fazendo isto em todos os nodes do seu parque - quando for preciso fazê-lo.

4.1 Configurando Mcollective Server

Edite o arquivo abaixo server.cfg do mcollective

[root@puppetserver4 ~]# vim /etc/puppetlabs/mcollective/server.cfg

Apague o conteúdo anteriror, adicione o conteúdo abaixo ao arquivo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
main_collective = mcollective
collectives = mcollective
libdir = /opt/puppetlabs/puppet/lib/ruby/vendor_ruby:/opt/puppetlabs/mcollective/plugins
logfile = /var/log/mcollective.log
loglevel = info
identity = puppetserver4.hacklab
daemonize = 1
direct_addressing = 0

# Plugins
securityprovider = psk

plugin.psk = hacklab

connector = activemq

plugin.activemq.pool.size = 1
plugin.activemq.pool.1.host = puppetserver4.hacklab
plugin.activemq.pool.1.port = 61613
plugin.activemq.pool.1.user = mcollective
plugin.activemq.pool.1.password = marionette
plugin.activemq.pool.1.ssl = false

plugin.package.provider = puppet

plugin.puppetca.cadir = /srv/puppetca/ca/

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

classesfile = /var/lib/puppet/state/classes.txt

# Registration
registerinterval = 300
registration = Agentlist

Reinicie o Mcollective.

[root@puppetserver4 ~]# systemctl restart mcollective

4.1.1 Verificando Mcollective Server

Verifique no log se o mcollective se conectou ao activeMQ

[root@puppetserver4 mcollective]# tail -f /var/log/mcollective.log

Você verá uma mensagem similar a esta

[2015-08-21T19:50:53.749595 #20554]  INFO -- : activemq.rb:119:in `on_connected' Connected to stomp://mcollective@puppetserver4.hacklab:61613

Se recebeu uma linha similar, seu Mcollective Server está Ok

4.2 Configurando Mcollective Client

Edite o arquivo de configuração do Mcollective Client

[root@puppetserver4 ~]# vim /etc/activemq/activemq.xml

Adicione o conteúdo abaixo ao arquivo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
main_collective = mcollective
collectives = mcollective
libdir = /opt/puppetlabs/puppet/lib/ruby/vendor_ruby:/opt/puppetlabs/mcollective/plugins
logfile = /dev/null
loglevel = info
direct_addressing = 0

# Plugins
securityprovider = psk

plugin.psk = hacklab

plugin.package.provider = puppet

connector = activemq

plugin.activemq.pool.size = 1
plugin.activemq.pool.1.host = puppetserver4.hacklab
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

default_discovery_method = mc

4.3 Testando Mcollective

Buscando nodes com serviço mcollective rodando

[root@puppetserver4 mcollective]# mco find
puppetserver4.hacklab

Enviando ping para verificar tempo de resposta dos nodes

[root@puppetserver4 mcollective]# mco ping
puppetserver4.hacklab                    time=18.49 ms

5. Amarrando as pontas

Apesar das mudanças em Paths o Mcollective continua o mesmo. No momento ainda não existem pacotes com os plugins para manipular seviços, pacotes e o próprio Puppet, é necessário instalar os plugins manualmente, vou tratar da instalação destes plugins no próximo post.

[s]
Guto

Instalando Puppet Agent 4 e Puppet Master 4 em CentOS 7 (v1.5)

Este é o primeiro post que escrevo sobre o Puppet 4, a ideia aqui é demonstrar a instalação e a configuração mínima para você ter um Puppet Agent e Puppet Server do Puppet 4.2 rodando na mesma VM.

Este post é resultado de um dia de hacklab que fiz com o Miguel Filho (@mciurcio).

1. Cenário do HackLab

O hacklab foi realizado no cenário abaixo:

Macbook Pro 11.1
- OSX 10.11 (El Capitan)
  - VAGRANT 1.7.4
    - BOX CentOS 7 da Puppet Labs 
  - VIRTUALBOX 5.0

2. Configurando Vagrant

Crie um diretório para seu projeto

$ mkdir -p ~/vagrant/projects/puppet4
$ cd ~/vagrant/projects/puppet4

Adicione a box ao vagrant

$ vagrant box add —-name centos7x64 https://atlas.hashicorp.com/puppetlabs/boxes/centos-7.0-64-puppet/versions/1.0.2/providers/virtualbox.box

Crie o arquivo Vagrantfile dentro do diretório do projeto

$ pwd
~/vagrant/projects/puppet4
$ vim Vagrantfile 

Adicione o conteúdo abaixo ao arquivo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- mode: ruby -*-

# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      config.vm.hostname = "puppetserver4.hacklab"
      config.vm.box = "centos7x64"
      config.vm.network "private_network", ip: "192.168.200.88"

      config.vm.provider "virtualbox" do |virtualbox|
          virtualbox.customize [ "modifyvm", :id, "--cpus", "2" ]
          virtualbox.customize [ "modifyvm", :id, "--memory", "4096" ]
     end
end

Salve

:wq

Agora inicie a VM

$ vagrant up

Acesse a VM

$ vagrant ssh
[vagrant@puppetserver4 ~]$ sudo -i
[root@puppetserver4 ~]#

Pronto, agora podemos começar.

3. Instalando Repositório

3.1 Repositório

Instale o repositório da puppetlabs para o puppet 4

[root@puppetserver4 ~]# yum install http://yum.puppetlabs.com/el/7/PC1/x86_64/puppetlabs-release-pc1-0.9.2-1.el7.noarch.rpm -y

4. Instalando Agent

4.1 Removendo Puppet Agent 3

Remova o puppet 3 que vem na box

[root@puppetserver4 ~]# yum remove puppet -y

4.2 Pesquisando por pacotes

Pesquise por pacotes Puppet

[root@puppetserver4 ~]# yum search puppet

A saída da busca deve ser similar a esta

1
2
3
4
5
6
7
puppet-agent.x86_64 : The Puppet Agent package contains all of the elements needed to run puppet, including ruby,
                    : facter, hiera and mcollective.
puppetdb.noarch : Puppet Labs - puppetdb
puppetdb-termini.noarch : Termini for puppetdb
puppetdb-terminus.noarch : Metapackage to allow easy upgrades from PuppetDB 2
puppetlabs-release-pc1.noarch : Release packages for the Puppet Labs PC1 repository
puppetserver.noarch : Puppet Labs - puppetserver

Se viu uma saída similar, isto significa que a instalação do repositório teve sucesso.

4.3 Configurando Hosts

Ajuste o endereço localhost em s eu arquivo hosts

[root@puppetserver4 ~]# echo "127.0.0.1 localhost localhost.localdomain" > /etc/hosts

Ajuste o endereço do servidor puppet

[root@puppetserver4 ~]# echo "192.168.200.88 puppetserver4.hacklab puppetserver4 puppet" >> /etc/hosts

4.4 Configurando Hostname

Vamos ajustar hostname do OS para gerar certificados mais adiante

[root@puppetserver4 ~]# echo "puppetserver4.hacklab" > /etc/hostname

Por default o certificados do agente tem o mesmo nome do conteúdo desse arquivo.

4.5 Instalando Puppet Agent 1.2.2 do Puppet 4.2

Instale puppet agent 1.2.2

[root@puppetserver4 ~]# yum install puppet-agent -y

4.6 Ajustando Path para binários

Teste o puppet agent

[root@puppetserver4 ~]# puppet
-bash: puppet: command not found

Corrija o path para utilizar os recursos do Puppet 4.2

[root@puppetserver4 ~]# echo "export PATH=/opt/puppetlabs/bin:$PATH" > /etc/profile.d/puppet_path.sh
[root@puppetserver4 ~]# source /etc/profile.d/puppet_path.sh

4.7 Corrigindo locales

Após definir o path rode o puppet

[root@puppetserver4 ~]# puppet

Você provavelmente vai receber esta saída

terminate called after throwing an instance of 'std::runtime_error' what():  locale::facet::_S_create_c_locale name not valid
Aborted

Defina o valor para a variável LC_ALL globalmente para resolver isto até que o bug seja corrijido.

[root@puppetserver4 ~]# echo "export LC_ALL=en_US.UTF-8" > /etc/profile.d/puppet_locale.sh

Carregue a configuração de locale

[root@puppetserver4 ~]# source /etc/profile.d/puppet_locale.sh

Teste novamente

[root@puppetserver4 ~]# puppet --version
4.2.1

Há um ticket aberto para corrigir o problema, vote e acompanhe.

https://tickets.puppetlabs.com/browse/SERVER-779

4.8 Testando o novo facter

Verificando informações de uptime

[root@puppetserver4 production]# facter system_uptime
1
2
3
4
5
6
{
  days => 0,
  hours => 0,
  seconds => 2546,
  uptime => "0:42 hours"
}

Verificando informações de ruby

[root@puppetserver4 production]# facter ruby
1
2
3
4
5
{
  platform => "x86_64-linux",
  sitedir => "/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.1.0",
  version => "2.1.6"
}

Verificando informações de OS

[root@puppetserver4 production]# facter os
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  architecture => "x86_64",
  family => "RedHat",
  hardware => "x86_64",
  name => "CentOS",
  release => {
    full => "7.0.1406",
    major => "7",
    minor => "0"
  },
  selinux => {
    enabled => false
  }
}

Verificando informações de load average

[root@puppetserver4 production]# facter load_averages
1
2
3
4
5
load_averages => {
  15m => 0.09,
  1m => 0.09,
  5m => 0.07
}

Verificando informações de networking

[root@puppetserver4 production]# facter networking
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{
  dhcp => "10.0.2.2",
  domain => "hacklab",
  fqdn => "puppetserver4.hacklab",
  hostname => "puppetserver4",
  interfaces => {
    enp0s3 => {
      dhcp => "10.0.2.2",
      ip => "10.0.2.15",
      ip6 => "fe80::a00:27ff:fe19:cd16",
      mac => "08:00:27:19:cd:16",
      mtu => 1500,
      netmask => "255.255.255.0",
      netmask6 => "ffff:ffff:ffff:ffff::",
      network => "10.0.2.0",
      network6 => "fe80::"
    },
    enp0s8 => {
      dhcp => "192.168.56.100",
      ip => "192.168.200.88",
      ip6 => "fe80::a00:27ff:fe7a:5943",
      mac => "08:00:27:7a:59:43",
      mtu => 1500,
      netmask => "255.255.255.0",
      netmask6 => "ffff:ffff:ffff:ffff::",
      network => "192.168.200.0",
      network6 => "fe80::"
    },
    lo => {
      ip => "127.0.0.1",
      ip6 => "::1",
      mtu => 65536,
      netmask => "255.0.0.0",
      netmask6 => "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
      network => "127.0.0.0",
      network6 => "::1"
    }
  },
  ip => "10.0.2.15",
  ip6 => "fe80::a00:27ff:fe19:cd16",
  mac => "08:00:27:19:cd:16",
  mtu => 1500,
  netmask => "255.255.255.0",
  netmask6 => "ffff:ffff:ffff:ffff::",
  network => "10.0.2.0",
  network6 => "fe80::"
}

Veja que puppet 4 já usa novo facter (projeto cfacter), esse novo facter traz todos os fatos de forma estruturada e organizada, permitindo um uso muito mais simples dessas informações em nossos manifests.

Se voce quer referenciar o fato fqdn do agrupamento networking faça isso

[root@puppetserver4 production]# facter networking.fqdn

Se voce quer referenciar o mesmo fato em um manifest faça assim

$::networking['fqdn']

4.9 Novos Paths

Agora o puppet é instalado em modo AIO (all in one), isto significa que ele é um pacote único que já traz tudo o que você precisa, incluindo ai neste pacote binários, libs, confs, é tudo independente do OS. E tem um novo diretório também

/opt/puppetlabs

As configurações ficam em

/etc/puppetlabs
/etc/puppetlabs/puppet
/etc/puppetlabs/mcollective

Agora o mcollective já vem junto no pacote como parte integrante e permanente do agente.

5 Puppet Server

5.1 Instalando o pacote

Agora vamos instalar o Puppet Server novo

[root@puppetserver4 ~]# yum install puppetserver -y

5.2 Gerando certificados

Antes de iniciar o Puppet Server, rode o comando abaixo para gerar os certificados, os certificados deveriam ser gerados na inicialização do serviço, mas no momento isto não está ocorrendo, então você vai gerá-los com os comandos abaixo

[root@puppetserver4 ~]# puppet cert list -a
[root@puppetserver4 ~]# puppet cert generate puppetserver4.hacklab --dns_alt_names=puppet

A saída esperada é esta

1
2
3
4
Notice: puppetserver4.hacklab has a waiting certificate request
Notice: Signed certificate request for puppetserver4.hacklab
Notice: Removing file Puppet::SSL::CertificateRequest puppetserver4.hacklab at '/etc/puppetlabs/puppet/ssl/ca/requests/puppetserver4.hacklab.pem'
Notice: Removing file Puppet::SSL::CertificateRequest puppetserver4.hacklab at '/etc/puppetlabs/puppet/ssl/certificate_requests/puppetserver4.hacklab.pem'

Há um ticket aberto para corrigir o problema, vote e acompanhe.

https://tickets.puppetlabs.com/browse/SERVER-528

5.3 Parametrização JVM

Veja os parâmetros de memória da JVM, ajuste conforme sua necessidade

[root@puppetserver4 ~]# cat /etc/sysconfig/puppetserver|grep JAVA_ARGS
JAVA_ARGS="-Xms2g -Xmx2g -XX:MaxPermSize=256m"

5.4 Parametrização do Systemd

Dependendo do HW de sua VM e da quantidade de recursos, o serviço puppetserver pode demorar a subir, o systemd tem um timeout padrão que pode ser atingido antes do puppetserver iniciar, se isto acontecer o próprio systemd mata o processo, para resolver isto temos que aumentar esse timeout default do systemd.

echo "START_TIMEOUT=300" >> /etc/sysconfig/puppetserver

Inicie o puppet server (isto pode demorar)

[root@puppetserver4 ~]# systemctl start puppetserver

Verifique se o processo subiu

[root@puppetserver4 ~]# ps afxwww|grep java

A saída esperada será similar a esta

 3277 ?        Ssl    0:53 /usr/bin/java -Xms2g -Xmx2g -XX:MaxPermSize=256m -XX:OnOutOfMemoryError=kill -9 %p -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/puppetlabs/puppetserver -Djava.security.egd=/dev/urandom -cp /opt/puppetlabs/server/apps/puppetserver/puppet-server-release.jar clojure.main -m puppetlabs.trapperkeeper.main --config /etc/puppetlabs/puppetserver/conf.d -b /etc/puppetlabs/puppetserver/bootstrap.cfg

Há um ticket aberto para corrigir o problema, vote e acompanhe.

 https://tickets.puppetlabs.com/browse/SERVER-557   

5.5 Ajustando o puppet.conf

Edite o arquivo puppet.conf

[root@puppetserver4 ~]# yum install vim -y
[root@puppetserver4 ~]# vim /etc/puppetlabs/puppet/puppet.conf

Adicione a configuração abaixo no puppet.conf ao final do arquivo

[agent]
certname = puppet4server.hacklab

Salve

:wq!

Essa configuração se faz necessária para o agente não regerar o certificado caso algo no /etc/hostname mude, isso poderia quebrar o master e o agent.

5.6 Testando Puppet Server

Uma vez que temos o Puppet Agent e Server instalados, podemos agora empurrar uma configuração para validar o ambiente, vale informar que o diretório dos environments mudou para

 /etc/puppetlabs/code/environments

Verifque o fato fqdn

[root@puppetserver4 puppetlabs]# facter networking.fqdn
 puppetserver4.hacklab

Agora crie uma configuração simples

[root@puppetserver4 ~]# vim /etc/puppetlabs/code/environments/production/manifests/site.pp

Adicione o conteúdo abaixo

1
2
3
4
5
6
7
8
9
node "puppetserver4.hacklab" {

  package { 'nmap':
    ensure => present,
  }

  notify { "O FQDN desta VM eh ${::networking['fqdn']}": }

}

Salve

:wq

Rode o agente

1
2
3
4
5
6
7
8
9
[root@puppetserver4 puppetlabs]# puppet agent -t
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppetserver4.hacklab
Info: Applying configuration version '1440097652'
Notice: /Stage[main]/Main/Node[puppetserver4.hacklab]/Package[nmap]/ensure: created
Notice: O FQDN desta VM eh puppetserver4.hacklab
Notice: /Stage[main]/Main/Node[puppetserver4.hacklab]/Notify[O FQDN desta VM eh puppetserver4.hacklab]/message: defined 'message' as 'O FQDN desta VM eh puppetserver4.hacklab'
Notice: Applied catalog in 4.74 seconds

6. Amarrando as pontas

Você empurrou uma configuração com sucesso utilizando Puppet Server/Agent do Puppet 4.2 e já utilizou um fato - em hash - do novo cfacter.

Esse post foi direto ao ponto, há muito ainda para ler, ver, estudar, aprender e compartilhar.

Bons estudos!

[s]
Guto