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 – Facter – Orquestração via Mcollective – Instalação e utilização do Plugin Facter

Tutorial Orquestração com Mcollective, Instalação e utilização do Facter, populando o arquivo facts.yaml, Utilizando o Mcollective para fazer consultas de inventários.

Introdução

O Mcollective é uma ferramenta que trabalha em conjunto com o Puppet para fazer a Orquestração e execução de tarefas nos hosts.

Muitas tarefas de orquestração precisa de plugin, então neste tutorial vamos aprender a instalar o plugin facter para fazer consultas de inventário via Mcollective.
Se você quiser por exemplo fazer a instalação de pacotres remotamente via Mcollective ou simplesmente reiniciar serviços, você precisará instalar os plugins necessários para esta atividade, e assim por diante.

O Plugin Facter não tem pacotes para a instalação via yum ou apt-get, é preciso copiar os arquivos “.rb” para as pastas “lib” do Mcollective.

Neste link Puppet Plugins tem a lista de plug-ins disponíveis para o puppet.

Alguns plugin tem o pacote para instalação via yum e apt-get.

Infraestrutura do ambiente

Puppet Server: puppetserver-01.devopslab.com.br
Nodes/Clientes: puppetclient-01.devopslab.com.br
Centos 7 – 64 bits instalação mínima.
puppetserver 2.2.1
puppet 4.3.2
puppet-agent 1.3.5

Pré-requisitos

Você precisa ter o Puppet Server, Puppet Agent e Mcollective funcionando. Você pode seguir estes 2 tutoriais:

Instalação do Puppet Server e Puppet Agent.
Como instalar o Puppet Server e clientes

Mcollective.
Instalação e orquestração via Mcollective

1. Configuração dos clientes/nodes

Faça o login nos seus clientes e copie o arquivo “yaml_facts.rb” para a pasta facts do mcollective.

O arquivo “yaml_facts.rb” já existe no sistema, ele foi instalado junto do Mcollective, e o Mcollective foi instalado junto do puppet-agent, sendo assim utilize o comando find para encontrar.

#find yaml_facts.rb

[root@puppetclient-01 /]# find / -name yaml_facts.rb 
/opt/puppetlabs/puppet/lib/ruby/vendor_ruby/mcollective/facts/yaml_facts.rb

Faça a copia para a pasta facts.

[root@puppetclient-01/]# mkdir /usr/libexec/mcollective/mcollective/facts

[root@puppetclient-01 /]# cp -v /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/mcollective/facts/yaml_facts.rb /usr/libexec/mcollective/mcollective/facts
‘/opt/puppetlabs/puppet/lib/ruby/vendor_ruby/mcollective/facts/yaml_facts.rb’ -> ‘/usr/libexec/mcollective/mcollective/facts/yaml_facts.rb’

Configure as linhas abaixo no arquivo: /etc/puppetlabs/mcollective/server.cfg.

# Facts
factsource = yaml
plugin.yaml = /etc/puppetlabs/mcollective/facts.yaml

Estas linhas já existem na verdade, mas você precisa garantir isto, sendo assim verifique.

Reincie o Mcollective.

#systemctl restart mcollective.service

Agora precisamos popular o arquivo facts.yaml.

[root@puppetclient-01 /]# facter --yaml > /etc/puppetlabs/mcollective/facts.yaml

2. Utilização do Mcollective – Fazendo consultas com o Mcollective

Faça o login no Puppet Server e faça a consulta.

[root@puppetserver-01 /]#mco inventory  puppetclient-01

Eu editei a saída pois são muitas coisas, mas é algo parecido com isto.

....
Facts:
      augeas => {"version"=>"1.4.0"}
      ...
      facterversion => 3.1.4
      filesystems => xfs
      identity => {"gid"=>"0", "group"=>"root", "uid"=>"0", "user"=>"root"}
      is_virtual => true
      kernel => Linux
      kernelmajversion => 3.10
      kernelrelease => 3.10.0-327.10.1.el7.x86_64
      kernelversion => 3.10.0
      load_averages => {"15m"=>"0.05", "1m"=>"0", "5m"=>"0.01"}
...

Perceba que a saída não é muito amigável, no entanto é completa. Abaixo vamos criar um módulo para a criação do facter.yaml de forma automática e com uma saída mais amigável.

É possível personalizar a consulta de inventário com filtros e scripts.
Como fazer os scripts você pode consultar aqui: http://docs.puppetlabs.com/mcollective/reference/ui/nodereports.html

Bom, tudo que nós fizemos aqui foi de forma manual para demonstrar, então o que fizemos foi:

Configuração do arquivo server.cfg
Copiamos o arquivo yaml_facts.rb para a pasta facts do Mcollective.
Populamos o arquivo facts.yaml.
Reiniciamos o Mcollective.

Porém obviamente estes 4 processos precisam ser feito via Puppet de forma automática.

3. Criando um módulo para a instalação automática do plugin facter e população do facts.yaml

O que será feito:


Cópia do arquivo server.cfg do mcollective.
Cópia do arquivo yaml_facts.rb para a pasta facts do Mcollective.
Criar o arquivo facts.yaml populado com os fatos.
Restart do Mcollective.

3.1. Primeiramente vamos criar um módulo, o nome pode ser Mcollective.

#cd /etc/puppetlabs/code/environments/production/modules
#puppet module generate --skip-interview devopslav-mcollective

Utilizei a opção “–-skip-interview” pois não quero responder ao monte de perguntas para a criação dos metadados do módulo, mas é interessante saber sobre isto.

3.2. Crie uma pasta “files” para o armazenamento dos arquivos server.cfg e yaml_facts.rb, já que estes 2 arquivos serão copiados para os clientes.

#mkdir /etc/puppetlabs/code/environments/production/modules/mcollective/files

#cp /etc/puppetlabs/mcollective/server.cfg /etc/puppetlabs/code/environments/production/modules/mcollective/files

#cp /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/mcollective/facts/yaml_facts.rb /etc/puppetlabs/code/environments/production/modules/mcollective/files

3.3. Vamos fazer a definir a classe para popular o arquivo facter.yaml.
Lembre-se que existem várias formas de definir uma classe

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

#Dependencias
	package { 'puppet-agent':
  	ensure => 'installed',
	}

	service { 'mcollective.service':
  	ensure => 'running',
	}


#Criação do arquivo arquivo server.cfg
	file {"server.cfg":
	path	=> '/etc/puppetlabs/mcollective/server.cfg',
   	source 	=> 'puppet:///modules/mcollective/server.cfg',
#O arquivo server.cfg foi copiado para a pasta file do pupper master. 
#Crie a pasta file dentro do modulo.
#/etc/puppetlabs/code/environments/production/modules/mcollective/files/server.cfg 
	ensure	=> 'file',
    	owner   => 'root',
    	group   => 'root',
    	mode    => '0644',
    	require => Package['puppet-agent'],
    	notify  => Service['mcollective.service'],
  	}


#criação do diretorio facts.
	file { "/usr/libexec/mcollective/mcollective/facts/":
	ensure => 'directory',
    	owner  => 'root',
    	group  => 'root',
    	mode   => '0755',
	}


#copia do arquivo yaml_facts.rb para a pasta facts
	file { "yaml_facts.rb":
    	path     => "/usr/libexec/mcollective/mcollective/facts/yaml_facts.rb",
#O arquivo yaml_facts.rb esta dentro da pasta file do puppet master.
#Crie a pasta file dentro do modulo.
#/etc/puppetlabs/code/environments/production/modules/mcollective/files/yaml_facts.rb
    	source   => "puppet:///modules/mcollective/yaml_facts.rb",
	ensure   => 'file',
    	owner    => 'root',
    	group    => 'root',
    	mode     => '0644',
    	require  => File["/etc/puppetlabs/mcollective/server.cfg"],
  	}


#preencher o arquivo facts.yaml com os fatos. populate facts.yaml.
	file{"/etc/puppetlabs/mcollective/facts.yaml":
      	owner    => root,
      	group    => root,
      	mode     => '0640',
      	loglevel => debug, # reduce noise in Puppet reports
      	content  => inline_template("<%= scope.to_hash.reject { |k,v| k.to_s =~ /(uptime_seconds|timestamp|free)/ }.to_yaml %>"), # exclude rapidly changing facts
	notify   => Service['mcollective.service'],
    	}

}

3.4. Crie a definição do node

root@puppetserver-01 ~]# cd /etc/puppetlabs/code/environments/production/manifests 
[root@puppetserver-01 ~]# vi puppetclient-01.pp

node 'puppetclient-02.devopslab.com.br'  {
	include mcollective::facter
}

Agora execute no cliente puppetclient-01 o comando “puppet agente –t”.

[root@puppetclient-01 ~]# puppet agent -t

O comando vai baixar o arquivo server.cfg, popular o facter.yaml e reiniciar o mcollective.

Consulte o inventário.

[root@puppetserver-01 ~]# mco inventory puppetclient-01

Agora a saída está muito melhor certo? ficou melhor pois na definição da classe mcollective::facter foi colocado a opção:

content  => inline_template("<%= scope.to_hash.reject { |k,v| k.to_s =~ /(uptime_seconds|timestamp|free)/ }.to_yaml %>"),

Isto deixa a saída um pouco mais legível.

Referências:
http://docs.puppetlabs.com/mcollective/deploy/standard.html#step-4-configure-servers
https://docs.puppetlabs.com/mcollective/deploy/plugins.html#about-plugins–available-plugin-types
http://docs.puppetlabs.com/mcollective/reference/ui/nodereports.html

See you.

Leonardo

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.