Introdução

O objetivo desse artigo é fornecer um guia rápido de como configurar o Foreman para que ele possa provisionar máquinas virtuais usando as funcionalidades fornecidas pela libvirt. Ele fornece um material adicional de apoio à excelente documentação fornecida pelo projeto. Esse guia foi feito levando em conta um ambiente com Red Hat Enterprise Linux 6.7 ou 7.2, devendo funcionar sem maiores problemas em ambientes baseados em CentOS 6 ou 7.

Sobre o Foreman

O Foreman é uma ferramenta que permite gerenciar o ciclo de vida de servidores físicos ou virtuais, facilitando o provisionamento de sistemas e aplicações, automação de tarefas e, de modo geral, facilitando o gerenciamento de servidores. Entre outras coisas, ele permite a instalação desassistida de máquinas virtuais e o seu provisionamento em “Compute Resources” como OpenStack, Amazon EC2 e libvirt. Para ter uma ideia de como ele funciona, recomendo esse vídeo:

Preparação

Foreman

O Foreman necessita de um banco de dados para rodar. Por padrão ele usa o SQLite, mas é bastante provável que alguns usuários prefiram outros bancos de dados. Esse artigo assume que um banco MariaDB (ou MySQL) será utilizado.

Para a criação do usuário no banco MariaDB, os seguintes comandos podem ser utilizados:

CREATE USER 'foreman'@'localhost' IDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON *.* TO 'foreman'@'localhost' WITH GRANT OPTION;
CREATE USER 'foreman'@'%' IDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON *.* TO 'foreman'@'%' WITH GRANT OPTION;

CREATE DATABASE foreman CHARACTER SET utf8 COLLATE utf8_general_ci;

Lembre-se de substituir <password> pela senha do usuário que será criado no banco.

 

Foreman e Smart Proxies

A instalação tanto do Foreman quanto dos Smart Proxies tem 2 passos em comuns: a liberação de portas no Firewall a instalação do Foreman Installer. O primeiro garante que os serviços estarão acessíveis e o segundo instala no sistema a ferramenta que irá instalar o Foreman e/ou os Smart Proxies.

Firewall

Diversas portas precisam ser abertas para que o Foreman opere normalmente. Fica a critério do leitor as considerações de segurança específicas do seu ambiente. Para abrir as portas pode-se executar os seguintes comandos:

iptables -I INPUT -p tcp --dport 53 -j ACCEPT
iptables -I INPUT -p udp --dport 53 -j ACCEPT
iptables -I INPUT -p tcp --dport 69 -j ACCEPT
iptables -I INPUT -p udp --dport 69 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 8140 -j ACCEPT
iptables -I INPUT -p tcp --dport 8443 -j ACCEPT

Não esqueça de salvar as regras do Firewall de acordo com a distribuição utilizada.

Instalando o Foreman Installer

O primeiro passo é instalar o Foreman installer conforme explicado no Quick Start Guide. Esse processo deve ser executado tanto para o Foreman quanto para os “proxies”.

Instalando o Foreman

Para instalar o Foreman, rode o seguinte comando:

foreman-installer \
     --enable-foreman-proxy \
     --foreman-db-type=mysql \
     --foreman-db-host=<hostname do bd> \
     --foreman-db-password=<senha do bd> \
     --foreman-servername=<nome do servidor> \
     --enable-foreman-compute-libvirt \
     --foreman-admin-password=<senha de administrador> \
     --no-enable-foreman-plugin-bootdisk \
     --enable-foreman-plugin-discovery \
     --enable-foreman-plugin-hooks

Obs: lembre-se de substituir <hostname do bd>, <senha do bd>, <nome do servidor>, <senha de administrador> pelos valores apropriados ao seu cenário.

O comando acima deve executar a instalação do Foreman. Ao final do processo, as URLs onde o serviço está disponivel serão fornecidas.

 

Instalando o Smart Proxy

 

Instalando os Pacotes para Virtualização

 

Em geral, a instalação do Foreman, em conjunto com o gerenciador de pacotes do sistema operacional, deve garantir que as dependências necessárias para o correto funcionamento da virtualização estejam presentes. Em todo caso, é recomendável checar pela presença dos seguintes pacotes: virt-manager, libvirt, libvirt-python, python-virtinst, libvirt-client, qemu-kvm, qemu-img. Opcionalmente também podem ser instalados os pacotes xorg-x11-xauth e dejavu-sans-fonts para acesso ao virt-manager através de SSH.

Dependendo da arquitetura da sua cloud e da sua rede de provisionamento, pode ser necessário, a partir de então, configurar os dispositivos de rede do host. Esse passo pode ser necessário se, por exemplo, você deseja ter uma rede de gerenciamento separada da sua rede principal (por exemplo, para ignorar um servidor DHCP/PXE em sua rede). Para conhecer um pouco mais sobre as soluções disponíveis, consulte a documentação da libvirt disponível no seguinte endereço: http://wiki.libvirt.org/page/VirtualNetworking

Para o artigo, iremos assumir que o provisionamento das máquinas virtuais será feito através da rede padrão (default), fornecendo acesso a rede aos clientes através de NAT. Esse método tem a vantagem de ser fácil de configurar, porém não permite, facilmente, acesso externo as máquinas virtuais (nesse caso, sendo necessário implementar outros mecanismos para isso).

 

Criando os certificados de cliente do Puppet

Esse processo deve ser executado no servidor que hospeda o Foreman. Basta executar:

puppet cert generate <FQDN do cliente>

Esse passo vai gerar os seguintes arquivos:

SSL CA: /var/lib/puppet/ssl/certs/ca.pem
Certificado SSL: /var/lib/puppet/ssl/certs/<FQDN do cliente>.pem
Chave SSL: /var/lib/puppet/ssl/private_keys/<FQDN do cliente>.pem

Copie os arquivos gerados um diretório temporário no servidor do smart proxy.

 

Criando as chaves SSH para o Foreman

Esse passo também deve ser executado no servidor que hospeda o foreman. Caso ainda não tenha feito, gere uma chave SSH para o Foreman através do comando:

sudo su - foreman ssh-keygen

Não é necessário fornecer uma senha.

 

Copiando a chaves SSH pública do Foreman para o Host

Assim como os anteriores, esse passo deve ser executado no servidor que hospeda o Foreman. Esse passo irá adicionar a chave SSH pública do usuário foreman na lista de chaves aceitas para conexão no servidor que hospeda o Smart Proxy. Esse passo é necessário pois a conexão do Foreman com o hypervisor se dá através do protocolo SSH.

Para executar esse passo rode o seguinte comando:

sudo -u foreman ssh-copy-id root@<hostname do servidor smart proxy>

Instalando o Smart Proxy

 

Para instalar o Smart Proxy, execute o seguinte comando:

foreman-installer \
     --no-enable-foreman \
     --no-enable-foreman-cli \
     --no-enable-foreman-plugin-bootdisk \
     --no-enable-foreman-plugin-setup \
     --no-enable-puppet \
     --enable-foreman-compute-libvirt \
     --enable-foreman-proxy \
     --foreman-proxy-dns=true \
     --foreman-proxy-dns-provider=virsh \
     --foreman-proxy-dns-interface=virbr0 \
     --foreman-proxy-dhcp=true \
     --foreman-proxy-dhcp-managed=false \
     --foreman-proxy-dhcp-interface=virbr0 \
     --foreman-proxy-dhcp-vendor=virsh \
     --foreman-proxy-dhcp-gateway=192.168.122.1 \
     --foreman-proxy-dhcp-range="192.168.122.2 192.168.122.254" \
     --foreman-proxy-dhcp-nameservers="192.168.122.1" \
     --foreman-proxy-tftp=true \
     --foreman-proxy-tftp-servername=<endereço IP do servidor TFTP> \
     --foreman-proxy-foreman-base-url=<url do servidor Foreman> \
     --foreman-proxy-trusted-hosts=<hostname do servidor Foreman> \
     --foreman-proxy-oauth-consumer-key=<oauth consumer key> \
     --foreman-proxy-oauth-consumer-secret=<oauth consumer key> \ 
     --foreman-proxy-puppet-ssl-ca=<caminho para o arquivo da SSL CA> \ 
     --foreman-proxy-puppet-ssl-cert=<caminho para o certificado SSL> \ 
     --foreman-proxy-puppet-ssl-key=<caminho para a chave SSL> 

 

Os parametros de interessa acima são:

Os parametros de interessa acima são:

--foreman-proxy-tftp-servername=<endereço IP do servidor TFTP>

Deve ser configurado para o endereço IP do servidor TFTP, que irá fornecer os arquivos para boot PXE via rede.

--foreman-proxy-foreman-base-url=<url do servidor Foreman>

Deve ser configurada para a URL do servidor Foreman (ex.: http://servidor-foreman.meutime.minhaempresa.com)

--foreman-proxy-trusted-hosts=<hostname do servidor Foreman>

Deve ser configurada para o hostname da instância do servidor Foreman (ex.: servidor-foreman.meutime.minhaempresa.com)

--foreman-proxy-oauth-consumer-key=<oauth consumer key>

Deve ser configurada para a chave de autorização do consumidor OAuth. Esse valor pode ser encontrado nas configurações do Foreman através da interface Web.

--foreman-proxy-oauth-consumer-secret=<oauth consumer key>

Deve ser configurada para a chave secrete autorização do consumidor OAuth. Esse valor pode ser encontrado nas configurações do Foreman através da interface Web.

--foreman-proxy-puppet-ssl-ca=<caminho para o arquivo da SSL CA>

Essa opção deve apontar para o arquivo da autoridade certificadora usada no Puppet master. É o arquivo ca.pem copiado alguns passos acima (ex.: /path/to/ca.pem).

--foreman-proxy-puppet-ssl-cert=<caminho para o certificado SSL>

Essa opção deve apontar para o certificado SSL usado na comunicação com o servidor puppet master.

--foreman-proxy-puppet-ssl-key=<caminho para a chave SSL> 

Essa opção deve apontar para a chave SSL usada na comunicação com o servidor puppet master.

Além desses, convém, também, atentar para foreman-proxy-dhcp-interface e foreman-proxy-dns-interface caso o dispositivo que representa seu virtual network switch (virbr0 costuma ser o valor padrão).

Se tudo correr bem, a instalação deve prosseguir até o final, onde deverá apresentar as URLs do serviço e executar o registro no servidor Foreman.

 

Configurações da Libvirt Pós Instalação

Será necessário configurar a libvirt para suportar boot PXE através da rede, bem como ajustar o armazenamento para apontar para o local desejado.

 

Rede

Edite a rede default para que ela forneça os arquivos necessários para o boot PXE. Isso pode ser feito adicionando os elementos tftp e bootp no arquivo de configuração da rede padrão, conforme mostrado abaixo:

<network>
  <name>default</name>
  <uuid>DO_NOT_COPY</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <mac address='DO_NOT_COPY'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <tftp root='/var/lib/tftpboot' />
    <dhcp>
      <range start='192.168.122.1' end='192.168.122.254' />
      <bootp file='pxelinux.0' />
    </dhcp>
  </ip>
</network>

O conteúdo dos elementos tftp e bootp acima já estão de acordo com o padrão utilizado pelo Foreman, sendo possível apenas copiar e colar esses 2 elementos. Não copie todo o arquivo, pois poderá sobrescrever configurações específicas do seu sistema.

Para fazer essa alteração, execute os seguintes comandos:

virsh net-destroy default
virsh net-edit default
virsh net-start default

O primeiro comando irá parar a rede padrão, o segundo abrirá o editor padrão para edição do arquivo que contém a configuração da rede padrão e o segundo irá reiniciar a rede padrão. Esses comandos não irão afetar o sistema host, porém podem fazer com que outras máquinas virtuais percam, momentaneamente, a conexão de rede.

 

Sudoers

Edite o arquivo sudoers para o usuário foreman-proxy, localizado em /etc/sudoers.d/foreman-proxy e adicione (caso não estejam presentes) as seguintes linhas:

Defaults !requiretty
foreman-proxy ALL = (root) NOPASSWD : /usr/bin/virsh

Isso irá permitir que o usuário foreman-proxy execute o comando virsh usando sudo sem a necessidade de uma senha.

 

Adicionando o Compute Resource

Adicione o Servidor como um “Compute Resource” no Foreman, usando os seguintes parametros:

Provider: Libvirt
URL: qemu+ssh://root@<hostname do servidor smart proxy>/system
Display Type: VNC

 

Domínio

Dependendo da arquitetura da sua rede de provisionamento, esse passo pode ser opcional. O artigo considera que um domínio específico será criado para esse recurso.

 

Adicione a Subrede para o Compute Resource

Name: <nome>
Network address: 192.168.122.1
Network mask: 255.255.255.0
Gateway address: 192.168.122.1
Primary DNS: 192.168.122.1
IPAM: DHCP
Start IP range: 192.168.122.2
End IP range: 192.168.122.254

Atribua essa rede ao domínio criado anteriormente.

Proxies: configure os proxies DHCP, TFTP and DNS da subrede para o domínio criado anteriormente.

Conclusão

Se tudo correu bem, já será possível criar novos hosts no Foreman e definir os locais de deployment dele através da interface principal. Em conjunto com as diversas funcionalidades de provisionamento fornecidas pelo Foreman (templates, instalação desassistida, gerenciamento de mídias, etc) isso permite o rápido provisionamento máquinas virtuais, criação de imagens e muito mais.

 

Deixe um comentário