Foreman como provisionador

Como prometido anteriormente, neste post vou demonstrar como user o Foreman como provisionador em sua máquina usando VirtualBox.

Partirei da premissa que o Foreman já está instalado e com duas redes configuradas, como descrito aqui.

Eu gostaria muito de explicar com detalhes cada etapa do processo mas se o post já ficou longo sem isso, imagine com. Eu até pretendia falar do Foreman Discovery, mas o post ficou tão longo que achei melhor separar. Então conto com a compreensão de quem lê o texto para que analise e entenda exatamente o que está fazendo.

Para tudo que faremos aqui, A única coisa necessária é que você tenha instalado o Foreman seguindo esse procedimento, nada mais.

Cenário

O cenário mais simples seria ter apenas uma rede na VM de teste que seria usada para o provisionamento e também como rota default de produção, mas esse não é um cenário recomendado no mundo real.

Por isso iremos simular aqui, para se parecer mais com um cenário real, uma rede separada apenas para o provisionamento e outra rede para produção (rota default).

Nesse cenário o Foreman utilizará o smart-proxy local (que já vem instalado por padrão) para fazer o provisionamento. Depois escreverei outro post em como criar smart-proxies separados, um em cada rede de provisionamento que você quiser ter.

Então, nosso cenário será:

VM do foreman:

  • 1a interface de rede como bridge da interface da sua máquina. Aqui, está configurada para usar DHCP, mas o que importa é que seja sua interface com acesso à Internet.
  • 2a interface de rede configurada como rede interna no VirtualBox, e com IP estático 10.0.0.1/24.

VM de teste:

  • 1a interface de rede na rede interna do virtualbox.
  • 2a interface de rede configurada como bridge da interface da sua máquina.

Ou seja, do ponto de vista do VirtualBox, é o inverso da VM do foreman. Isso é necessário porque iremos bootar pela interface de rede nessa VM e, no virtualbox, precisa ser a primeira interface de rede pra fazer isso.

Mas vamos deixar essa VM pra depois. Não precisa criá-la agora. Quando for a hora eu mostrarei como configurá-la.

Preparando o foreman

Como iremos usar o próprio foreman como Gateway durante o provisionamento, precisamos de algumas configurações para que isso funcione, por exemplo:

  • Habilitar ip forward
  • Habilitar mascaramento no Iptables
  • Subir um proxy squid local para fazer cache dos downloads dos pacotes para que nos próximos provisionamentos baixe do proxy em vez da Internet

O módulo de baselines que escrevi já contem classes pra isso, então vamos instalá-lo:

cd /etc/puppetlabs/code/modules
git clone https://github.com/andreramoni/puppet-rbaselines rbaselines

Execute um script que instala os modulos do qual ele depende:

cd rbaselines && ./deps.sh

Agora para aplicar as classes relevantes ao nosso cenário, nem precisa criar config groups/hostgroups como descrito neste artigo, vamos simplesmente criar um site.pp e declarar as classes para serem aplicadas ao Foreman:

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

E ponha o seguinte:

node /foreman/ {
  include rbaselines::foreman::proxy
  include rbaselines::foreman::server
}

Execute o agente do Puppet:

puppet agent -t

Isso configurará o necessário. Ok, seu Foreman está pronto.

Remova essas linhas depois, deixando o arquivo site.pp em branco. Fizemos desta forma porque é mais rápido mas o certo seria aplicar estas classes por dentro do próprio Foreman. Leia o artigo Foreman: ENC para o Puppet para entender como a classificação funciona.

Configurando o provisionamento

Agora basta configurar o provisionamento.

Vá em “Infrastructure” -> “Provisioning setup” e selecione a rede 10.0.0.0/24 (se ela não apareceu é porque faltou configurar a 2a interface de rede no SO da VM.

screenshot-2017-02-19-12-47-07

Na próxima tela você precisa preencher com alguns parâmetros dessa rede.

Use os seguintes valores:

screenshot-2017-02-19-12-49-26

Dessa forma, o Foreman será o servidor DNS e o gateway dessa rede.

Na próxima tela ele te dará um comando a ser executado na Shell:

screenshot-2017-02-19-12-52-48

ATENÇÃO: aqui há uma “pegadinha” por algo que parece ser um bug na interface do Foreman.  Ele não te pergunta o range DHCP quando você coloca que vai usar DHCP (ele não atualiza a página com as duas perguntas novas).

Por isso salve estas linhas num arquivo e acrescente a linha:

--foreman-proxy-dhcp-range="10.0.0.100 10.0.0.200" \

Aí sim execute o script.

Na próxima tela apenas aponte o mirror para instalação do CentOS. Se o Foreman fosse um Debian, seria o mirar do Debian. Aguarde o comando acima terminar.

screenshot-2017-02-19-12-55-14

Imediatamente após isso, vá em “Infrastructure” -> “Subnets” e edite populando os campos do range DHCP:

screenshot-2017-02-19-13-01-50

Vá também na parte de Proxies da subnet e configure o smart-proxy local como proxy de tudo relacionado à esta rede:screenshot-2017-02-19-13-48-52

(no seu não irá aparecer a dropdown do “Discovery Proxy”. Não se incomode com isso agora.)

Crie também uma nova rede que é sua rede de “produção”, que é a rede que você usa pra acessar a Internet nesse cenário. Popule com os parâmetro da sua rede.

screenshot-2017-02-19-13-56-04

Vá em “Infrastructure” -> “Domains” e crie um novo domínio para sua rede de produção. Isso será usado para compor o hostname da máquina. Exemplo com domínio “prod” (mas por favor, use um domínio mais apropriado e que, de preferênciaência, resolva).

screenshot-2017-02-19-14-11-43

E volta na configuração da subnet “internet” e configure o domínio:

screenshot-2017-02-19-14-14-06

Agora vamos configurar alguns parâmetros necessários para que os templates de provisionamento (kickstart nos RH e preseed nos Debian) usem o Foreman como proxy e também instalem o Puppet pelo repositório pc1.

Vá em “Configure” -> “Global parameters”.

Acrescente um parâmetro http-proxy:

screenshot-2017-02-19-13-41-15

Acrescente também http-proxy-port e enable-puppetlabs-pc1-repo para que tenham os seguintes valores:

screenshot-2017-02-19-13-42-31

Para facilitar o preenchimento de alguns dados necessários ao provisionamento, vamos criar um hostgroup “Linux” apenas para guardar as configurações padrões de provisionamento:

screenshot-2017-02-19-14-02-28

Na aba de Rede, configure a rede default como a de provisionamento:

Screenshot 2017-04-02 11.07.11

E na aba “Operating System” popule com:

screenshot-2017-02-19-14-03-30

Escolha sua senha padrão de root.

Ok, provisionamento configurado.

Provisionando a outra VM

Para provisionar um SO pela rede o Foreman precisa saber o Mac dos hosts a serem provisionados. Isso é necessário para que ele sirva a imagem de instalação adequada a cada host, e simplesmente não sirva nenhuma para os que não estão sendo provisionados.

Vamos antes criar e configurar a VM no VirtualBox então.

screenshot-2017-02-19-13-11-08

O CentOS não instalará com 1Gb de RAM. Aumente um pouco…

screenshot-2017-02-19-13-11-21

Configure a ordem de boot para a rede ser antes do HD.

screenshot-2017-02-19-13-11-56

A configuração da 1a interface (anote o mac).

screenshot-2017-02-19-13-12-56

A configuração da 2a interface:

screenshot-2017-02-19-13-16-16

Não ligue a VM.

Vá no Forman criar o novo host:

screenshot-2017-02-19-14-18-44

Ponha o hostgroup Linux para que pegue os valores default configurados. Mas para entender melhor a finalidade do hostgroup, leia o post sobre o Foreman como ENC do Puppet.

Vá na aba “Interfaces” e configure a 1a interface:

screenshot-2017-02-19-14-20-31

Note que precisa desmarcar a opção “Primary” pois essa interface é apenas de provisionamento, não a interface default da máquina.

E crie uma nova interface (atenção para colar o mac da 2a interface e popular o hostname):

screenshot-2017-02-19-14-22-50

Ok, isso te levará à tela do host aguardando provisionamento:

screenshot-2017-02-19-14-24-07

Nesse ponto, o Foreman irá baixar automaticamente o kernel e o initrd para instalar o CentOS. Você pode observar isso no diretório /var/lib/tftpboot:

ls -lh /var/lib/tftpboot/boot/        
total 274M
-rw-r--r-- 1 foreman-proxy foreman-proxy  42M Dec  5 13:20 CentOS-7.3.1611-x86_64-initrd.img
-rw-r--r-- 1 foreman-proxy foreman-proxy 5.2M Nov 22 16:53 CentOS-7.3.1611-x86_64-vmlinuz

Depois que ele terminar de baixar (acompanhe o tamanho do arquivo) ligue a VM. Ela deve bootar pela rede. Você precisa ter instalado o VirtualBox Extensions, se não ela não irá bootar pela rede.

A VM irá bootar pela rede e iniciar a instalação do CentOS sem exigir nenhuma interação, totalmente atualizada.

No Foreman, você vai conseguir acompanhar no log do Squid a VM baixando os pacotes:

tail -f /var/log/squid/access.log 
1487525384.663    859 10.0.0.100 TCP_MISS/206 62611 GET http://mirror.centos.org/centos/7.3.1611/os/x86_64/Packages/openssl-1.0.1e-60.el7.x86_64.rpm - HIER_DIRECT/66.241.106.180 application/x-rpm
1487525385.023    356 10.0.0.100 TCP_MISS/206 13206 GET http://mirror.centos.org/centos/7.3.1611/os/x86_64/Packages/zlib-1.2.7-17.el7.x86_64.rpm - HIER_DIRECT/66.241.106.180 application/x-rpm
1487525385.987    960 10.0.0.100 TCP_MISS/206 57515 GET http://mirror.centos.org/centos/7.3.1611/os/x86_64/Packages/kexec-tools-2.0.7-50.el7.x86_64.rpm - HIER_DIRECT/66.241.106.180 application/x-rpm

Durante a instalação é esperado que o instalador configure as duas interfaces de rede (provisionamento e a da internet) sendo a rota default prioritária pela rede de provisionamento como screenshot abaixo (abrindo um console enquanto a instalação ainda está rolando).

screenshot-2017-02-19-15-03-17

Ao final, você terá o CentOS instalado sem interação humana.

A máquina irá bootar pela rede novamente (já que configuramos isso como padrão) e o Foreman servirá um menu no qual o padrão será o boot pelo HD local. Deixe assim, esse é o correto. Caso você queira reprovisionar a máquina, basta habilitar o “Build” na interface web do Foreman.

Como seu DNS da rede principal não resolverá o nome foreman.localdomain, você precisará criar uma entrada no /etc/hosts assim:

10.0.0.1 foreman.localdomain foreman

Assim a máquina alcançará o servidor Puppet.

Foreman Discovery

Mas especificar cada MAC dos servidores que quisermos provisionar é trabalhoso demais !

Sim Robin, por isso existe o Foreman Discovery !

 

Um comentário em “Foreman como provisionador

Os comentários estão encerrados.