Skip to content

Creación del entorno (Manual)

Daniel Palomar Rodríguez edited this page Jun 19, 2017 · 7 revisions
  1. Lo primero será crear el fichero de configuración de LXC asegurando el network bridge para obtener una IP con la que poder ejecutar el Ansible.

Para conocer el network bridge de tu pc puedes ejecutar:

:~$ ifconfig -a
enp2s0    Link encap:Ethernet  direcciónHW fc:aa:14:09:3b:c8  
          Direc. inet:192.168.1.45  Difus.:192.168.1.255  Másc:255.255.255.0
          Dirección inet6: fe80::43ed:3947:1479:123d/64 Alcance:Enlace
          ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1
          Paquetes RX:1609912 errores:0 perdidos:0 overruns:0 frame:0
          Paquetes TX:692478 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:1000 
          Bytes RX:1832204957 (1.8 GB)  TX bytes:90518737 (90.5 MB)
 
lo        Link encap:Bucle local  
          Direc. inet:127.0.0.1  Másc:255.0.0.0
          Dirección inet6: ::1/128 Alcance:Anfitrión
          ACTIVO BUCLE FUNCIONANDO  MTU:65536  Métrica:1
          Paquetes RX:7793 errores:0 perdidos:0 overruns:0 frame:0
          Paquetes TX:7793 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:1 
          Bytes RX:804924 (804.9 KB)  TX bytes:804924 (804.9 KB)
 
lxcbr0    Link encap:Ethernet  direcciónHW 00:16:3e:00:00:00  
          Direc. inet:10.0.3.1  Difus.:0.0.0.0  Másc:255.255.255.0
          Dirección inet6: fe80::216:3eff:fe00:0/64 Alcance:Enlace
          ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1
          Paquetes RX:294 errores:0 perdidos:0 overruns:0 frame:0
          Paquetes TX:1061 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:1000 
          Bytes RX:47150 (47.1 KB)  TX bytes:207526 (207.5 KB)

También podemos ejecutar el comando brctl show:

:~$  brctl show
bridge name	bridge id		STP enabled	interfaces
lxcbr0		8000.00163e000000	no		vethUPQ68R

Dónde queda más claro el bridge que estamos usando.

  1. Crea el fichero de configuración para lxc, donde definiremos el network bridge y configuraremos el mount de la carpeta del proyecto:

Se suele situar en lxc/config/ubuntu.name-container.conf.

Ejemplo:

# Network configuration
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0

Debes modificar las siguientes rutas y atributos:

# Network configuration
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = {$network_link}

Donde:

{$network_link} = Network bridge name. En ubuntu suele ser lxcbr0

  1. Crear container con la release trusty de Ubuntu: sudo lxc-create -n ofn-dev -f lxc/config/ubuntu.ofn.conf -t /usr/share/lxc/templates/lxc-ubuntu -- --release trusty
lxc-create Genera un nuevo container con los parámetros indicados
-n Nombre del container
-f Fichero de configuración de lxc. Generado en el paso anterior
-t Template usado para el SO del container. Para esta app usaremos el de ubuntu.
-- Argumento para funcionalidad en concreto. Ej.: arg1 -- arg_to_arg1
--release Indicamos la release del SO si queremos. Para este caso la release 14.04 o trusty

Si todo va bien, debe devolver algo parecido a esto:

##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##

Es el usuario y contraseña que se generan por defecto en los containers de lxc. El nombre es ubuntu para la release de ubuntu.

  1. Arrancar el container:

sudo lxc-start -n ofn-dev

  1. Comprobar si el container tiene IP con: sudo lxc-ls -f

Debería mostrar algo así:

NAME             STATE   AUTOSTART GROUPS IPV4      IPV6 
ofn-dev          RUNNING 0         -      10.0.3.94 -    
  1. Copiar ip del container en /etc/hosts dándole un nombre al host. Esto nos será útil para acceder o referenciar nuestro container. Añade una línea como la siguiente al fichero /etc/hosts, junto al resto de hosts declarados. Necesitarás permisos de superusuario.

10.0.3.210 local.ofn.org

Debemos asegurarnos que para el host introducido solo tenemos una entrada, y no se repite ya que ocasionará problemas al conectar con ssh o el navegador.

En este punto ya podemos ejecutar comandos dentro de nuestro container con el command lxc-attach o bien mediante una conexión ssh con la ip o referenciando el host que acabamos de declarar mediante el comando ssh ubuntu@local.ofn.org .

  1. Para ejecutar la tarea encargada de crear el usuario administrador, es necesario acceder por ssh sin contraseña al servidor con el usuario root. Para copiar la clave ssh necesitamos la contraseña de root en el contenedor. Al no conocer la contraseña del usuario root, podemos cambiarla directamente aprovechando la herramienta que nos proporciona LXC, lxc-attach:
:~$  sudo lxc-attach -n ofn-dev -- passwd
Introduzca la nueva contraseña de UNIX: 
Vuelva a escribir la nueva contraseña de UNIX: 
passwd: password updated successfully

El container se debe realizar para aplicar estos cambios, por lo que esperaremos a realizar todos los cambios que requieren un reinicio y reiniciamos.

  1. Normalmente los ficheros de configuración del servidor ssh tiene capada la entrada como root. Debemos modificar el fichero de configuración para permitir el acceso. En el fichero /etc/ssh/sshd_config del contenedor debemos modificar la opción PermitRootLogin del valor que tenga por defecto a yes:

PermitRootLogin yes

Podemos editar manualmente con un editor el fichero, siempre con permisos de superusuario, por lo que deberemos utilizar sudo si entracomo como ubuntu. Otra opción es utilizar el comando lxc-attach:

sudo lxc-attach -n ofn-dev -- /bin/sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
sudo lxc-attach -n ofn-dev -- /bin/sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

De esta forma utilizamos también el comando sed, el cual se usa para añadir, sustituir o eliminar datos de un fichero. En este caso se indica la opción de sustitución, el string PermitRootLogin prohibit-password o PermitRootLogin without-password por PermitRootLogin yes en el fichero /etc/ssh/sshd_config.

Esta configuración se aplicará tras el reinicio.

Recordemos que tenemos que montar el directorio del repositorio en la home del usuario openfoodnetwork, por lo que necesitamos crear el fichero openfoodnetwork con permisos para acceder al directorio cuando lo tengamos montado. Al montar el directorio utilizando la configuración de LXC, este se monta con el usuario default del container como creador, en este caso el usuario ubuntu. La manera que tiene el sistema de identificar a los usuarios es mediante el UUID, el identificador único universal. Este para los usuarios comienza en 1000 y va aumentando con cada nuevo usuario. Necesitamos que el usuario openfoodnetwork tenga el UUID 1000, por lo que para conseguirlo debemos eliminar el usuario default, reemplazandolo por el usuario openfoodnetwork:

  1. Eliminamos el usuario default del container:

sudo lxc-attach -n ofn-dev -- userdel -r ubuntu

  1. Creamos un nuevo usuario con nombre openfoodnetwork. Añadimos la opción -m para que nos genere un directorio raíz. Y le damos una contraseña:

sudo lxc-attach -n ofn-dev -- useradd -m openfoodnetwork

sudo lxc-attach -n ofn-dev -- passwd openfoodnetwork

  1. Recordemos que tenemos que montar el directorio del repositorio en la home del usuario openfoodnetwork, por lo que modificamos el fichero de configuración del container /var/lib/lxc/ofn-dev/config añadiendo la opción de montaje:

lxc.mount.entry = /home/my-user/dev/OFN/openfoodnetwork /var/lib/lxc/ofn-dev/rootfs/home/openfoodnetwork/openfoodnetwork none bind,create=dir 0.0

Para ello se puede realizar la modificación a mano con un editor en modo superusuario como hicimos para modificar la configuración del servidor ssh, o se puede ejecutar el siguiente comando:

echo "lxc.mount.entry = /home/my-user/dev/OFN/openfoodnetwork /var/lib/lxc/ofn-dev/rootfs/home/openfoodnetwork/openfoodnetwork none bind,create=dir 0.0" | sudo tee -a /var/lib/lxc/ofn-dev/config > /dev/null`

El cual añade la instrucción anterior al fichero de configuración al final de este con el comando tee. El resultado de esta acción se desvía a la papelera.

  1. Ya podemos reiniciar el container:
sudo lxc-stop -n ofn-dev
sudo lxc-start -n ofn-dev
  1. Una vez reiniciado el container y todos los cambios se han realizado, sólo queda copiar la clave ssh de la máquina donde trabajamos en el servidor para los usuarios root y openfoodnetwork.

Para ello debemos asegurarnos que tenemos una ssh key en nuestro ordenador. Para ello podemos ver si está en la dirección por defecto ~/.ssh/ deben aparecer estos dos ficheros:

-rw-------  1 daniel daniel 3215 feb 17 16:41 id_rsa
-rw-r--r--  1 daniel daniel  736 feb 17 16:41 id_rsa.pub

id_rsa → Es el que contiene la clave privada. Esta no se debe compartir.

id_rsa.pub → Esta es la clave pública que utilizamos para copiar en el host al que queremos tener libre acceso para identificarnos.

Si no los tenemos, debemos generarlos. Para ello utilizamos el comando: ssh-keygen Ej.:

ubuntu@ofn-dev:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ubuntu/.ssh/id_rsa.
Your public key has been saved in /home/ubuntu/.ssh/id_rsa.pub.
  1. Copiamos ssh key en el container:

ssh-copy-id openfoodnetwork@local.ofn.org

ssh-copy-id root@local.ofn.org

Para realizar la acción nos pedirá la contraseña del usuario.

Ya tenemos el container con acceso libre con el usuario openfoodnetwork y root. Ahora podemos comprobar que tenemos acceso sin contraseña con: ssh openfoodnetwork@local.ofn.org o ssh root@local.ofn.org y listando los ficheros y directorios de la raíz del usuario openfoodnetwork veremos que tenemos la carpeta openfoodnetwork/ que es un reflejo de la carpeta de nuestro proyecto.