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.