uma ferramenta de validação de regras de puppet para os projetos com o intuito de facilitar a padronização de regras e agilizar a busca e correção de erros.
gepeto <comando> [parametros]
Geração do RPM do repositório indicado
gepeto rpmbuild <REPOSITORY_DIR>
Onde:
- REPOSITORY_DIR: caminho do repositorio do projeto a ser construido
Exemplo:
gepeto rpmbuild ~/meu-querido-projeto/
Dependências:
- É necessário ter serviço docker rodando na localhost
Instalação do RPM
gepeto rpminstall <RPM_PATH> -r <REPOSITORY_DIR>
Onde:
- RPM_PATH: caminho do arquivo RPM gerado com o comando rpmbuild
- REPOSITORY_DIR: caminho do repositorio do projeto a ser construido
Parâmetros:
-r: diretório do repositório
O projeto deve ter um arquivo .extra_repos com os repositórios extras a serem incluídos. Os projetos
com ruby 1.8, por exemplo, precisam desse arquivo com a linha ruby18
.
Exemplo:
gepeto rpminstall ./var/projeto/projeto-1.0.0.el6.rpm ~/projeto/
Dependências:
- É necessário ter serviço docker rodando na localhost
Provisionamento de teste de puppet em docker gepeto puppet <PUPPET_DIR> <PUPPET_MODULE> [app_environment] [rpm a ser instalado no fim]
Onde:
- PUPPET_DIR: caminho da raiz do puppet repository clonado.
- PUPPET_MODULE: nome do modulo do puppet a ser provisonado.
Parâmetros:
-e: environment
ex.: -e production
(stage
é o padrão)
-r: role:
ex.: -e cms
-p: rpm:
Path do rpm gerado (ele é gerado, por padrão, dentro do projeto gepeto)
ex.: -p ./var/meuprojeto/projeto1.0.0.0-1.el6.x86_64.rpm
Exemplo:
gepeto puppet ~/puppet-manifests/ meuprojeto -e production -r cron
Dependências:
- É necessário ter serviço docker rodando na localhost
Validação de estrutura / conteúdo de módulo puppet e projeto
gepeto lint -p <PUPPET_MODULE_DIR> -r <REPOSITORY_DIR>
Onde:
- PUPPET_MODULE_DIR: caminho do módulo do puppet a ser validado.
- REPOSITORY_DIR: caminho do projeto onde está o arquivo .spec.
Parâmetros:
-p: puppet
-r: repositório
Exemplo:
gepeto lint ~/projects/puppet/modules/cmsveja ~/projets/cmsveja
As regras de validação são plugins armazenados em arquivos .rb dentro da pasta lib/plugins/lint
. Existem dois tipos de plugin.
- Plugin como classe que recebe os diretórios como parâmetro e pode fazer tratamento cruzando informações, por exemplo, dos puppets, spec e Makefile
class WelcomePlugin < Gepeto::LintPlugin
def call(env, puppet, repo)
puts ['Validando modulo', puppet.red, 'e repo', repo.red, 'com', env.plugins.count.to_s.blue, 'plugins'].join(' ')
end
end
- Plugin para tratar linhas - Na verdade há um plugin como o acima que varre linha a linha emitindo eventos para que plugins se registrem tratando-as. Exemplo de regra:
on(:any_line) do |env, scope, file, line, lineno|
env.errors.add(scope, file, line, lineno, "Não deveria referenciar /var/app - usar /opt/app") if line.include?('/app/')
end
on(:puppet_line) do |env, scope, file, line, lineno|
env.errors.add(:puppet, file, line, lineno, "Não deveria gerenciar usuários - mover para spec") if line =~ /useradd|adduser/
env.errors.add(:puppet, file, line, lineno, "Não deveria gerenciar grupos - mover para spec") if line =~ /groupadd|addgroup/
end
Os plugins devem registrar os erros encontrados utilizando a chamada:
env.errors.add(escopo, file, linecontent, line_no, message)
Para registrar warnings, a chamada é parecida:
env.warnings.add(escopo, file, linecontent, line_no, message)
- Validar estrutura do modulo puppet (manifests/init.pp, manifests/config.pp, ...)
- Validar estrutura do projeto (Makefile, .spec)
- Identificar tipo de projeto (rails, node, sinatra, java) e verificar dependências no RPM
- Identificar pacotes requisitados no puppet que deveriam ser movidos para o spec
- Identificar criação de diretorios no puppet que deveriam estar no spec
- Identificar arquivos de log em diretorios invalids (http -> /var/log/httpd, aplicação -> /var/log/
- Plugin para puppet lint
- Verificar endereço ip hardcoded no codigo do projeto (ao menos no config)
- Verificar nome de dominio hardcoded nas configurações do projeto
- [v] Comando para criacao de rpm via docker
- Comando para instalacao de rpm gerado via docker
- [v] Comando para provisionamento de imagem docker via puppet