Arquivo mensal: abril 2013

Configuração de Um Ambiente de Testes para o OpenStack – Parte 2 – Controller

Aviso: este tutorial não funciona. Ele foi baseado em um guia que está no site oficial do projeto OpenStack (veja a parte 1). Entretanto, nos próprios comentários da página do tutorial, vários usuários relatam que as máquinas virtuais criadas não conseguem capturar um IP do DHCP. A razão do problema está relacionada com o serviço Quantum, cuja utilização no OpenStack é recente. Caso você deseje ter uma visão geral de virtualização e OpenStack, aconselho a seguir o tutorial mesmo assim. Na hora de aprender, um erro pode valer mais do que mil acertos.

Instalação e Configuração do OpenStack

Com as máquinas virtuais configuradas no post anterior, vamos partir para a configuração dos serviços do OpenStack. Em teoria, se você está usando máquinas reais, seria possível começar o tutoria a partir deste ponto.

Controlador

Com as máquinas criadas e configuradas, vamos para o OpenStack. Primeiro passo, vamos logar no Controller e configurar os repositórios do Ubuntu para utilizar a versão mais nova do OpenStack:

openstack@controller:~$ sudo apt-get install ubuntu-cloud-keyring
openstack@controller:~$ cat /etc/apt/sources.list.d/cloud-archive.list
deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/folsom main 
openstack@controller:~$ sudo apt-get update && sudo apt-get upgrade

Em seguida, edite o arquivo /etc/sysctl.conf com as seguintes opções:

net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0  

O arquivo /etc/hosts deve conter os endereços das máquinas da nuvem:

127.0.0.1       localhost
#127.0.1.1      controller
192.168.0.2     controller
192.168.0.3     network
192.168.0.4     compute

NTP

O NTP é um programa que sincroniza o tempo da máquina com um servidor da rede. Precisamos instalá-lo para garantir sincronização entre as máquinas da nuvem:

openstack@controller:~$ sudo apt-get install -y ntp
openstack@controller:~$ sudo cp /etc/ntp.conf /etc/ntp.conf.old
openstack@controller:~$ cat /etc/ntp.conf
server ntp.ubuntu.com iburst
server 127.127.1.0
fudge 127.127.1.0 stratum 10
openstack@controller:~$ sudo service ntp restart
 * Stopping NTP server ntpd                                                                                                                                                                                  
 * Starting NTP server ntpd       

MySQL

Instale o MySQL-Server, colocando a senha do banco como openstack. Configure o banco com os comandos abaixo.

openstack@controller:~$ sudo apt-get install mysql-server python-mysqldb
openstack@controller:~$ sudo sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf
openstack@controller:~$ sudo service mysql restart
mysql stop/waiting
mysql start/running, process 4219
openstack@controller:~$ mysql -u root -p <<EOF
CREATE DATABASE nova; 
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'openstack'; 
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'192.168.0.1' IDENTIFIED BY 'openstack'; 
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'192.168.0.2' IDENTIFIED BY 'openstack'; 
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'192.168.0.3' IDENTIFIED BY 'openstack'; 
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'controller' IDENTIFIED BY 'openstack'; 
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'compute' IDENTIFIED BY 'openstack'; 
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'network' IDENTIFIED BY 'openstack'; 
CREATE DATABASE cinder; 
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'openstack';
CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'openstack';
CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'openstack';
CREATE DATABASE quantum;
GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'localhost' IDENTIFIED BY 'openstack';
GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'192.168.0.2' IDENTIFIED BY 'openstack';
GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'192.168.0.3' IDENTIFIED BY 'openstack';
GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'controller' IDENTIFIED BY 'openstack'; 
GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'network' IDENTIFIED BY 'openstack'; 
FLUSH PRIVILEGES;
EOF

RabbitMQ

O RabbitMQ é um sistema de mensagens:

openstack@controller:~$ sudo apt-get install rabbitmq-server
openstack@controller:~$ sudo rabbitmqctl change_password guest openstack
Changing password for user "guest" ...
...done.

Keystone

O Keystone é o serviço de identidade do OpenStack. Vamos primeiro configurar o banco de dados do Keystone:

openstack@controller:~$ sudo apt-get install keystone python-keystone python-keystoneclient
openstack@controller:~$ sudo mv /etc/keystone/keystone.conf /etc/keystone/keystone.conf.old
openstack@controller:~$ sudo cat /etc/keystone/keystone.conf
[DEFAULT]
admin_token = openstack
bind_host = 0.0.0.0
public_port = 5000
admin_port = 35357
compute_port = 8774
verbose = True 
debug = True 
log_file = keystone.log
log_dir = /var/log/keystone
log_config = /etc/keystone/logging.conf

[sql]
connection = mysql://keystone:openstack@localhost:3306/keystone
idle_timeout = 200
(resto igual ao arquivo original)
openstack@controller:~$ sudo service keystone restart
keystone stop/waiting
keystone start/running, process 6271
openstack@controller:~$ sudo keystone-manage db_sync

Vamos em seguida criar um arquivo com as variáveis de ambiente necessárias para interagir com o OpenStack:

openstack@controller:~$ cat novarc 
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL="http://localhost:5000/v2.0/"
export SERVICE_ENDPOINT="http://localhost:35357/v2.0"
export SERVICE_TOKEN=openstack
openstack@controller:~$ source novarc 
openstack@controller:~$ echo "source novarc">>.bashrc

O próximo passo é povoar o banco de dados do Keystone. Para isso, vamos fazer uso dos scripts keystone-data.sh e keystone-endpoints.sh . Baixe-os na máquina Controller. No keystone-data.sh, deixe o começo do script da seguinte forma:

ADMIN_PASSWORD="openstack"
SERVICE_PASSWORD="openstack"
SERVICE_TOKEN="openstack"
export SERVICE_ENDPOINT="http://localhost:35357/v2.0"
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-service}

Em seguida, torne o script executável e o invoque:

openstack@controller:~$ chmod +x keystone-data.sh 
openstack@controller:~$ ./keystone-data.sh 

No keystone-endpoints.sh, deixe o começo do script da seguinte forma:

# MySQL definitions
MYSQL_USER=keystone
MYSQL_DATABASE=keystone
MYSQL_HOST=localhost
MYSQL_PASSWORD=openstack
# Keystone definitions
KEYSTONE_REGION=RegionOne
SERVICE_TOKEN=openstack
SERVICE_ENDPOINT="http://localhost:35357/v2.0"
# other definitions
MASTER="192.168.0.2"

Em seguida, torne o script executável e o invoque:

openstack@controller:~$ chmod +x keystone-endpoints.sh 
openstack@controller:~$ ./keystone-endpoints.sh 
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |    OpenStack Compute Service     |
|      id     | 7e658862c9244b0da03b0c7497681b9a |
|     name    |               nova               |
|     type    |             compute              |
+-------------+----------------------------------+
(...)

Com isso, temos o Keystone configurado.

Glance

Glance é o serviço de controle de imagens do OpenStack. Vamos instalar os pacotes:

openstack@controller:~$ sudo apt-get install glance glance-api glance-registry python-glanceclient glance-common

Configure as seguintes opções em ambos os arquivos /etc/glance/glance-api.conf e /etc/glance/glance-registry.conf:

sql_connection = mysql://glance:openstack@localhost/glance
admin_tenant_name = service
admin_user = glance
admin_password = password

Os arquivos possuem outras opções, deixe-as como estão. Apenas para o glance-api.conf, configure estas opções:

notifier_strategy = rabbit
rabbit_password = openstack

Agora é questão de reiniciar os serviços e carregar os dados do Glance no MySQL:

openstack@controller:~$ sudo  service glance-api restart
openstack@controller:~$ sudo  service glance-registry restart
openstack@controller:~$ sudo glance-manage db_sync

Em seguida, baixar uma imagem do Ubuntu pronta para a nuvem e registrá-la no Glance. Observe como o serviço é flexível: você pode informar a URL, não precisa baixar a imagem previamente.

openstack@controller:~$ glance image-create \
> --location http://uec-images.ubuntu.com/releases/12.04/release/ubuntu-12.04-server-cloudimg-amd64-disk1.img \
> --is-public true --disk-format qcow2 --container-format bare --name "Ubuntu"
+------------------+--------------------------------------+
| Property         | Value                                |
+------------------+--------------------------------------+
| checksum         | None                                 |
| container_format | bare                                 |
| created_at       | 2013-04-23T16:43:17                  |
| deleted          | False                                |
| deleted_at       | None                                 |
| disk_format      | qcow2                                |
| id               | 6aa23a63-f2eb-45cc-98bf-7e3d8becc6a4 |
| is_public        | True                                 |
| min_disk         | 0                                    |
| min_ram          | 0                                    |
| name             | Ubuntu                               |
| owner            | None                                 |
| protected        | False                                |
| size             | 251789312                            |
| status           | active                               |
| updated_at       | 2013-04-23T16:43:17                  |
+------------------+--------------------------------------+
openstack@controller:~$ glance image-list
+--------------------------------------+--------+-------------+------------------+-----------+--------+
| ID                                   | Name   | Disk Format | Container Format | Size      | Status |
+--------------------------------------+--------+-------------+------------------+-----------+--------+
| 6aa23a63-f2eb-45cc-98bf-7e3d8becc6a4 | Ubuntu | qcow2       | bare             | 251789312 | active |
+--------------------------------------+--------+-------------+------------------+-----------+--------+

Nova

O Nova é o serviço de computação, que trata da criação das máquinas virtuais. Apesar do controlador cuidar da gerência, também vamos instalar o Nova, para manter a uniformidade na nuvem e facilitar a configuração. Partimos para a instalação de pacotes:

openstack@controller:~$ sudo apt-get install nova-api nova-cert nova-common \
> nova-scheduler python-nova python-novaclient nova-consoleauth novnc \
> nova-novncproxy

O arquivo /etc/nova/api-paste.ini deve ser alterado nos seguintes campos:

admin_tenant_name = service
admin_user = nova
admin_password = password

Os campos abaixo deve ser removidos porque instalaremos o serviço Cinder nas próximas etapas, que trata de gerenciar os volumes, eliminando a necessidade do Nova fazer o mesmo. Comente as linhas abaixo no mesmo arquivo.

============================================================
[composite:osapi_volume]
use = call:nova.api.openstack.urlmap:urlmap_factory
/: osvolumeversions
/v1: openstack_volume_api_v1
============================================================

============================================================
[composite:openstack_volume_api_v1]
use = call:nova.api.auth:pipeline_factory
noauth = faultwrap sizelimit noauth ratelimit osapi_volume_app_v1
keystone = faultwrap sizelimit authtoken keystonecontext ratelimit osapi_volume_app_v1
keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_volume_app_v1
============================================================

============================================================
[app:osapi_volume_app_v1]
paste.app_factory = nova.api.openstack.volume:APIRouter.factory
============================================================

============================================================
[pipeline:osvolumeversions]
pipeline = faultwrap osvolumeversionapp

[app:osvolumeversionapp]
paste.app_factory = nova.api.openstack.volume.versions:Versions.factory
============================================================

Vamos agora editar o arquivo /etc/nova/nova.conf com as seguintes modificações:

[DEFAULT]

# MySQL Connection #
sql_connection=mysql://nova:openstack@192.168.0.2/nova

# nova-scheduler #
rabbit_password=openstack
scheduler_driver=nova.scheduler.simple.SimpleScheduler

# nova-api #
cc_host=192.168.0.2
auth_strategy=keystone
s3_host=192.168.0.2
ec2_host=192.168.0.2
nova_url=http://192.168.0.2:8774/v1.1/
ec2_url=http://192.168.0.2:8773/services/Cloud
keystone_ec2_url=http://192.168.0.2:5000/v2.0/ec2tokens
api_paste_config=/etc/nova/api-paste.ini
allow_admin_api=true
use_deprecated_auth=false
ec2_private_dns_show_ip=True
dmz_cidr=169.254.169.254/32
ec2_dmz_host=192.168.0.2
metadata_host=192.168.0.2
metadata_listen=0.0.0.0
enabled_apis=ec2,osapi_compute,metadata

# Networking #
network_api_class=nova.network.quantumv2.api.API
quantum_url=http://192.168.0.2:9696
quantum_auth_strategy=keystone
quantum_admin_tenant_name=service
quantum_admin_username=quantum
quantum_admin_password=openstack
quantum_admin_auth_url=http://192.168.0.2:35357/v2.0
libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver
linuxnet_interface_driver=nova.network.linux_net.LinuxOVSInterfaceDriver
firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver

# Cinder #
volume_api_class=nova.volume.cinder.API

# Glance #
glance_api_servers=192.168.0.2:9292
image_service=nova.image.glance.GlanceImageService

# novnc #
novnc_enable=true
novncproxy_base_url=http://192.168.122.2:6080/vnc_auto.html
vncserver_proxyclient_address=192.168.0.2
vncserver_listen=0.0.0.0

# Misc #
logdir=/var/log/nova
state_path=/var/lib/nova
lock_path=/var/lock/nova
root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf
verbose=true

O comando abaixo serve para popular o banco de dados ‘nova’ com as tabelas necessárias. É recomendável executá-lo como root, em alguns instalações houve erros quando executado como usuário comum.

root@controller:~# nova-manage db sync
2013-04-25 10:43:28 11425 DEBUG nova.utils [-] backend <module 'nova.db.sqlalchemy.migration' from '/usr/lib/python2.7/dist-packages/nova/db/sqlalchemy/migration.pyc'> __get_backend /usr/lib/python2.7/dist-packages/nova/utils.py:506

A mensagem de DEBUG parece ser um problema da versão, mas não impede que o Nova funcione corretamente. Para finalizar, reiniciamos todos os serviços do Nova:

openstack@controller:/etc$ sudo service nova-api restart
openstack@controller:/etc$ sudo service nova-cert restart
openstack@controller:/etc$ sudo service nova-consoleauth restart
openstack@controller:/etc$ sudo service nova-scheduler restart
openstack@controller:/etc$ sudo service nova-novncproxy restart

Com isso, finalizamos o Nova.

Cinder

O Cinder possui uma funcionalidade que já existe no Nova, a gerência de blocos. Porém, essa funcionalidade está sendo separada em novo componente para facilitar a manutenção do Nova. Vamos instalar os pacotes do Cinder:

openstack@controller:~$ sudo apt-get install -y cinder-api cinder-scheduler cinder-volume iscsitarget open-iscsi iscsitarget-dkms python-cinderclient linux-headers-`uname -r`

Em seguida, inicializar os serviços iSCSI:

openstack@controller:~$ sudo sed -i 's/false/true/g' /etc/default/iscsitarget
openstack@controller:~$ sudo modprobe iscsi_trgt
openstack@controller:~$ service iscsitarget start
openstack@controller:~$ sudo service open-iscsi start

Coloque as seguintes opções no /etc/cinder/cinder.conf:

[DEFAULT]
sql_connection = mysql://cinder:openstack@localhost:3306/cinder
rabbit_password = openstack
rootwrap_config = /etc/cinder/rootwrap.conf
api_paste_confg = /etc/cinder/api-paste.ini
iscsi_helper = tgtadm
volume_name_template = volume-%s
volume_group = cinder-volumes
verbose = True
auth_strategy = keystone
state_path = /var/lib/cinder
volumes_dir = /var/lib/cinder/volumes

Altere as seguintes opções no /etc/cinder/api-paste.ini

admin_tenant_name = service
admin_user = cinder
admin_password = openstack

Precisamos utilizar agora o segundo disco da máquina controller. Se você executou a primeira seção deste tutorial sem problemas, deve haver um disco em /dev/sdb ou e /dev/vdb de 5Gb pronto para ser usado. Crie uma partição no dispositivo e depois execute os seguintes comandos:

openstack@controller:~$ sudo pvcreate /dev/sdb1
openstack@controller:~$ sudo vgcreate cinder-volumes /dev/sdb1

Com isso, configuramos um volume LVM para o Cinder. O sistema LVM é interessante pois permite adicionar mais espaço a partições sem a necessidade de reiniciar o servidor. Com isso feito, basta carregar o banco de dados do Cinder e reiniciar os serviços. Novamente, pode ocorrer uma mensagem de DEBUG na sincronização do banco. Ignore-a.

openstack@controller:~$ sudo service cinder-api restart
openstack@controller:~$ sudo service cinder-scheduler restart
openstack@controller:~$ sudo service cinder-volume restart

Com isso, finalizamos o Cinder.

Quantum

O Quantum é o serviço de configuração de redes da nossa nuvem. Vamos instalá-lo:

[soucecode language=”bash”]
openstack@controller:~$ sudo apt-get install quantum-server
[/sourcecode]

Deixe o arquivo /etc/quantum/quantum.conf com as opções da seguinte forma:

core_plugin = quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2
auth_strategy = keystone
fake_rabbit = False
rabbit_password = openstack

Deixe o arquivo /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini com as opções da seguinte forma:

sql_connection = mysql://quantum:openstack@localhost:3306/quantum
tenant_network_type = gre
tunnel_id_ranges = 1:1000
enable_tunneling = True

Deixe o arquivo /etc/quantum/api-paste.ini com as opções da seguinte forma:

admin_tenant_name = service
admin_user = quantum
admin_password = openstack

Inicialize o serviço:

openstack@controller:~$ sudo service quantum-server restart

Dashboard

O Dashboard é a interface web do OpenStack. Sua configuração é fácil, basta instalar os pacotes:

openstack@controller:~$ sudo apt-get install apache2 libapache2-mod-wsgi openstack-dashboard memcached python-memcache

Terminamos o Controller! Agora acesse http://192.168.122.2/horizon e entre com o usuário ‘admin’ e a senha ‘openstack’. Se por acaso tiver algum problema, verifique se todos os serviços estão ativados na opção “Serviços” do DashBoard. O Rabbit não está lá, mas você pode ativá-lo com:

openstack@controller:/etc/init$ sudo update-rc.d rabbitmq-server enable
openstack@controller:/etc/init$ sudo service rabbitmq-server start

Configuração de Um Ambiente de Testes para o OpenStack – Parte 1 – Máquinas Virtuais

Aviso: este tutorial não funciona. Ele foi baseado em um guia que está no site oficial do projeto OpenStack (veja a parte 1). Entretanto, nos próprios comentários da página do tutorial, vários usuários relatam que as máquinas virtuais criadas não conseguem capturar um IP do DHCP. A razão do problema está relacionada com o serviço Quantum, cuja utilização no OpenStack é recente. Caso você deseje ter uma visão geral de virtualização e OpenStack, aconselho a seguir o tutorial mesmo assim. Na hora de aprender, um erro pode valer mais do que mil acertos.

Introdução

Vou apresentar aqui uma série de posts sobre a configuração de um ambiente de testes para o OpenStack. O objetivo desses posts é explicar como criar um ambiente de testes para a solução de nuvens IaaS OpenStack. Irei instalar os componentes do OpenStack (controller, network e compute) em três máquinas virtuais diferentes, de acordo com o tutorial encontrado no site do projeto. Para criação das máquinas virtuais, será usado o KVM. Para todos os efeitos, esse tutorial foi desenvolvido para o Ubuntu 12.04 LTS 64 Bits. A primeira parte trata da criação das máquinas virtuais.

Instalação e Configuração das Máquinas Virtuais

Instalação do KVM

O primeiro passo é verificar se seu sistema suporta virtualização por hardware. A maioria dos sistemas lançados depois do Intel Core 2 Duo possui suporte a virtualização. A exceção é o caso dos processadores da linha Atom. Para testar se o seu sistema tem suporte, execute o seguinte comando:

~$ sudo kvm-ok

Se a resposta for

INFO: /dev/kvm exists
KVM acceleration can be used

então seu sistema está configurado com o suporte ao KVM.

Agora vamos instalar os pacotes necessários:

~$ sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils virtinst

E adicione seu usuário ao grupo libvirtd. Depois disso, será necessário sair e logar novamente:

~$ sudo adduser `id -un` libvirtd

Com esses passos, você pode verificar a instalação com o seguinte comando:

~$ virsh -c qemu:///system list
 Id Name                 State
----------------------------------

Mais informações sobre a instalação do KVM na página do Ubuntu sobre o projeto

Criação das Máquinas Virtuais

Iremos criar três máquinas com as seguintes características:

Máquina Controller Network Compute
Discos 2 discos de 5G 1 disco de 5G 1 disco de 5G
Rede Externa (Host NAT) 192.168.122.2/24 192.168.122.3/24 192.168.122.4/24 (veja observação no final)
Rede Gerência 192.168.0.2/24 192.168.0.3/24 192.168.0.4/24
Rede Dados 10.10.10.2/24 10.10.10.3/24

As máquinas terão duas ou três interfaces de rede. O papel de cada rede ficará mais claro no decorrer do tutorial. Para a Rede Externa, a configuração ‘default’ do KVM é suficiente. Precisamos criar mais duas redes no KVM, Gerência e Dados, que não terão acesso a Internet. Servem para comunicação entre as máquinas virtuais. A primeira rede é definida no arquivo gerencia.xml:

<network>
	<name>gerencia</name>
        <bridge name="virbr1" />
        <ip address="192.168.0.1" netmask="255.255.255.0"/>
</network>

A outra rede é definida em um arquivo dados.xml:

<network>
	<name>dados</name>
        <bridge name="virbr2" />
        <ip address="10.10.10.1" netmask="255.255.255.0"/>
</network>

Em seguida, execute os comandos:

~$ virsh net-define dados.xml 
~$ virsh net-define gerencia.xml 
~$ virsh net-autostart dados
~$ virsh net-autostart gerencia
~$ virsh net-start dados
~$ virsh net-start gerencia
~$ virsh net-list
Name                 State      Autostart
-----------------------------------------
dados                active     yes       
default              active     yes       
gerencia             active     yes 

Por segurança, guarde os XMLs em uma pasta chamada networks/ no seu diretório de usuário. Agora, vamos para a criação das máquinas virtuais. Nós vamos criar as máquinas usando a versão 12.04.1 LTS do Ubuntu Server. Usaremos 512Mb de RAM para cada máquina. Novamente, é um ambiente de teste, desempenho não é o objetivo principal. Vamos começar pela Controller. Execute o comando abaixo:

~$ virt-install \
--connect qemu:///system \
--virt-type kvm --name Controller \
--ram 512 \
--disk path=/home/usuario/openstack/disks/controller1.img,size=5 \
--disk path=/home/usuario/openstack/disks/controller2.img,size=5  \
--vnc \
--cdrom /home/usuario/openstack/ubuntu-12.04.1-server-amd64.iso \
--network network=default --network network=gerencia 

O nome da máquina é Controller, usurá 512 megabytes de RAM. Dois discos são criados, cada um com 5 Gigabytes. Essa máquina dará boot pelo CD de instalação do Ubuntu. Duas interfaces de rede serão criadas, uma default (NAT) e outra privada. Agora execute os seguintes comandos para ter acesso à máquina pelo protocolo VNC:

~/openstack$ virsh list --all
 Id Name                 State
----------------------------------
  2 Controller           running
~/openstack$ virsh vncdisplay 2
:0
~/openstack$ vncviewer 127.0.0.1:0

A partir daí podemos instalar a máquina. Crie o usuário ‘openstack’ e a senha ‘openstack’. Não se preocupe, o SSH não é acessível pela Internet, está protegido pelo NAT. Use o mesmo par usuário/senha nas outras máquinas. O importante é lembrar de instalar o OpenSSH Server para termos acesso externo. Após a instalação, a máquina será desligada. Você deve reativá-la:

~$ virsh start Controller
~$ virsh list 
 Id Name                 State
----------------------------------
  3 Controller           running
~$ virsh vncdisplay 3
~$ :0

Observação: caso você esteja montando o ambiente de teste em uma máquina remota, não conseguirá acessar o VNC do KVM. O VNC não é criptografado por padrão, portanto ele só escuta no endereço 127.0.0.1. A saída é usar um túnel SSH da seguinte forma:

~$ ssh -L <porta_local>:<127.0.0.1>:<porta_destino> -N -f <usuario>@<maquina_destino>
~$ vncviewer 127.0.0.1:0

Só como exemplo de configuração de rede, o arquivo /etc/network/interfaces do Controller deve ficar assim:

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
        address 192.168.122.2
        netmask 255.255.255.0
        network 192.168.122.0
        broadcast 192.168.122.255
        gateway 192.168.122.1
        dns-nameservers 192.168.122.1

auto eth1
iface eth1 inet static
        address 192.168.0.2
        netmastk 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255
        ### static routing ###
        post-up route add -net 192.168.0.0 netmask 255.255.255.0 dev eth1
        pre-down route del -net 192.168.0.0 netmask 255.255.255.0 dev eth1

As outras máquinas devem ser configuradas de forma semelhante de acordo com a tabela acima. Não vou mostrar esses passos. Para finalizar, os comandos para criar as outras duas máquinas são:

virt-install \
--connect qemu:///system \
--virt-type kvm \
--name Network \
--ram 512 \
--disk path=/home/usuario/openstack/disks/network.img,size=5G \
--vnc \
--cdrom /home/usuario/openstack/ubuntu-12.04.1-server-amd64.iso \
--network network=default --network network=gerencia  --network network=dados
virt-install \
--connect qemu:///system \
--virt-type kvm \
--name Compute \
--ram 512 \
--disk path=/home/usuario/openstack/disks/compute.img,size=5 \
--vnc \
--cdrom /home/usuario/openstack/ubuntu-12.04.1-server-amd64.iso \
--network network=default --network network=gerencia  --network network=dados     

Observação importante: No comando de criação da máquina Compute, estamos colocando também a rede default, que é a Rede Externa (Host Nat). Pela tabela acima e de acordo com o tutorial que tomamos como base, essa rede não seria necessária. Entretanto, quando formos configurar o nó, vamos precisar da Internet para poder instalar os pacotes. Então vamos proceder como se colocássemos o endereço 192.168.122.4 na máquina Compute, mas depois vamos desativá-lo.