Experimentando o Juju

Juju_juju-gui_2

O Juju é uma ferramenta de orquestração de serviços, isto é, ele “sabe” como instalar, configurar e integrar corretamente e de forma automática diversos programas. Ele é software livre desenvolvido pela Canonical e feito para funcionar com os principais serviços de infraestrutura virtualizada (nuvem) e também em máquinas físicas (metal).

Simplificando um pouco ele está divido em três componentes: (1) as ferramentas propriamente ditas do Juju (cliente), (2) as informações de configuração, contêineres e demais arquivos que o tornam operacional (ambiente) e (3) os pequenos trechos de código que você usa nele e que fazem a “mágica” de habilitar os serviços (os charms).

Como já fazia um tempo que eu acompanhava de longe o desenvolvimento da ferramenta resolvi experimentar um pouco e ver como ela funciona.

Instalando o Juju (cliente)

Não é mandatório, mas preferi criar uma máquina virtual rodando uma versão limpa do Ubuntu Server só para isto. Dentro dela acrescente o repositório e instale o Juju:

$ sudo add-apt-repository ppa:juju/stable
$ sudo apt-get update
$ sudo apt-get install juju-core

O Juju trabalha com diversos provedores de infraestrutura (AWS, HP Cloud Service, Microsoft Azure, OpenStack etc) mas nos testes usarei a parte local dele, via LXC, portanto também é preciso instalar este componente:

$ sudo apt-get install juju-local

Preparando o Juju (ambiente)

É necessário criar o arquivo com a configuração dos ambientes (~/.juju/environments.yaml). Isto pode ser feito manualmente, copiando de um arquivo já existente ou de forma automática com:

$ juju generate-config

Para não ter de acrescentar “-e local” para cada comando eu alterei o ambiente padrão (o normal é  usar o Amazon AWS):

...
default: local
...

Daí foi iniciar o Juju neste ambiente:

$ juju bootstrap

E deixar ele cuidar do resto, todos os arquivos ficarão dentro do ~/.juju do usuário.

Instalando MySQL e WordPress

Agora “as coisas” ficam um pouco diferentes do habitual, pois o trabalho já é feito pelo Juju e agora o termo “orquestração” passa a fazer sentido.

Primeiro a instalação do charm do MySQL:

$ juju deploy mysql

Depois do WordPress:

$ juju deploy wordpress

Então definimos que há uma relação entre os dois sujeitos:

$ juju add-relation wordpress mysql

Estas três linhas significam que longe dos nossos olhos o Juju criará um contêiner específico para cada serviço (a não ser que você defina que usará um só ou mesmo um já existente), instalará o sistema operacional, os programas necessários e fará as configurações necessárias para que eles funcionem corretamente.

Claro, não será instantâneo e com tudo funcionando logo após o último «Enter», veja o tempo que levou para subir só o WordPress:

$ juju status-history wordpress/0
TIME                  TYPE      STATUS       MESSAGE
25 Sep 2015 11:58:09  workload  unknown      Waiting for agent initialization to finish
25 Sep 2015 11:58:09  agent     allocating
25 Sep 2015 12:18:06  workload  maintenance  installing charm software
25 Sep 2015 12:18:07  agent     executing    running install hook
25 Sep 2015 12:23:10  agent     executing    running leader-elected hook
25 Sep 2015 12:23:11  agent     executing    running config-changed hook
25 Sep 2015 12:24:45  agent     executing    running start hook                        
25 Sep 2015 12:24:46  workload  unknown
25 Sep 2015 12:24:46  workload  unknown
25 Sep 2015 12:24:48  agent     executing    running db-relation-joined hook
25 Sep 2015 12:24:50  agent     executing    running db-relation-changed hook
25 Sep 2015 12:24:55  agent     idle

Outra coisa, repare que em nenhum momento foi explicitamente informada a instalação de um servidor web ou mesmo do próprio PHP, esta parte “chata” ficou para o Juju resolver.

Antes de prosseguir é importante fazer algo:

$ juju expose wordpress

Isto exporá o WordPress, isto é, liberará a porta TCP/80 do servidor web do contêiner. Lembram do EXPOSE no Dockerfile? É o mesmo conceito.

Fazendo um ajuste (roteamento)

Isto é específico do meu caso, visto que resolvi rodar o Juju dentro de uma máquina virtual. Logo preciso “explicar” ao computador físico como fazer para acessar os contêineres LXC que estão lá dentro.

Como configuro a máquina virtual com a  interface de rede física em modo bridge ela é, para todos os efeitos, um outro host na rede:

Juju_bridge

Portanto a solução mais simples é criar no host físico uma rota estática dizendo que o caminho para os contêineres passa pelo host virtual:

$ sudo route add -net 10.0.3.0 netmask 255.255.255.0 gw 192.168.0.6

Ou seja, pacotes destinados à rede 10.0.3.0/24 são encaminhados para a máquina virtual que roda o Juju que saberá o que fazer pois ele é o 10.0.3.1. E o caminho de volta nem precisa ser definido pois o Juju é o gateway padrão deles.

Se meu roteador não fosse tão simplório (pra não escrever outra coisa) eu poderia criar a rota nele, deixando disponível para toda a rede.

Sim, roteamento é simplesmente enviar os pacotes para quem sabe/deve saber o que fazer com eles 🙂

Finalizando a instalação do WordPress

Fazendo uma última verificação:

$ juju status wordpress/0
...
        open-ports:
        - 80/tcp
        public-address: 10.0.3.118

Apenas para confirmar que o WordPress está visível pela porta TCP/80 e o IP visível ao mundo é 10.0.3.118, logo, siga as setas:

Juju_WordPress-1

Pior que eu fiquei realmente desapontado, esperava mais alguns passos 🙂

As configurações do MySQL,  Nginx, PHP e até mesmo do WordPress ficaram por conta do Juju e o resultado final está aqui:

Juju_WordPress-2

Legal, não?

Aspectos práticos

Mas e se eu precisar acessar os servidores? Todas as máquinas virtuais são acessíveis via SSH e a documentação dos charms explica onde achar as senhas faltosas:

$ juju ssh mysql/0
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.19.0-28-generic x86_64)
...
$ mysql -u root -p$(sudo cat /var/lib/mysql/mysql.passwd)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 40
Server version: 5.5.44-0ubuntu0.14.04.1-log (Ubuntu)
...
mysql>

E o Juju tem alguma outra interface gráfica? Sim, basta instalar o juju-gui com:

$ juju deploy juju-gui && juju expose juju-gui

Depois de terminado, verifique com “juju status juju-gui” o endereço IP que foi destinado ao serviço.

No meu caso foi o 10.0.3.44 e daí é acessar pelo navegador:

Juju_juju-gui

O usuário é «admin» e a senha está disponível no arquivo “~/.juju/environments/local.jenv” (esta informação está na tela de login).

Finalizando

Inicialmente uma constatação: acabo de perceber de que preciso expandir a memória do meu computador, pois “somente” 4GiB de RAM não são suficientes para este tipo de brincadeira.

O Juju é uma ferramenta bastante interessante, meu exemplo foi bobo mas suficiente para ajudar a perceber como rapidamente é possível levantar um conjunto considerável de serviços praticamente do zero, seja num ambiente de infraestrutura virtualizada, física ou até em ambas.

Aliás, a própria Canonical tem estimulado o desenvolvimento de charms para o Juju, inclusive fornecendo créditos no Amazon AWS para quem quiser desenvolvê-los.

Anúncios

3 comentários sobre “Experimentando o Juju

  1. Pingback: Experimentando Juju - Peguei do

  2. Pingback: Expandindo imagens de disco no VirtualBox | giovannireisnunes

  3. Pingback: Contêineres com LXC – parte 1 | giovannireisnunes

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s