Forma de se trabalhar com o Puppet

35 views
Skip to first unread message

José Carlos Colzani

unread,
Jun 13, 2020, 9:37:20 AM6/13/20
to puppet-users-br
Bom dia pessoal:

Venho utilizando o Puppet à alguns meses, e estou conseguindo me virar com o que preciso, porém muitas vezes tenho a sensação de a forma como o utilizo não é a mais correta, por exemplo, tenho algumas regras que uso para criar os usuários nos servidores de desenvolvimento, colocando também a chave ssh deles nesses servidores. Como eu faço isso hoje no no puppet...

No diretório /etc/puppetlabs/code/envinronment/production/modules eu vou criando diretórios, por exemplo, add_user_joao. Dentro desse diretório tem os subs files e manifests, no files onde coloco as chaves e no manifest o init.pp com o conteúdo que cria o usuário própriamente dito.

Então no arquivo principal do puppet, manifest.pp onde eu declaro o node, eu chamo um include add_user_joao.
node 'servidor_x' {
 include add_user_joao
}

Minha dúvida é se essa é forma correta de trabalhar com o puppet. Pois apesar de estar funcionando, estou achando bastante trabalhoso.

Rafael Tomelin

unread,
Jun 13, 2020, 9:57:39 AM6/13/20
to puppet-users-br
Bom dia João,

Indiferente a ferramenta que está se trabalhando, tenta se fazer o máximo possível para utilizar variáveis e não colocar valores fixos dentro de códigos.  Depois você consegue substitui as variáveis pelo o valor que você deseja.

Quando estou desenvolvendo um código, sempre penso que ele tem que servir para o meu uso e qualquer outra pessoa que copiar o mesmo, sendo assim você tira os valores fixos.  

--
Você recebeu essa mensagem porque está inscrito no grupo "puppet-users-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para puppet-users-...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/puppet-users-br/5cbfe32f-8018-4d42-92ad-236dec8867dao%40googlegroups.com.


--
Atenciosamente,

Rafael Tomelin
Tel.: 51-984104084
Skype: rafael.tomelin

LPI ID: LPI000191271
Red Hat Certified Engineer
Puppet Professional 2017 Certification

José Colzani

unread,
Jun 20, 2020, 2:27:05 PM6/20/20
to puppet-...@googlegroups.com
Olá Rafael:

Então, eu estou usando variáveis e já consegui reduzir bastante código com isso, mas veja essa situação, acabei fazendo vários módulos dentro do meu ambiente production para adicionar usuários: add_user_fulano, add_user_ciclaro, cada um desses adiciona um usuário no sistema e copia sua chave SSH para o diretório pessoal.

Imagino que de para fazer isso com apenas um módulo, e na declaração do node eu chamaria include add_user_$fulano
Lembrando que no mesmo diretório files eu poderia armazenar todas as chaves pelo nome.




--
José Carlos Colzani

Formado em Gestão de Tecnologia da Informação
Analista de Informática 
User linux - #241077

Juliano Guidini

unread,
Jun 22, 2020, 12:28:11 PM6/22/20
to puppet-...@googlegroups.com
Boa Tarde Pessoal, tudo bom?

Acho que posso contribuir um pouco.

História longa:

José, no começo eu fazia algo parecido com o que tem feito. Concordo com você, começa a parecer que não está certo, começa a ficar difícil a gerência. Ao longo dos anos e dos cursos (fiz o treinamento completo na Instruct) eu fui pegando o jeito e melhorei bastante, ainda faltam coisas para eu me dar por satisfeito, como os testes dos módulos, mas vamos evoluindo aos poucos.

Vou contar como fiz para ver se ajuda.

Inicialmente eu recebi para gerenciar um ambiente grande com um puppet rodando que usava os módulos daqui: https://blog.example42.com/tutorials/PuppetTutorial/

Depois eu comecei a escrever os meus módulos (o das chaves ssh foi o primeiro) e ao invés de eu colocar o usuário X na máquina Y eu coloquei todos os usuários em todas as máquinas. Entendo que isso era uma peculiaridade do meu ambiente e que talvez não possa ser feito em outros.

Depois dos cursos de puppet (fiz primeiro o online do site: https://learn.puppet.com/course/puppet-basics antes dos treinamentos) eu comecei a reescrever os módulos (já eram uma dúzia) novamente, tentando implementar o mais que consegui das best pratices da linguagem, Puppet language style guide (https://puppet.com/docs/puppet/5.5/style_guide.html).

Aí veio um problemão! A linguagem teve uma quebra da versão 3 para a 4, reescrevi bastante coisa para deixar compatível com a Puppet Language 4.

Depois dessa reescrita, comecei a remover de dentro dos módulos variáveis do meu ambiente (nome de máquina, ip etc) e colocar no Hiera.

Implantei o sistema de gerência (não sei se podemos chamar assim, sistema.. ) que consiste determinar roles e profiles ( vinha daqui e de outros sites que não achei agora, não tinha na documentação do puppet ainda http://garylarizza.com/blog/2014/02/17/puppet-workflow-part-2/ e agora mais recentemente https://puppet.com/docs/pe/2018.1/the_roles_and_profiles_method.html). 

Com os roles e profiles a organização geral das coisas melhorou muito, mas faltava algo.

As linguagem foi evoluindo e o Hiera também, reajustei para a nova forma do Hiera (lookup()) e continuei mantendo as coisas, até que configurei um ENC, um classificador externo, pois recebi mais ambientes para gerenciar e cada um deles não tinha nada em comum com os outros, tornando uma missão incrível manter os módulos. Uso o ENC mais simples possível, peguei daqui: https://codingbee.net/puppet/puppet-external-node-classifiers-enc e para configurar: https://puppet.com/docs/puppet/5.5/nodes_external.html.

Com o ENC o site.pp fica vazio, tenho vários environments, com os módulos adequados para cada local, e tudo com Hiera por environment para oferecer os valores que utilizo no dia-a-dia.

História curta:

Voltando ao ssh, consegui montar um módulo em que ele consulte o Hiera, pelo hostname (https://puppet.com/docs/puppet/5.5/lang_facts_and_builtin_vars.html#trusted-facts), retornando quais usuário serão adicionados na máquina em questão, dessa forma ele adiciona o usuário, cria o home e adiciona a chave ssh (authorized_keys).

No Hiera tenho um arquivo que classifica a máquina e de acordo com a classificação seleciono um array que contém hashs (confuso, né.. é confuso mesmo..), cada hash é a descrição de um usuário. Por que motivos usar um hash? É fácil, eu uso a função create_resources (https://puppet.com/docs/puppet/latest/function.html#create_resources) para adicionar o ssh_authorized_key (https://puppet.com/docs/puppet/5.5/types/ssh_authorized_key.html), assim não preciso me preocupar com adicionar o usuário, só preciso gerenciar o home (não funciona bem essa parte, por isso fiz usando file para gerir o home e as permissões adequadas, afinal o home tem que exisitr antes do ssh_authorized_key ).

Algum código:

#Hash de um usuário no Hiera:
usuario_X:
         'comentario da chave':
                 user: 'username'
                 type: '<tipo da chave>'
                 key: 'zzzzzzuuuuuuukkkkkk....'

#Array que indica quais os hashs usar, no Hiera também.
adduser::custom_user:
         - usuario_X
         - usuario_Y

# Núcleo do manifest no módulo
# Garante que o /home/user existe 
     file {user:
       ensure => 'directory',
       owner  => $user
       group  => $grupo,
       path   => "/home/${user}",
       mode   => '0755',
     }

# Gerencia as chaves ssh
  create_resources('ssh_authorized_key',lookup($user,Hash,undef,undef))

# Remove o usuario
      user {$user:
        ensure     => absent,
      }

Obviamente é um esboço do código que uso, mas o caminho que uso é esse.
Cada vez que um usuário tem que ser adicionado eu vou no Hiera e ajusto o hash listado no array, para remover eu indico no Hiera que é uma remoção.

Atenciosamente,

  Juliano


José Colzani

unread,
Jun 22, 2020, 2:57:41 PM6/22/20
to puppet-...@googlegroups.com
Boa tarde Juliano:

Caramba que aula! Tô vendo que tenho muito que aprender.

Agradeço imensamente as dicas e principalmente os links, vou estudar mais.

Abraços...



José Carlos Colzani

Juliano Guidini

unread,
Jun 24, 2020, 11:39:28 AM6/24/20
to puppet-...@googlegroups.com
Boa Tarde!

José, espero que tenha colaborado para que vá a fundo no puppet. É muito legal esse sistema. Eu vendo aqui os rascunhos e escrevendo um novo módulo lembrei de que não falei do editor para escrever os módulos.

É legal escrever os manifestos, mas é mais legal ainda se o seu VI (vim, né!) te ajudar. Então eu fui relembrar o que eu já tenho instalado aqui. Acho que não tenho os sites de onde peguei todas as idéias todas, mas tenho um:


Uso esses acessórios todos:

# Sintaxe do puppet

# Alinha os blocos => (esse acima faz no automático quando está montando o bloco.. mas às vezes precisa corrigir um copia/cola.. e aí uso esse aqui)

# Mostra o colchete que abriu/fechou.

# Faz uma verificação nos manifests (*.pp) e corrige diversos itens sozinho. Uso ele depois de puppet parser validate *.pp.

Saindo do assunto VI, tem esse tópico sobre o arquivo params.pp: https://www.devco.net/archives/2013/12/09/the-problem-with-params-pp.php , tá antigo já.. mas eu uso até hoje, e os módulos que vejo no puppet-forge também usam. Ajuda a separar a bagunça.

Para documentar os módulos eu uso esse sistema aqui: https://puppet.com/blog/using-puppet-strings-generate-great-documentation-puppet-modules/ , na versão mais nova (puppet 5 e 6), se não me engano, não precisa instalar quase nada para funcionar (tá rodando faz tempo.. acabo esquecendo os detalhes, mas nada difícil de fazer). Fica legal no git.. com um README.md montado e com o resultado da documentação (puppet strings generate --format markdown --out doc/home.md) no wiki do projeto.

Atenciosamente,

  Juliano


José Colzani

unread,
Jun 24, 2020, 1:34:41 PM6/24/20
to puppet-...@googlegroups.com
Boa tarde Juliano:

Sim consegui esclarecer várias coisas e com os links que você me mandou, e também surgiram novas dúvidas, normal.
Eu uso sim o vim-puppet com o puppet-lint que faz a correção, ajuda muito.

Mais uma vez obrigado.

Abraços...


Reply all
Reply to author
Forward
0 new messages