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.
Na próxima tela você precisa preencher com alguns parâmetros dessa rede.
Use os seguintes valores:
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:
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.
Imediatamente após isso, vá em “Infrastructure” -> “Subnets” e edite populando os campos do range DHCP:
Vá também na parte de Proxies da subnet e configure o smart-proxy local como proxy de tudo relacionado à esta rede:
(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.
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).
E volta na configuração da subnet “internet” e configure o domínio:
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:
Acrescente também http-proxy-port e enable-puppetlabs-pc1-repo para que tenham os seguintes valores:
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:
Na aba de Rede, configure a rede default como a de provisionamento:
E na aba “Operating System” popule com:
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.
O CentOS não instalará com 1Gb de RAM. Aumente um pouco…
Configure a ordem de boot para a rede ser antes do HD.
A configuração da 1a interface (anote o mac).
A configuração da 2a interface:
Não ligue a VM.
Vá no Forman criar o novo host:
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:
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):
Ok, isso te levará à tela do host aguardando provisionamento:
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).
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.