miércoles, 27 de agosto de 2014

Instalación de JUJU de forma local LXC en un servidor con Ubuntu 14.04

Instalación
apt-get update && sudo apt-get install juju-core

Configuración
NOTA: Este archivo contendra los perfiles de las muestras para los diferentes tipos de servicios en la nube, para proveerdor local si se ejecuta en linux LXC

juju generate-config ó juju generate-config --show

Proveedor local
El provedor local proporciona un campo de pruebas que para los usuarios experimenten con juju y acelerar el proceso de escribir encantos.
JUJU tiene la intención de trabajar en el metal en crudo atraves de MAAS, atraves de una gran variedad de servicios en la nube o en su propia nube privada, tambien puede ser configurado para funcionar unicamente en el equipo local atraves de los contenedores o la virtualización.
La unica implementación estable de esto es usar el sistema de contenedores de linux, LXC (LINUX CONTAINERS). Para utilizar contenedores y la virtualización denominado "Provedor Local"

Configuración para LXC
El provedor local LXC permite ejecutar juju en un unico sistema, como el equipo local o en un servidor. De esta manera usted puede simplemente evaluar las configuraciones de software o de servicios, el desarrollo de sus propios encantos o ejecutar un unico sistema de servidor.

Agregar PPA. (Personal Package Archive)

1.- apt-add-repository ppa:juju/stable
2.- apt-get update

Instalación del provedor local (Depende la versión que utilices)

apt-get install juju-local

Debido a las necesidades de las nuevas versiones de LXC el provedor local requiere un kernel mas reciente que la versión de lanzamiento.
Por lo tanto instalamos Linux 3.8 desde la LTS Hardware Enablement Stack.

apt-get install juju-local linux-image-generic-lts-raring linux-headers-generic-lts-raring

NOTA: Tendras que reiniciar el sistema con el nuevo núcleo con el fin de utilizar juju con el provedor local.

Configuración.
Se debe comenzar mediante la generación de un archivo de configuración genérico para juju y luego cambiar al provedor local mediante el comando:

juju generate-config 
juju switch local

Esto genera un archivo llamado enviroments.yaml (si ya no existe), que se alojara en ~/.juju/ directorio (creara el directorio si ya no existe).

NOTA: Si ya se tiene una configuración existente, puede utilizar 
juju generate-config --show para emitir el nuevo archivo de configuración, luego copia y pega las áreas pertinentes en un editor de texto.

NOTA: La ruta del archivo environments.yaml --> /home/usuario/.juju/enviroments.yaml no se puede crear ni modificar como usuario root debe ser como usuario del equipo $.

###################################
TODOS ESTOS PASOS DEBEN SER COMO USUARIO DEL EQUIPO $ NO COMO USUARIO ROOT #

*juju bootstrap: Crea el entorno de juju en la ruta que colocamos.
*juju init: Crea el archivo de configuración en /home/usuario/.juju/environments.yaml.
*juju status: Muestra el status de los servicios montados.
*juju debug-log: Muestra los errores y actividades que se ejecuten.
*juju deploy trusty/juju-gui: Monta la ultima versión del encanto o servicio
*juju add-relation mediawiki:db mysql: Unir dos encantos
*juju destroy-service juju-gui: ELiminar / Destruir encantos ya implementados

###################################

Colocamos juju bootstrap para crear el entorno de juju:
$ juju bootstrap

Colocamos el juju init para crear el archivo de configuración environments.yaml:
$ juju init

Eliminamos el archivo por defecto:
$ rm /home/usuario/.juju/environments.yaml

Creamos un archivo nuevo:
$ nano /home/usuario/.juju/environments.yaml

Y en el archivo nuevo environments.yaml copiamos el siguiente texto.

environments:
 sample:
  type: local
  control-bucket: juju-90832516d914421fa2308cb50a0bf806
  admin-secret: a8cbf69aedfe4de7a13b79714a6e3c2e
  default-series: precise
  ssl-hostname-verification: true
# data-dir: /home/usuario/jujuprueba


Luego de verificar que este bien colocado, guardamos y salimos para colocar el siguiente comando:
$ juju bootstrap

Verificamos que se cree el entorno en /sample
$ ls /home/usuario/.juju/sample
agents  charmcache  cloud-init-output.log  db  locks  log  server.pem  shared-secret  storage  system-identity  tools


Implementación de Servicios.
El punto fundamental de juju es que se puede utilizar para implementar servicios mediante el uso de amuletos. Estos encantos se pueden recuperar de la tienda de encantos, almacenado en le repositorio local o escritos por unos mismos si ya los tenemos listos.
Asi como hay diferentes series de ubuntu, es necesario que haya diferentes series de encantos para tener en cuenta los cambios sutiles en el sistema operativo subyacente. En el caso que se olvide de esto juju siempre tratara de aplicar el encanto mas relevante, por lo que el despliegue puede ser sencillo y facil.

Implementación de la tienda Charm
En la mayoria de los casos, tendrá qie desplegar encantos de descargas directamente de la tienda de encantos. Esto asegura que usted obtenga la correspondiente versión del encanto y que todo funcione. 
Para implementar encantos como este solo puede especificar de la siguiente forma:

--->>> $ juju deploy mysql
--->>> $ juju deploy mediawiki

La ejecucion de este va hacer exactamente lo que esperas, configue la ultima versión del encanto juju para la serie que esta ejecutando y luego utilizar el entorno de arranque para iniciar una nueva instancia y desplegar mysql.

Juju ultimamente apoya un sistema de espacios de nombres que significa que en realidad se puede despleagr encantos de una variedad de fuentes. La fuente por defecto es la tienda de encantos.
El comando en ejecución es el mismo que el anterior.

--->>> <repositorio>:<series>/<mysql>

--->>> $ juju deploy cs: precise/mysql 

Ruta donde estan los contenedores LXC o maquinas MACHINE por servicios.
# cd /var/lib/lxc/
# ls
juju-precise-template/    soporte-sample-machine-2/ soporte-sample-machine-4/ 
juju-trusty-template/     soporte-sample-machine-3/ soporte-sample-machine-5/

Configuración de un servicio
Al implementar un servicio el encanto va requerir establecer configuración especifica.
Juju proporciona herramientas para ayudar a manejar estas opciones y responder a los cambios a lo largo de la vida util de la implementación del servicio.
La configuración puede modificarse por un administrador en tiempo de despliegue o despues de que los servicios estan operativos.

El descubrimiento de las opciones de configuración de los servicios.
Se puede configurar los encantos con las opciones disponibles que se pueden descubrir de la siguiente forma.

*Mediante la ejecución:
--->>> juju get <service>

Al ver el encanto en la tienda de encanto, mediante el examen de la config.yaml archivo en el encanto propio.
Las configuraciones de ajustes de los nombres y los valores que ellos tienen obviamente variara entre los encantos, las opciones y los valores estan bien documentados, sin embargo, por lo que debe consultar una de las fuentes anteriores para conocer los detalles particulares.


Configuración de un Servicio en despliegue
Es posible ajustar los valores de configuración cuando se implementa un servicio proporcionado en un yaml con formatos que contiene los valores de configuración.

--->>> juju deploy --config myconfig.yaml mediawiki

Nota: Si el archivo de configuración yaml no se puede leer o contiene algunos errores de sintaxis u opciones no validos, recibirá un mensaje de error al respecto. Sin embargo se implementara el servicio.

Configuracion de un servicio que tiene o ha sido desplegado.
Es posible establecer o cambiar la configuración de un servicio que ya esta desplegado.

Antes de configurar cualquiera de estas opciones, es posible que desee comprobar lo que las opciones actuales ya están establecidas, utilizando el comando:
--->>> juju get <service>

Se pueden configurar las opciones mediante el comando:
--->>> juju set <service>

Se debe especificar multiples claves = valores pares si es necesario:
--->>> *juju ser mediawiki skin = monoblock name="juju wiki"

Configuración de las opciones de nuevo a su valor por defecto se hacer usando el comando:
--->>> unset , comando seguido por el servicio y las respectivas opciones.

--->>> *juju unset mediawiki admins name


Instalación de juju-gui

Solo para verlo en el equipo que esta instalado.

1.- $ juju deploy trusty/juju-gui
2.- $ juju status
Una vez que verificamos la instalación con juju status y dice agent-state: started hacemos lo siguiente:
3.- $ juju expose juju-gui

o

1.- $ sudo apt-get install juju-quickstart
2.- $ juju-quickstart
3.- ************************************************************************
juju quickstart v1.4.2
ssh-agent has been started.
To interact with Juju or quickstart again after quickstart
finishes, please run the following in a terminal to start ssh-agent:
  eval `ssh-agent`

Warning: no SSH keys were found in ~/.ssh
To proceed and generate keys, quickstart can
[a] automatically create keys for you
[m] provide commands to manually create your keys

Note: ssh-keygen will prompt you for an optional
passphrase to generate your key for you.
Quickstart does not store it.

Automatically create keys [a], manually create the keys [m], or cancel [c]? a
generating new ssh key...
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
adding key to ssh-agent...
Enter passphrase for /home/soporte/.ssh/id_rsa: 
a new ssh key was generated in /home/soporte/.ssh/id_rsa
bootstrapping the sample environment (type: local)
sudo privileges will be required to bootstrap the environment
reusing the already bootstrapped sample environment
retrieving the environment status
retrieving the Juju API address
connecting to wss://localhost:17070
bootstrap node series: trusty
charm URL: cs:trusty/juju-gui-5
requesting juju-gui deployment
juju-gui deployment request accepted
exposing service juju-gui
requesting new unit deployment
juju-gui/0 deployment request accepted
juju-gui/0 deployment is pending
************************************************************************


4.- Se debe colocar clave en este espacio (soporte/1234/canaima/etc)

LETRA (A):
--->>> Automatically create keys [a], manually create the keys [m], or cancel [c]? a
generating new ssh key...

CLAVE:
--->>>Enter passphrase (empty for no passphrase): 
--->>>Enter same passphrase again: 
adding key to ssh-agent...
--->>>Enter passphrase for /home/soporte/.ssh/id_rsa: 

...CONTINUARA INSTALANDO...

5.- Realizar un juju status

--->>> juju status

Para ver si ya esta montado como deploy la gui de juju, ya que en la instalación el realiza un juju deploy juju-gui (requesting juju-gui deployment - deployment request accepted - exposing service juju-gui).

Una vez montado el mostrara una ruta (IP / URL) donde nos podemos meter para ver desde la web (navegadores) a juju y poder utilizarlo mediante una interfaz.

*****EJEMPLO*****
  juju-gui:
    charm: cs:trusty/juju-gui-5
    exposed: true
    units:
      juju-gui/0:
        agent-state: started
        agent-version: 1.20.1.1
        machine: "5"
        open-ports:
        - 80/tcp
        - 443/tcp
        public-address: 10.0.3.180
*****************
agent-state: pending ->  Quiere decir que se esta intalando
agent-state: started ->  Quiere decir que esta instalado

Solo para verlo en el equipo que esta instalado y en otro equipos que se conecten por un navegador a la URL.

6.- Instalación de Servidor Web con Nginx
Se debe instalar un servidor web ya que el sera quien recibirá las peticiones por la ip publica y no por la ip del contenedor LXC.
# aptitude install nginx

Una vez instalado se debe crear una configuración dom0 que resuelva las peticiones en la ruta:
# nano /etc/nginx/sites-available/juju-gui

y se pega el siguiente código y luego se guarda y se sale para restaurar el servicio web:

server {
listen  80;
server_name jujugui.canaima.net.ve;

access_log  /var/log/nginx/jujugui-net.access.log;
error_log   /var/log/nginx/jujugui-net.error.log;

location / {
   proxy_pass       http://10.0.3.180;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}


error_page   500 502 503 504  /50x.html;
location = /50x.html {
       root   /var/www/nginx-default;
}
}

Se realiza un enlace simbólico
Se debe realizar un enlace simbólico por cada archivo configurado 

# ln -s /etc/nginx/sites-available/juju-gui /etc/nginx/sites-enabled/juju-gui
# service nginx restart

# ln -s /etc/nginx/sites-available/juju-wiki /etc/nginx/sites-enabled/juju-wiki
# service nginx restart

7.- Instalacion de openssl
# aptitude install openssl

Crear una carpeta donde guardaran los archivos
# mkdir /etc/nginx/ssl2
# cd /etc/nginx/ssl2

Generar la Llave con openssl
# openssl genrsa -des3 -out ser.key 4096
Generating RSA private key, 4096 bit long modulus
.....................................................++
.......................++
e is 65537 (0x10001)
Enter pass phrase for ser.key:
Verifying - Enter pass phrase for ser.key:

Crear una petición de firmado del certificado CRS
# openssl req -new -key ser.key -out ser.csr
Enter pass phrase for ser.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:VE
State or Province Name (full name) [Some-State]:Caracas
Locality Name (eg, city) []:Distrito Capital
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MMMM
Organizational Unit Name (eg, section) []:juju
Common Name (eg, YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
NOTA: NO COLOCAR ESTA CLAVE PASSWORD

Firmar la petición previamente elaborada
# openssl x509 -req -days 1825 -in ser.csr -signkey ser.key -out ser.crt
Signature ok
subject=/C=ve/ST=Caracas/L=Distrito Capital/O=MMMM/OU=juju
Getting Private key
Enter pass phrase for ser.key:

NOTA: COLOCAR ESTA CLAVE PASSWORD LA MISMA DEL INICIO

# ls
ser.crt  ser.csr  ser.key


Crear una versión de la llave que no requiera password
# openssl rsa -in ser.key -out ser.key.insegura
Enter pass phrase for ser.key:
writing RSA key
NOTA: COLOCAR ESTA CLAVE PASSWORD LA MISMA DEL INICIO

Renombrar la llave sin password
# mv ser.key ser.key.seguro
# mv ser.key.insegura ser.key

Y tenemos cuatro archivos
#ls
ser.crt  ser.csr  ser.key  ser.key.seguro

¿Qué archivos usaremos?
Solo usaremos el certificado (ser.crt) y la llave (ser.key)

¿Quien usará la llave y el certificado?
Pues en este caso apache2 y nginx usaran la llave y el certificado. ¿Y pueden usar los mismos? pues si,tanto apache2 y nginx pueden usar la misma llave y el mismo certificado.

Configuración de nginx en el contenedor dom0
Nginx en /etc/ngix/site-availables contiene los archivos de los sitios disponibles, en este caso están configurados como proxy_pass como por ejemplo

# cd /etc/nginx/sites-available
# ls
default  juju-gui
# nano juju-gui

Normalmente un archivo proxy_pass es para responder a las peticiones del puerto 80 (http) y las redirige a una maquina virtual y se ven algo así:
server {
        listen  80;
        server_name jujugui.canaima.net.ve;

        access_log  /var/log/nginx/jujugui-net.access.log;
        error_log   /var/log/nginx/jujugui-net.error.log;

        location / {
            proxy_pass       http://10.0.3.180;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }
}
Esto quiere decir que todas las peticiones hacia el puerto 80 (http) y sean con el dominio jujugui.canaima.net.ve, serán redirigidas a la maquinas virtual cuya IP sea la especificada en el campo proxy_pass (http://192.168.1.x ; http://10.0.3.208 en el caso de la ip que tiene el LXC de juju-gui).

¿Ahora cómo hacer para que el proxy_pass también responda a las peticiones del puerto 443 (https) para así aumentar la seguridad?
En este caso solo debemos agregar algunas cosas al archivo de configuración del proxy_pass que servirá para: Responder a las peticiones del puerto 80 (http), 443 (https) y además haremos que responda siempre por el puerto 443, aun cuando el usuario haga la petición por el puerto 80. Tambien tendrá la configuracion de WebSocket ya que la interfaz gráfica de usuario hablará con Juju en un WebSocket para proporcionar una interfaz en tiempo real con los servicios instalados, las unidades que los componen, y las máquinas disponibles

Para este ejemplo editaremos el archivo de configuración del proxy_pass de la maquina server dom0 de la siguiente manera:

# cd /etc/nginx/sites-available
# ls
default  juju-gui
# nano juju-gui

y debemos dejarlo así:

server {
        listen  80;
        server_name jujugui.canaima.net.ve;
rewrite ^ https://$host$request_uri? permanent;
}

server {
        listen 443;
        server_name jujugui.canaima.net.ve;
        ssl  on;
ssl_certificate  /etc/nginx/ssl2/ser.crt;
ssl_certificate_key  /etc/nginx/ssl2/ser.key;

        access_log  /var/log/nginx/jujugui-net.access.log;
        error_log   /var/log/nginx/jujugui-net.error.log;

        location / {
            proxy_pass       https://10.0.3.180;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                
                # WebSocket support (nginx 1.4)
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }
}

Listo ya esta configurado nuestro virtualhost en el dom0 nuestra maquina fisica.
Restauramos el servicio y listo.
# service nginx restart

Una vez que salimos de la configuración del virtual host colocamos el siguiente comando:
-->>> $ cat /home/soporte/.juju/environments/sample.jenv 

Este nos mostrara la clave del usuario admin de juju que veremos por nuestro navegador al colocar https://jujugui.canaima.net.ve





user: admin
password: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
environ-uuid: 17e6f407-d5f0-48b2-8aa1-5f72ab36ba15
state-servers:
- localhost:17070
- 10.0.3.1:17070
- 10.16.106.236:17070
ca-cert: '-----BEGIN CERTIFICATE-----