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

<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/data /usr/share/activemq/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

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

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