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

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

Como instalar e configurar o Instalar o Puppet Server
Como instalar e configurar clientes Puppet
Como Criar módulos do Puppet

Neste tutorial nós vamos instalar e configurar o Puppet Server, instalar o Puppet nos clientes e criar os módulos de configuração do Puppet.

Introdução
O Puppet é uma ferramenta que permite a gerência e configuração de arquivos ou aplicações, na prática isto quer dizer que você consegue manter seu parque de hosts (desktops e servidores) com arquivos de configuração padronizados, pacotes e aplicativos atualizados, permite a gestão de usuários, monitoração de aplicações, aplicação de mudanças no ambiente de forma rápida e instalação de Sistema Operacional de forma automatizada.

Puppet também faz Orquestração, ou seja você consegue executar comandos em vários servidores ao mesmo tempo, por exemplo saiu um bug e você precisa atualizar um pacote rapidamente, com a Orquestração do Puppet isto é fácil e rápido, não importa o número de hosts, isto se tornará trivial.

Puppet conta também com o Facter, que permite colher qualquer informação dos hosts, como detalhes do hardware e software instalados, ele atua como uma “ferramenta de inventário”.

A comunidade do Puppet é gigantesca, conta com grande quantidade de contribuições, muitos plug-ins, módulos, vasta documentação e inúmeras listas e sites de discussão.

Vamos lá.

1. Infraestrutura do ambiente

Tenha pelo menos 1 VM para o Puppet Master 1 VM para ser o cliente.

Utilizado neste Lab.
Sistema Operacional Centos 7 64 bits – instalação mínima e atualizada.
1 x Puppet Server (Puppet Master) – puppetserver-01.devopslab.com.br
1 x Puppet Client – puppetclient-01.devopslab.com.br

2. Pré-requisitos

Todos os servidores e clientes devem estar com o hostname padronizado da seguinte forma: nome_hostname.dominio.com.br nome_hostname.

#cat  /etc/hosts
10.0.0.160	puppetserver-01.devopslab.com.br	puppetserver-01


#hostname 
puppetserver-01

#hostname -f
puppetserver-01.devopslab.com.br

#hostname -d
devopslab.com.br

3. Instalação dos repositórios

Instalar o repositório puppet tanto no Puppet Server como nos clientes.

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

Para outras Versões de Centos/Red-Hat, Debian/Ubuntu, Suse consulte: http://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html

4. Instalação e configuração do Puppet Server

Junto do pacote puppetserver, também será instalado o puppetclient.

#yum install puppetserver

Por padrão o Puppet vem com o JVM (java) configurado para subir utilizando 2GB RAM, que é o mínimo recomendado, porém se o seu servidor não dispor desta memória, altere a configuração da JVM conforme a sua necessidade.

Adicional: Dê uma olhada no tópico Tuning do Puppet http://devopslab.com.br/tuning-do-puppet-server/

Altere a linha “JAVA_ARGS”.

#vi /etc/sysconfig/puppetserver

JAVA_ARGS="-Xms1g –Xmx1g -XX:MaxPermSize=256m"

Inicie o Puppet server e habilite o startup automático.

#systemctl start puppetserver.service
#systemctl enable puppetserver.service

Configure o puppet agente.

#vi /etc/puppetlabs/puppet/puppet.conf
[agent]
server = puppetserver-01.devopslab.com.br

Inicie e ative o Puppet Agent.

#systemctl start puppet.service
#systemctl enable puppet.service

Gere o certificado SSL do agente.
#puppet agent -t

# puppet agent -t
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppetserver-01.devopslab.com.br
Info: Applying configuration version '1455913339'
Info: Creating state file /opt/puppetlabs/puppet/cache/state/state.yaml
Notice: Applied catalog in 0.01 seconds

Libere a porta 8140/tcp no Firewall

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

5. Instalação e configuração do Cliente

Aqui vamos instalar o puppet no cliente “puppetclient-01.devopslab.com.br”.

Faça o login no host cliente (puppetclient-01.devopslab.com.br) e instale o repositório e o Puppet agent.

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

#yum -y install puppet-agent

Não inicie o puppet ainda.
Carregue o PATH do puppet para incluir os comandos do puppet. Isto deveria ser automático e acontece apenas neste versão, possívelmente será corrigido em novas versões do puppet cliente.

#source  /etc/profile.d/puppet-agent.sh

Edite o puppet.conf e aponte para o server Puppet Server.

#vi /etc/puppetlabs/puppet/puppet.conf

[agent]
server = puppetserver-01.devopslab.com.br

Agora inicie e ative o startup automático do Puppet agent.

systemctl enable puppet.service
systemctl start puppet.service

Rode o puppet pela primeira vez.

#puppet agent -t
Exiting; no certificate found and waitforcert is disabled

O puppet cliente vai fazer uma solicitação de assinatura de certificado (CSR) para o Puppet Server (CA). Na verdade já foi feito a solicitação no start do puppet agent, porém é recomendável verificar novamente com o comando “puppet agente –t”.

Se logue no Puppet Server e assine o certificado solicitado pelo Puppet client.

Puppet Server puppetserver-01.devopslab.com.br

#puppet cert list
root@puppetserver-01 ~]# puppet cert list
"puppetclient-01.devopslab.com.br" (SHA256) 73:66:B0:FE:4F:96:E6:4B:D8:7B:8E:B3:F5:72:41:
68:83:50:F3:4C:09:5A:1G:68:F0:47:10:28:6D:11:42:84

Assinatura do certificado.

[root@puppetserver-01 ~]# puppet cert sign puppetclient-01.devopslab.com.br
Notice: Signed certificate request for puppetclient-01.devopslab.com.br
Notice: Removing file Puppet::SSL::CertificateRequest puppetclient-01.devopslab.com.br at 
'/etc/puppetlabs/puppet/ssl/ca/requests/puppetclient-01.devopslab.com.br.pem'

Volte para o cliente “puppetclient-01.devopslab.com.br” e rode novamente o “puppet agente –t”.

[root@puppetclient-01 ~]# puppet agent -t
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppetclient-01.devopslab.com.br
Info: Applying configuration version '1455912908'
Notice: Applied catalog in 0.03 seconds

Pronto! Puppet Server e Puppet client (Cliente) funcionando.
Agora falta apenas criar módulos e ver o puppet aplicando as configurações desejadas.

6. Criação de módulos de configuração

6.1 – Módulo 1 – Edição do arquivo /etc/hosts

Vamos criar um módulo para editar arquivo de hosts de forma automática via puppet.

Vamos usar o comando “puppet module generate”, é a forma mais “difícil” porém é a recomendada pela Puppetlabs e também mais organizada. Criação de módulos é um assunto extenso, existem várias maneiras de fazer a mesma coisa, das simples as mais complexas, aqui vamos utilizar apenas a forma mais recomendada.

No PUPPET SERVER
#puppet module generate

#cd /etc/puppetlabs/code/environments/production/modules
#puppet module generate devopslab-edithosts --skip-interview

Acabamos de criar um módulo devopslab-edithosts.
A opção “–skip-interview” pula uma série de perguntas como nome do criador do módulo, versão do módulo, descrição e etc, para o nosso caso não precisa, mas você pode dar uma olhada depois.

Vamos criar nosso manifesto, ou seja definir uma classe.

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

###A linha comment e opcional###
 host { 'crm.devopslab.com.br':
    ip           => '10.0.10.10',
    comment      => 'Adicionado via Puppet'
  }

 host { 'portal.devopslab.com.br':
    ip           => '10.0.10.11',
    comment      => 'Adicionado via Puppet'
  }

 host { 'wiki.devopslab.com.br':
    ip           => '10.0.10.13',
    comment      => 'Adicionado via Puppet'
  }

 host { 'webmail.devopslab.com.br':
    ip           => '10.0.10.13',
    comment      => 'Adicionado via Puppet'
  }

}

Onde “edithosts” é o nome do módulo, e “hosts” o nome do manifesto.

Verifique se tem algum erro no manifesto.

#puppet parser validate hosts.pp

Vamos criar a definição do node (node são os clientes rodando o puppet client, são seus hosts no geral).

cd /etc/puppetlabs/code/environments/production/manifests

#vi site.pp
node 'puppetclient-01.devopslab.com.br' {
        include edithosts::hosts
}

E seu eu tiver mais de 1 node?. Simplesmente faça assim:

node 
'puppetclient-01.devopslab.com.br',
'puppetclient-02.devopslab.com.br',
'puppetclient-03.devopslab.com.br',
'puppetclient-04.devopslab.com.br'
## assim por diante.
{
        include edithosts::hosts
}

Valide a configuração site.pp no intuito de achar erros.

puppet parser validate site.pp

No PUPPET CLIENT (Node/Cliente).
Logue no Puppet Cliente e rode o “puppet agente –t”.

# puppet agent -t
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppetclient-01.devopslab.com.br
Info: Applying configuration version '1455919826'
Notice: /Stage[main]/Edithosts::Hosts/Host[crm.devopslab.com.br]/ensure: created
Info: Computing checksum on file /etc/hosts
Notice: /Stage[main]/Edithosts::Hosts/Host[portal.devopslab.com.br]/ensure: created
Notice: /Stage[main]/Edithosts::Hosts/Host[wiki.devopslab.com.br]/ensure: created
Notice: /Stage[main]/Edithosts::Hosts/Host[webmail.devopslab.com.br]/ensure: created
Notice: Applied catalog in 0.05 seconds

Verificando as alterações no /etc/hosts.

# cat /etc/hosts
127.0.0.1	localhost	localhost.localdomain localhost4 localhost4.localdomain4
::1	localhost	localhost.localdomain localhost6 localhost6.localdomain6

10.0.0.161	puppetclient-01.devopslab.com.br	puppetclient-01
10.0.0.160	puppetserver-01.devopslab.com.br	puppetserver-01
10.0.10.10	crm.devopslab.com.br	# Adicionado via Puppet
10.0.10.11	portal.devopslab.com.br	# Adicionado via Puppet
10.0.10.13	wiki.devopslab.com.br	# Adicionado via Puppet
10.0.10.13	webmail.devopslab.com.br	# Adicionado via Puppet

Perceba que o arquivo de hosts foi editado automaticamente.

6.2 – Módulo 2 – Instalação pacotes, remoção, desativação e update de pacotes

Vou criar um módulo checklist, que vai instalar alguns pacotes, remover os desnecessários, e manter outros atualizados, bem checklist mesmo, toda empresa tem.

Checklist
Telnet – Instalar
Openssh – Manter atualizado na última versão.
Gnutils – Manter atualizado na última versão.
Vim – Remover

No PUPPET SERVER.
Criação do módulo de checklist “devopslab-checklist”.

#cd /etc/puppetlabs/code/environments/production/modules
puppet module generate devopslab-checklist --skip-interview

Criação do manifesto.

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

package { [ 'telnet' ]:
    ensure     => present,
  }

package { [ 'openssh' ]:
    ensure     => latest,
  }

package { [ 'gnutls' ]:
    ensure     => latest,
  }

package { [ 'vim' ]:
    ensure     => absent,
  }

}

Vamos criar a definição do node. Nós já criamos anteriormente, vamos apenas adicionar um include para o novo manifesto.

#vi /etc/puppetlabs/code/environments/production/manifests/site.pp

node 'puppetclient-01.devopslab.com.br' {
	include	edithosts::hosts
	include checklist::pacotes
}

No PUPPET CLIENT. Logue no cliente e rode o “puppet agente –t”.

[root@puppetclient-01 /]# puppet agent -t
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Info: Caching catalog for puppetclient-01.devopslab.com.br
Info: Applying configuration version '1455975217'
Notice: /Stage[main]/Checklist::Pacotes/Package[telnet]/ensure: created
Notice: /Stage[main]/Checklist::Pacotes/Package[gnutls]/ensure: ensure changed '3.3.8-12.el7_1.1' to '0:3.3.8-14.el7_2'
Notice: /Stage[main]/Checklist::Pacotes/Package[vim]/ensure: removed
Notice: Applied catalog in 8.23 seconds

Perceba que não aparece nada sobre o openssh, pois ele já está atualizado, então o Puppet sabiamente ignora.

Finalizamos a instalação do Puppet server e cliente assim como a criação e aplicação de módulos de configuração.

Em outro tópico vou demonstrar como fazer a Orquestração com o Puppet e instalar o Plugin Facter para colher informações dos hosts.

Lembrando que a criação de módulos no Puppet é uma ciência, as possibilidades e otimizações são infinitas, dá para brincar bastante, o intuito deste tópico foi apenas fazer uma introdução, porém passe sempre aqui que postarei muitas coisas legais.

Obrigado

Leonardo

The Foreman – Instalação de hosts EC2 Amazon Web Services via Foreman – parte 3/3

The Foreman – Lifecycle, Provisioning, Configuration, Orchestration and Monitoring.

Vamos fazer a instalação de um host na Amazon Web Services utilizando o The Foreman.

Parte 1 – Como instalar e configurar o the foreman
Parte 2 – The Foreman instalacao de hosts via pxe bootstrap bare metal vms parte2

Compute Resources suportados pelo The Foreman
http://theforeman.org/manuals/1.10/index.html#5.2ComputeResources

Plugins
http://projects.theforeman.org/projects/foreman/wiki/List_of_Plugins

1. Usuário Amazon WS

A primeira coisa a se fazer é ter um usuário na Amazon WS com permissões administrativas no EC2 e com as chaves de acesso (Access Key ID e Secret Access Key).
Você pode criar um usuário gratuito na AmazonWS. Sendo assim tenha o Access Key ID e Secret Access Key em mãos.

2. Instalação do Compute Resource Foreman-ec2

Logado no servidor do Foreman instale o compute resource EC2 para habilitar o suporte a AmazonWS EC2.

#yum install foreman-ec2
#systemctl reload httpd

foreman-ec2.noarch : Foreman Amazon Web Services (AWS) EC2 support

3. Configuração do EC2 AmazonWS no Foreman

Em Home-The-Foreman -> Infrastructure -> Compute Resources -> New Compute Resurce
Preencha os dados de configuração informando Access Key, Secret Key e Provider EC2.
theforeman-rec-ec1

Faça um teste de conexão e escolha a região. São Paulo a região é sa-east-1.
Clique em “Submit”.

O Foreman vai gerar um para de chaves para comunicação com o EC2. Para verificar a chave logue no console da AmazonWS: http://console.aws.amazon.com -> EC2 -> Network & Security -> Key Pairs.

4. Criação de um Sistema Operacional genérico

Nós precisamos criar um Sistema Operacional no Foreman, da mesma forma que na instalação Bare Metal no tópico parte2.

É um Sistema Operacional genérico pois de fato ele não será usado, o que vai ser usado serão as imagens da Amazon do tipo ami-xxxxx, ami-27b3094b e etc.
theforeman-ami-27b3094b

4.1. Associar o template user data ao novo Sistema Operacional

Associe o template “Kickstart default user data” ao novo Sistema Operacional. Este é um template do tipo user data, em resumo ele é um script que vai instalar e configurar o Puppet e alterar a senha do usuário ec2-user e root.
theforeman-template1

theforeman-template2

Observação:
No template “Kickstart default user data” eu adicionei as linhas:

- RedHat 6
- RedHat 7
#
#Enable password on ssh
/bin/echo ec2-user:senha123456 | chpasswd
/bin/echo root:senha123456 | chpasswd
/bin/sed -i s/PasswordAuthentication\ no/PasswordAuthentication\ yes/g /etc/ssh/sshd_config
/bin/systemctl reload sshd

Template “Kickstart default user data” na íntegra:

<%#
kind: user_data
name: Kickstart default user data
oses:
- CentOS 4
- CentOS 5
- CentOS 6
- CentOS 7
- Fedora 16
- Fedora 17
- Fedora 18
- Fedora 19
- Fedora 20
- RedHat 6
- RedHat 7
-%>
#!/bin/bash

<%# Cloud instances frequently have incorrect hosts data %>
<%= snippet 'fix_hosts' %>

<%
  # safemode renderer does not support unary negation
  pm_set = @host.puppetmaster.empty? ? false : true
  puppet_enabled = pm_set || @host.params['force-puppet'] && @host.params['force-puppet'] == 'true'
%>
<% if puppet_enabled %>
yum install -y puppet
cat > /etc/puppet/puppet.conf << EOF
<%= snippet 'puppet.conf' %>
EOF

# Setup puppet to run on system reboot
/sbin/chkconfig --level 345 puppet on

/usr/bin/puppet agent --config /etc/puppet/puppet.conf --onetime --tags no_such_tag <%= @host.puppetmaster.blank? ? '' : "--server #{@host.puppetmaster}" %> --no-daemonize
<% end -%>

# UserData still needs wget to mark as finished
/usr/bin/wget --quiet --output-document=/dev/null --no-check-certificate <%= foreman_url('built') %>

# Enable password on ssh
/bin/echo ec2-user:senha123456 | chpasswd
/bin/echo root:senha123456 | chpasswd
/bin/sed -i s/PasswordAuthentication\ no/PasswordAuthentication\ yes/g /etc/ssh/sshd_config
/bin/systemctl reload sshd

5. Definição de imagens EC2

Antes de fazer a instalação de um novo host, você precisa antes definir quais imagens estarão habilitadas para o uso.
Em Home-The-Foreman -> Infrastructure -> Compute Resources -> *EC2-AmazonWS-SaoPaulo -> New image

Você precisa ter uma imagem criada na AmazonWS, pode ser uma própria sua, da comunidade, ou uma da AmazonWS.
Eu vou utilizar uma padrão que a própria AmazonWS fornece.
Imagem Amazon: ami-27b3094b
thefoerman-Amazonimagem1

No Foreman a imagem ficou assim:
theforeman-imagemec2-2
Perceba a referência a imagem ami-27b3094b.

*EC2-AmazonWS-SaoPaulo é o nome que eu dei para a zona de instalação de hosts. No seu caso coloque um nome de sua preferência

6. Deploy na Amazon via Foreman

Agora basta iniciar a criação de um servidor na Amazon via Foreman, então entre em
Home-The-Foreman -> Hosts -> New Hosts e crie uma nova instalação.
A minha instância se chama servidorec2aws-1.devopslab.com.br.

Então preencha os campos Host, Puppet Classes, Interfaces e Operating System, Virtual Machine (tipo de instância, neste caso vamos usar a t2.micro) e clique em Submit.

Host
theforeman-aws1

Interface
theforeman-aws2

Operating System
theforeman-aw3

Virtual Machine
theforeman-aw4

Submit – Processo de instalação
theforeman-aws5

theforeman-aws6

Consulte no EC2 AmazonWS a nova instância
theforeman-amazonec2-a

Consulte no Foreman a nova instância (clique em All hosts)
theforeman-amazonec2-b

theforeman-amazonec2-c

Pronto, provisionado um servidor na AmazonWS EC2 via Foreman.