Curso : 202223, 201920
Area : Sistemas operativos, monitorización, devops
Descripción : Practicar test de infraestructura
Requisitos : Varias máquinas. Una al menos con GNU/Linux
Tiempo : 3 sesiones preparativos
4 sesiones realizar la práctica
Propuesta de rúbrica:
Criterio | Muy bien(2) | Regular(1) | Poco adecuado(0) |
---|---|---|---|
(2.2) Comprobar | |||
(3.2) Comprobar | |||
(4.2) Comprobar | |||
(5.2) Comprobar | |||
(6.2) Comprobar | . |
- ¿Qué son los test de infraestructura?
- ¿Qué significa ver la infraestructura como código (IaC)?
Comparativa de varios test de infraestructura:
Features | Teuton | Testinfra | Goss |
---|---|---|---|
URL | https://github.com/teuton-software/teuton | https://testinfra.readthedocs.io/en/latest/index.html | https://github.com/aelsabbahy/goss |
License | GPL v.3 | Apache license 2.0 | Apache license 2.0 |
Programming language | Ruby | Python | Go |
Platforms | Multiplatform | Multiplatform | GNU/Linux |
Remote connections | SSH, Telnet | SSH | ? |
Installed on | Master | Slave | |
Test Units Lenguage definition | Teuton DSL | Python | YAML |
Configuration input files | YAML, JSON | Python | YAML |
Output formats | Documentation, TXT, YAML, JSON, silent | ? | rspecish, documentation, JSON, TAP, JUnit, nagios, silent |
Builtin functions | Yes | Yes | ... |
Function creation | Yes | ? | ? |
TODO: Incluir Inspec en la comparativa.
Listado de las máquinas que vamos a necesitar:
ID | Sistema | Hostname | IP |
---|---|---|---|
1 | OpenSUSE Tumbleweed | apellidoXXg | 172.AA.XX.31 |
2 | OpenSUSE | apellidoXXg2 | 172.AA.XX.32 |
3 | RbPI | apellidoXXrb | 172.AA.XX.51 |
4 | Windows | apellidoXXw | 172.AA.XX.11 |
Configurar en todas las máquinas:
- IP estática.
- Activar servicio SSH.
- Habilitar acceso SSH a root (Modificar fichero de configuración con
PermitRootLogin Yes
). - Comprobar acceso remoto SSH con el comando
ssh root@IP-DE-LA-MV
.
Enlaces de interés:
- Entender los modos de trabajo de Teuton y la diferencia entre T-NODE y S-NODE.
- T-NODE: Máquina con Teuton.
- S-NODE: Máquina con el servicio SSH (Configurar el servicio SSH)
Enlace de interés:
Vamos a ver el proceso de instalación de teuton
en la máquina T-NODE:
Entrar como superusuario.
ruby -v
para comprobar la versión de ruby ( >= 2.5.9). En caso contrario instalar ruby.gem install teuton
, instalar Teuton (Necesitaremos tener privilegios de root para instalar).gem info teuton
, para comprobar que lo tenemos instalado.
ADVERTENCIA: En OpenSUSE es necesario además es necesario hacer los siguiente:
find /usr -name teuton
, para localizar el ejecutable.ln -s PATH/TO/FILE/teuton /usr/local/bin/teuton
, crear un enlace al ejecutable.
Entrar como nuestro usuario normal:
teuton version
, comprobar versión (>= 2.4.5).
En esta práctica NO hay que hacer informe. Sólo hay que entregar un fichero comprimido zip con el contenido de las siguientes carpetas:
towerXX/*
var/*
Recordar que XX es un identificador asociado a cada alumno.
Ir a la MV1:
- A partir de ahora trabajaremos con nuestro usuario habitual (no usar root).
- Ir al directorio
Documentos
para trabajar ahí. teuton new towerXX/test2
, para crear los ficheros para nuestro test. Los ficheros principales son:config.yaml
, fichero de configuración de las máquinasstart.rb
, definición de las unidades de prueba.
- Modificar
config.yaml
para incluir todas las máquinas que queremos monitorizar:
---
:global:
:cases:
- :tt_members: teuton-XX
:host_ip: 127.0.0.1
- :tt_members: GNU/Linux-XX
:host_ip: 172.18.XX.32
- :tt_members: RaspberryPI-XX
:host_ip: 172.18.XX.51
- :tt_members: Windows-XX
:host_ip: 172.18.XX.11
- Vamos a modificar
start.rb
para preparar un test de conectividad con las máquinas:
group "alumnoXX - test2" do
target "Comprobar la conectividad"
run "ping -c 1 #{get(:host_ip)}"
expect " 0% packet loss"
end
play do
show
export
end
Explicación:
- target: se usa para iniciar la definición de un "objetivo" de motnitorización. Debemos poner una descripción que nos ayude a identificar cuál es ese objetivo.
- run: Indica el comando queremos ejecutar en la máquina local. Esta será la máquina T-Node, donde tenemos instalado Teutón.
- expect: Comprueba que la salida del comando anterior (run) contenga el texto que esperamos.
A continuación vemos una imagen de ejemplo, donde tenemos:
- En verde la salida de un comando que se ejecuta dando la salida que esperamos (
expect " 0% packet loss"
). - En rojo la salida de un comando que se ejecuta dando una salida que NO esperamos.
- Sintaxis:
teuton check towerXX/test2
, nos hace una revisión de la sintaxis de los ficherosconfig.yaml
ystart.rb
por si hemos escrito algo mal. - Ejecución:
teuton towerXX/test2
, ejecutar el test. - Resultados: Tenemos los resultados en el directorio
var/test2
. Comprobar que los resultados son los correctos.
- Crear el test
towerXX/test3
. - Personalizar el fichero de configuración (
config.yaml
):
---
:global:
:host_username: root
:cases:
- :tt_members: teuton-XX
:host_ip: 127.0.0.1
:host_password: clave-secreta
- :tt_members: GNU/Linux-XX
:host_ip: 172.18.XX.32
:host_password: clave-secreta
- :tt_members: RaspberryPI-XX
:host_ip: 172.18.XX.51
:host_password: clave-secreta
- :tt_members: Windows-XX
:tt_skip: true
:host_ip: 172.18.XX.11
:host_password: clave-secreta
Explicación. Nos fijamos que se han añadido los siguientes parámetros:
Parámetro | Descripción |
---|---|
host_username | será el nombre del usuario que usaremos para conectarnos de forma remota a las máquinas vía SSH |
host_ip | será valor de IP de la máquina a la que vamos a conectarnos de forma remota vía SSH |
tt_skip | si se pone a true estamos indicando que esta máquina no la vamos a comprobar por ahora. De momento vamos a excluir (skip==true) la máquina Windows de la monitorización, porque los comandos son diferentes. Lo arreglaremos más adelante. |
- Vamos a modificar
start.rb
para comprobar lo siguiente en las máquinas remotas:- Puerta de enlace:
ping -c 1 8.8.4.4
- Servidor DNS:
host www.nba.com
- Puerta de enlace:
group "alumnoXX - test3" do
target "La puerta de enlace funciona correctamente"
run "ping -c 1 8.8.4.4", on: :host
expect " 0% packet loss"
target "Servidor DNS funciona correctamente"
run "host www.nba.com", on: :host
expect "has address"
end
play do
show
export
end
Explicación:
- run: La sentencia "run" ejecuta un comando en una máquina remota. La conexión con la máquina remota se realiza usando el protocolo SSH.
- Cuando ejecutamos el comando
host www.nba.com
de forma correcta, obtenemos una salida como la siguiente, donde se obtiene al menos una línea con el textohas address
:
> host www.nba.com
www.nba.com has address 104.126.107.194
www.nba.com has IPv6 address 2a02:26f0:13c:396::2e1
www.nba.com has IPv6 address 2a02:26f0:13c:38b::2e1
www.nba.com is an alias for nbaevsecure.edgekey.net.
nbaevsecure.edgekey.net is an alias for e737.dscg.akamaiedge.net.
- Cuando ejecutamos el comando
host www.enebea66.com
y es incorrecto, comprobamos que la salida no muestra ninguna línea del tipohas address
:
> host www.enebea66.com
Host www.enebea66.com not found: 3(NXDOMAIN)
- Sintaxis.
teuton check castleXX/test3
, nos hace una revisión de la sintaxis de los ficherosconfig.yaml
ystart.rb
por si hemos escrito algo mal. En tal caso, hay que revisar el apartado anterior. - Ejecución.
teuton castleXX/test3
, ejecutar el test. - Resultados. Tenemos los resultados en el directorio
var/test3
. Comprobar que los resultados son los correctos.
- Copiar test3 en
towerXX/test4
. - Ampliar los "targets" para evaluar lo siguiente en las máquinas remotas:
- Nombre de equipo:
hostname
- Usuario alumno:
id nombre-alumno
- Nombre de equipo:
- Modificar el fichero de configuración para incluir nuevos parámetros (
hostname
yusername
):
---
:global:
:host_username: root
:username: nombre-del-alumno
:cases:
- :tt_members: teuton-XX
:host_ip: localhost
:host_password: clave-secreta
:hostname: apellidoXXg
- :tt_members: GNU/Linux-XX
:host_ip: 172.18.XX.32
:host_password: clave-secreta
:hostname: apellidoXXg2
- :tt_members: RaspberryPI-XX
:host_ip: 172.18.XX.51
:host_password: clave-secreta
:hostname: apellidoXXrb
- :tt_members: Windows-XX
:tt_skip: true
:host_ip: 172.18.XX.11
:host_password: clave-secreta
:hostname: apellidoXXw
Veamos un ejemplo de monitorización del nombre del equipo:
target "Comprobar el nombre del equipo"
run "hostname", on: :host
expect get(:hostname)
- Sintaxis:
teuton test towerXX/test4
, nos hace una revisión de la sintaxis de los ficherosconfig.yaml
ystart.rb
por si hemos escrito algo mal. - Ejecución:
teuton towerXX/test4
, ejecutar el test. - Resultados: Tenemos los resultados en el directorio
var/test4
. Comprobar que los resultados son los correctos.
- Crear un nuevo test
towerXX/test5
.
Definir las comprobaciones necesarias en start.rb
para:
- Comprobar que existe el grupo
jedis
. - Comprobar que existe el usuario
obiwan
. - Comprobar que
obiwan
es miembro del grupojedis
. - Comprobar que existe el directorio
/home/obiwan/private
. - Comprobar que existe el directorio
/home/obiwan/group
. - Comprobar que existe el directorio
/home/obiwan/public
. - Comprobar
/home/obiwan/private
tiene los permisos700
. - Comprobar
/home/obiwan/group
tiene los permisos750
. - Comprobar
/home/obiwan/public
tiene los permisos755
.
- Comprobar la sintaxis.
teuton towerXX/test5
, ejecutar el test.- Tenemos los resultados en el directorio
var/test5
. Comprobar que los resultados son los correctos.
Partimos del ejemplo anterior:
- Copiar el test anterior y modificar los comandos de comprobación para adaptarlo a otro sistema operativo. En nuestro caso elegiremos SO Windows. Por ejemplo, para comprobar si existe un usuario cambiar
id nombre-alumno
pornet user alumno
, etc.
Fichero de configuración:
- Modificar
config.yaml
para monitorizar únicamente a la máquina Windows. Esto es, usar el parámetro:tt_skip: true
o:tt_skip: false
según convenga para habilitar/deshabilitar el test en determinados "cases" o máquinas.
Definir las comprobaciones necesarias en start.rb para:
- Comprobar que existe el grupo jedis (
net localgroup
). - Comprobar que existe el usuario obiwan (
net user
). - Comprobar que obiwanes miembro del grupo jedis (
net user obiwan
). - Comprobar que existe el directorio
C:\Users\obiwan\private
. - Comprobar que existe el directorio
C:\Users\obiwan\group
. - Comprobar que existe el directorio
C:\Users\obiwan\public
.
- Comprobar la sintaxis.
teuton towerXX/test6
, ejecutar el test.- Tenemos los resultados en el directorio
var/test6
. Comprobar que los resultados son los correctos.