Como usar os Módulos Puppet para Automação de Infraestrutura de TI?



Um tutorial prático sobre fantoches que fala sobre como escrever um módulo fantoche e usar um manifesto para automatizar e manter a infraestrutura de TI de uma organização.

Anteriormente, os administradores de sistema usavam scripts de shell para executar seus servidores, e esse método tinha escalabilidade zero. É uma tarefa difícil modificar constantemente os scripts de centenas ou milhares de servidores em constante mudança e suas configurações de sistema.

Neste artigo sobre Módulos e manifestos fantoches vamos ver como poderíamos usar os módulos fantoches para automatizar a configuração do servidor, instalação do programa e gerenciamento do sistema.





Este blog cobrirá os seguintes tópicos:

Introdução à programação de fantoches

Fantoche é uma das ferramentas DevOps popularmente usadas, amplamente usadas para gerenciamento de configuração. É usado para provocar consistência na Infraestrutura. O Puppet pode definir infraestrutura como código, gerenciar vários servidores e impor a configuração do sistema, ajudando assim a automatizar o processo de gerenciamento de infraestrutura.



Puppet temsua própria linguagem de configuração, Puppet DSL . Tal como acontece com outros programas DevOps, Puppet automatiza alterações, eliminando alterações manuais orientadas por script. No entanto, Puppet não é simplesmente outra linguagem de shell, nem é uma linguagem de programação pura, como o PHP. Em vez disso, o Puppet usapara abordagem baseada em modelo declarativo para automação de TI. Isso permite que o Puppet defina a infraestrutura como código e imponha a configuração do sistema com programas.

Antes de prosseguir com a demonstração, vejamos alguns aspectos centrais da programação de fantoches.

o que é big data e hadoop

Termos-chave na programação de fantoches

Manifestos

Um programa de fantoches é chamado manifesto e tem um nome de arquivo com .pp extensão. O manifesto principal padrão do Puppet é /etc/puppet/manifests/site.pp . (Isso defineconfigurações globais do sistema, como configuração LDAP, servidores DNS ou outras configurações que se aplicam a todos os nós).



Aulas

Dentro desses manifestos estão blocos de código chamados Aulas outros módulos podem chamar. As classes configuram blocos de funcionalidade grandes ou médios, como todos os pacotes, arquivos de configuração e serviços necessários para executar um aplicativo. As classes facilitam a reutilização do código do Puppet e melhoram a legibilidade.

Recursos

O código do Puppet é composto principalmente de declarações de recursos. UMA recurso descreve um elemento específico sobre o estado desejado do sistema. Por exemplo, pode incluir que um arquivo específico deve existir ou um pacote deve ser instalado.

Módulos de fantoches

Exceto pelo principalsite.ppmanifesto,ele armazena manifestosdentro módulos .

Todo o nosso código do Puppet é organizado em módulos que são os blocos de construção básicos do fantoche que podemos reutilizar e compartilhar. Cada módulo gerencia uma tarefa específica na infraestrutura, como instalação e configuração de um software.

Os módulos contêm classes Puppet, tipos definidos, tarefas, planos de tarefas, capacidades, tipos de recursos e plug-ins, por exemplo, tipos personalizados ou fatos. Instale módulos no Puppetcaminho do módulo. O Puppet carrega todo o conteúdo de cada módulo no caminho do módulo, tornando este código disponível para uso.

Módulos - Programação de fantoches - EdurekaPuppetlabs tem módulos predefinidos que podemos usar instantaneamente baixando-os de PuppetForge . Você também pode criar um módulo de fantoche personalizado para atender às suas necessidades.

Fluxo de trabalho do programa fantoche

Usaremos a linguagem declarativa do Puppet para descrever o estado desejado do sistema em arquivos chamados manifestos. Os manifestos descrevem como você deve configurar os recursos da rede e do sistema operacional, como arquivos, pacotes e serviços.

Puppet compila manifestos em catálogos e aplica cada catálogo ao seu nó correspondente para garantir que a configuração de tO nó está corretoem toda a sua infraestrutura.

Demonstração: Automatizando a instalação do Apache e MySQL

Este artigo sobre módulos de fantoches é prático e mostra duas maneiras de usar um módulo de fantoches e também ensina como automatizar a instalação de um servidor configurado com esses dois módulos.

Para começar, certifique-se de ter uma infraestrutura do Puppet configurada que incluiria um servidor fantoche mestre e 2 agentes fantoches.

  • Puppet Master: Ubuntu 18.04
  • Agente 1: Ubuntu 18.04
  • Agente 2:CentOS7

Aqui está um esboço do que alcançaremos com a prática:


Então, vamos começar com a prática:

Criando um módulo do zero

Neste módulo fantoche, lidaremos com tarefas como baixar o pacote Apache, configurar arquivos e configurar hosts virtuais.

  • No Puppet Master, navegue até o diretório do módulo do Puppet e crie o diretório Apache:
    cd / etc / puppet / modules sudo mkdir apache
  • De dentro do diretório apache, crie subdiretórios: manifestos, modelos, arquivos e exemplos.
    cd apache sudo mkdir {manifestos, modelos, arquivos, exemplos}
  • Navegue até o diretório de manifestos:
    manifestos de cd
  • A partir daqui, separaremos o módulo em classes com base nos objetivos dessa seção de código.

init.pp -> para baixar o pacote Apache

params.pp -> para definir quaisquer variáveis ​​e parâmetros

config.pp -> para gerenciar quaisquer arquivos de configuração para o serviço Apache.

vhosts.pp -> para definir os hosts virtuais.

Este módulo também fará uso de Hiera (um sistema de pesquisa de dados de configuração de valor-chave integrado, usado para separar dados do código do Puppet), para armazenar variáveis ​​para cada nó.

Etapa 1: baixando o pacote Apache

Criar classe init.pp

Agora vamos criar uminit.pparquivo sob o diretório de manifestos para conter o pacote apache.
Como temos 2 sistemas operacionais diferentes (ubuntu e CentOS7) que usam nomes de pacotes diferentes para o Apache, teremos que usar uma variável$ apachename.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

class apache {package {'apache': name => $ apachename, garanta => presente,}}

pacote recurso permite o gerenciamento de um pacote. Isso é usado para adicionar, remover ou garantir que um pacote esteja presente.

Na maioria dos casos, o nome do recurso (apache, acima) deve ser o nome do pacote sendo gerenciado. Por causa das diferentes convenções de nomenclatura,chamamos o nome real do pacoteem cima com o nome referência. assim nome , chama a variável ainda indefinida$ apachename.

garantir referência garante que o pacote épresente.

Criar arquivo params.pp

oparams.pparquivo irá definir as variáveis ​​necessárias. Embora possamos definir essas variáveis ​​dentro doinit.pparquivo, uma vez que mais variáveis ​​precisarão ser usadas fora do próprio tipo de recurso, usando umparams.pparquivo permite que variáveis ​​sejam definidas emE seinstruções e usadas em várias classes.

Crie umparams.pparquivo e o código a seguir.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp

class apache :: params {if $ :: osfamily == 'RedHat' {$ apachename = 'httpd'} elsif $ :: osfamily == 'Debian' {$ apachename = 'apache2'} else {fail ('isto não é uma distribuição compatível. ')}}

Fora do original init.ppclasse, cada nome de classe precisa se ramificar deapache. Chamamos essa classe de apache :: params . O nome após os dois pontos duplos deve compartilhar um nome com o arquivo. AE sedeclaração é usada para definir os parâmetros, puxando de informações fornecidas por Fator , A Puppet tem instalação facter como parte de sua própria instalação. Aqui, o Facter irá puxar para baixo a família do sistema operacional (osfamília), para discernir se échapéu vermelhoouBaseado em Debian.

Com os parâmetros finalmente definidos, precisamos chamar o params.pp arquivo e os parâmetros eminit.pp. Para fazer isso, precisamos adicionar os parâmetros após o nome da classe, mas antes da chave de abertura({)

Então oinit.ppque criamos anteriormente deve ser parecido com isto:

class apache ($ apachename = $ :: apache :: params :: apachename,) herda :: apache :: params {package {'apache': name => $ apachename, garanta => presente,}}

A string de valor $ :: apache :: params :: value diz à Puppet para puxar os valores do apache módulos, params classe, seguido pelo nome do parâmetro. O fragmento herda :: apache :: params permite parainit.pppara herdar esses valores.

Etapa 2: gerenciar arquivos de configuração

O arquivo de configuração do Apache será diferente dependendo se você está trabalhando em um sistema baseado em Red Hat ou Debian.

Você pode encontrar os seguintes arquivos de dependência no final desta demonstração:httpd.conf(Chapéu vermelho),apache2.conf(Debian).

  • Copie o conteúdo de httpd.conf eapache2.confem arquivos separados e salvá-los no arquivos diretórioem / etc / puppetlabs / code / environment / production / modules / apache / files .
  • Edite ambos os arquivos para desabilitar mantenha vivo. Você precisará adicionar a linha KeepAlive Off nohttpd.confArquivo. Se você não quiser alterar esta configuração, devemos adicionar um comentário no topo de cadaArquivo:
    /etc/puppetlabs/code/environments/production/modules/apache/files/httpd.conf
#Este arquivo é gerenciado pelo puppet

Adicione esses arquivos aoinit.pp, então o Puppet saberá a localização desses arquivos no servidor mestre e nos nós do agente. Para fazer isso, usamos o Arquivo recurso.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

arquivo {'arquivo de configuração': caminho => $ conffile, garantir => arquivo, fonte => $ confsource,}

Como temos os arquivos de configuração em dois locais diferentes, damos ao recurso o nome genérico arquivo de configuração com o arquivo caminho definido como um parâmetro com ocaminhoatributo.

garantir garante que é um arquivo.

fonte fornece a localização no mestre do fantoche dos arquivos criados acima.

Abra oparams.ppArquivo.

Nós definimos o $ conffile e $ confsourcevariáveis ​​dentro doE sedeclaração:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp

if $ :: osfamily == 'RedHat' {... $ conffile = '/etc/httpd/conf/httpd.conf' $ confsource = 'puppet: ///modules/apache/httpd.conf'} elsif $: : osfamily == 'Debian' {... $ conffile = '/etc/apache2/apache2.conf' $ confsource = 'puppet: ///modules/apache/apache2.conf'} else {...

Precisamos adicionar os parâmetros ao início doapachedeclaração de classe noinit.pparquivo, semelhante ao exemplo anterior.

Quando o arquivo de configuração muda, o Apache precisa reiniciar. Para automatizar isso, podemos usar o recurso de serviçoem combinação com o avisar atributo, que chamará o recurso para ser executado sempre que o arquivo de configuração for alterado:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

model view controlador de exemplo java
arquivo {'arquivo de configuração': caminho => $ conffile, garantir => arquivo, fonte => $ confsource, notificação => Serviço ['apache-serviço'],} serviço {'apache-serviço': nome => $ apachename, hasrestart => true,}

serviço resource usa o parâmetro já criado que definiu o nome Apache nos sistemas Red Hat e Debian.
hasrestart atributo é usado para acionar um reinício do serviço definido.

Etapa 3: Crie os arquivos de host virtual

Dependendo da distribuição do seu sistema, os arquivos do host virtual serão gerenciados de forma diferente. Por causa disso, vamos encerrar o código para hosts virtuais em umE sedeclaração, semelhante ao usado noparams.ppclasse, mas contendo recursos reais do Puppet.

  • De dentro doapache / manifests /diretório, crie e abra umvhosts.ppArquivo. Adicione o esqueleto doE sedeclaração:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {} elsif $ :: osfamily == 'Debian' {} else {}}

A localização do arquivo host virtual em nosso servidor CentOS 7 é/etc/httpd/conf.d/vhost.conf . Você precisa criar o arquivo como um modelo no Puppet master. Faça o mesmo para o arquivo de hosts virtuais do Ubuntu, que está localizado em/etc/apache2/sites-available/example.com.conf, substituindoexample.comcom o FQDN do servidor.

  • Navegue até o modelos arquivo dentro do apache módulo e, em seguida, crie dois arquivos para seus hosts virtuais:

Para sistemas Red Hat:
/etc/puppetlabs/code/environments/production/modules/apache/templates/vhosts-rh.conf.erb

ServerAdmin ServerName ServerAlias ​​www. DocumentRoot / var / www // public_html / ErrorLog /var/www//logs/error.log CustomLog /var/www//logs/access.log combinado

Para sistemas Debian:
/etc/puppet/modules/apache/templates/vhosts-deb.conf.erb

ServerAdmin ServerName ServerAlias ​​www. DocumentRoot / var / www / html // public_html / ErrorLog /var/www/html//logs/error.log CustomLog /var/www/html//logs/access.log combinadoRequer tudo concedido

Usamos apenas duas variáveis ​​nesses arquivos: adminemail e nome do servidor . Vamos defini-los nó a nó, dentro dosite.ppArquivo.

  • Retorne paravhosts.ppArquivo. Os modelos criados agora podem ser referenciados no código:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {file {'/etc/httpd/conf.d/vhost.conf': garanta => arquivo, conteúdo => modelo ('apache / vhosts-rh .conf.erb '),}} elsif $ :: osfamily ==' Debian '{file {' /etc/apache2/sites-available/$servername.conf ': garantir => arquivo, conteúdo => modelo (' apache /vhosts-deb.conf.erb '),}} else {fail (' Esta não é uma distro suportada. ')}}

Ambas as famílias de distribuição ligam para oArquivorecurso e assumir o título de localização do host virtual na respectiva distribuição. Para o Debian, isso mais uma vez significa fazer referência ao$ servernamevalor. oconteúdoatributo chama os respectivos modelos.

  • Ambos os arquivos de host virtual fazem referência a dois diretórios. Eles não estão nos sistemas por padrão. Podemos criá-los por meio do uso doArquivorecurso, cada um dentro doE sedeclaração. O completovhosts.confo arquivo deve ser semelhante a:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {file {'/etc/httpd/conf.d/vhost.conf': garanta => arquivo, conteúdo => modelo ('apache / vhosts-rh .conf.erb '),} arquivo {[' / var / www / $ servername ',' / var / www / $ servername / public_html ',' / var / www / $ servername / log ',]: garantir => diretório,}} elsif $ :: osfamily == 'Debian' {arquivo {'/etc/apache2/sites-available/$servername.conf': garanta => arquivo, conteúdo => modelo ('apache / vhosts-deb. conf.erb '),} arquivo {[' / var / www / $ servername ',' / var / www / $ servername / public_html ',' / var / www / $ servername / logs ',]: garantir => diretório ,}} else {fail ('Esta não é uma distro suportada.')}}

Etapa 4: teste o módulo

  • Navegue até oapache / manifests /diretório, execute o analisador de fantoches em todos os arquivos para garantir que a codificação do Puppet esteja sem erros:

analisador sudo / opt / puppetlabs / bin / puppet validate init.pp params.pp vhosts.pp

Ele deve retornar vazio, sem problemas.

java cast duplo para int

  • Navegue até o exemplos diretório dentro doapachemódulo. Criar uminit.pparquivo e incluir as classes criadas. Substitua os valores por$ servernamee$ adminemailcom o seu próprio:

/etc/puppetlabs/code/environments/production/modules/apache/examples/init.pp

serveremail = 'webmaster@example.com' $ servername = 'puppet.example.com' incluir apache incluir apache :: vhosts
  • Teste o módulo executando fantoche aplicar com o –Não tag:
    sudo / opt / puppetlabs / bin / puppet apply --noop init.pp

Ele não deve retornar erros e informar que irá disparar atualizações de eventos. Para instalar e configurar o apache no mestre Puppet, execute novamente sem–Não, se desejar.

  • Navegue de volta para o diretório principal do Puppet e depois para omanifestospasta (nãoaquele presente no módulo Apache).

cd / etc / puppetlabs / code / environment / production / manifests

Crie umsite.ppArquivo,e inclua o módulo Apache para cada nó do agente. Também insira as variáveis ​​para oadminemail e nome do servidorparâmetros. Seusite.ppdeve ser semelhante ao seguinte:

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

node 'puppet-agent-ubuntu.example.com' {$ adminemail = 'webmaster@example.com' $ servername = 'puppet.example.com' include apache include apache :: vhosts} node 'puppet-agent-centos.example .com '{$ adminemail =' webmaster@example.com '$ servername =' puppet.example.com 'incluir apache incluir apache :: vhosts}

Por padrão, o serviço do agente Puppet em seus nós gerenciados verificará automaticamente com o mestre uma vez a cada 30 minutos e aplicará quaisquer novas configurações do mestre. Você também pode invocar manualmente o processo do agente Puppet entre as execuções automáticas do agente. Para executar manualmente o novo módulo em seus nós de agente, faça login nos nós e execute:

sudo / opt / puppetlabs / bin / puppet agent -t

Agora que aprendemos como criar um módulo do zero, vamos aprender como usar um módulo pré-existente da forja de fantoches de puppetlabs.

Use um módulo do PuppetForge

Puppet Forge já tem muitos módulos para o servidor rodar. Podemos configurá-los tão extensivamente quanto um módulo que você criou e pode economizar tempo, pois não precisamos criar o módulo do zero.

Certifique-se de que você está no / etc / puppetlabs / code / environment / production / modules diretório e instale o Módulo MySQL do Puppet Forge por PuppetLabs. Isso também instalará todos os módulos de pré-requisito.

cd / etc / puppetlabs / code / environment / production / modules

sudo / opt / puppetlabs / bin / puppet module install puppetlabs-mysql

Use Hiera para criar bancos de dados

Antes de criar os arquivos de configuração para o módulo MySQL, considere que você pode não querer usar os mesmos valores em todos os nós do agente. Para fornecer ao Puppet os dados corretos por nó, usamos Hiera. Você usará uma senha raiz diferente por nó, criando, assim, diferentes bancos de dados MySQL.

  • Navegar para/ etc / puppete criar o arquivo de configuração de Hierahiera.yamlno principalfantochediretório. Você usará os valores padrão de Hiera:

/etc/puppetlabs/code/environments/production/hiera.yaml

--- versão: 5 hierarquia: - nome: Caminho comum: common.yaml padrões: data_hash: yaml_data datadir: data
  • Crie o arquivocommon.yaml. Irá definir o padrão raiz senha para MySQL:

/etc/puppetlabs/code/environments/production/common.yaml

mysql :: server :: root_password: 'password'

Nós usamos ocommon.yamlArquivoquando uma variável não é definida em outro lugar. Isso significa que todos os servidores compartilharão a mesma senha de root do MySQL. Essas senhas também podem sofrer hash para aumentar a segurança.

  • Para usar os padrões do módulo MySQL, você pode adicionar um incluem ‘:: mysql :: server’ linha para osite.ppArquivo. No entanto, neste exemplo, você substituirá alguns dos padrões do módulo para criar um banco de dados para cada um de seus nós.

Edite osite.pparquivo com os seguintes valores:

node 'Puppetagent-ubuntu.example.com' {$ adminemail = 'webmaster@example.com' $ servername = 'hostname.example.com' incluir apache incluir apache :: vhosts incluir mysql :: servidor mysql :: db {'mydb_ $ {fqdn} ': user =>' myuser ', password =>' mypass ', dbname =>' mydb ', host => $ :: fqdn, grant => [' SELECT ',' UPDATE '], tag = > $ domain,}} node 'Puppetagent-centos.example.com' {$ adminemail = 'webmaster@example.com' $ servername = 'hostname.example.com' incluir apache incluir apache :: vhosts incluir mysql :: servidor mysql :: db {'mydb _ $ {fqdn}': user => 'myuser', password => 'mypass', dbname => 'mydb', host => $ :: fqdn, grant => ['SELECT', ' UPDATE '], tag => $ domínio,}}

Automatizando a instalação dos Módulos de fantoches de fantoche mestre a agente fantoche

  • Você pode executar essas atualizações manualmente em cada nó por SSHing em cada nó e emitindo o seguinte comando:

sudo / opt / puppetlabs / bin / puppet agent -t

  • Caso contrário, o serviço do agente Puppet em seus nós gerenciados verificará automaticamente com o mestre uma vez a cada 30 minutos e aplicará quaisquer novas configurações do mestre.

Catálogo aplicado com sucesso no agente Ubuntu

Catálogo aplicado com sucesso no agente CentOS

Assim, toda a instalação obtém automatizado nos nós do agente apenas aplicando o catálogo.Os arquivos de código e dependências usados ​​para esta demonstração podem ser encontrados Aqui .

Espero que esta demonstração tenha ajudado você a ter uma ideia clara dos módulos e manifestos fantoches e seu uso para automatizar a infraestrutura de TI.Neste caso, seu trabalho se torna tão fácil, basta especificar as configurações no Puppet Master e os agentes Puppet irão avaliar automaticamente o manifesto principal e aplicar o módulo que especifica a configuração do Apache e MySQL. Se você não tiver dúvidas, sinta-se à vontade para publicá-las no .

Se você encontrou isso Tutorial de fantoches relevante, Confira o pela Edureka, uma empresa de aprendizagem online confiável com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. O curso Edureka DevOps Certification Training ajuda os alunos a ganhar experiência em vários processos e ferramentas DevOps, como Puppet, Jenkins, Nagios e GIT para automatizar várias etapas em SDLC.