evrardjp.tinc
Tinc
Este rol instala tinc en una topología de estrella o anillo.
Los nodos listados en el grupo [tinc_nodes] son la lista completa de nodos para aplicar/installar el rol.
Los nodos que forman parte de [tinc_spine_nodes] son los nodos "clave", donde se conectan todos los nodos.
Los nodos en [tinc_leaf_nodes] se conectan solo a los nodos en el "core". Dispositivos detrás de un NAT serían un ejemplo de esto.
Si todos los [tinc_nodes] son parte de los [tinc_spine_nodes], tienes una topología más "anillada". Si tienes un nodo en [tinc_spine_nodes], tienes una topología más "estrellada".
Requisitos
- Ubuntu 18.04 / CentOS 7 (o superior) / OpenWRT
- En CentOS y versiones superiores, el repositorio EPEL debe ser configurado previamente.
Para hacerlo, puedes ejecutar lo siguiente:
yum install epel-release || dnf install epel-release
yum update || dnf update
Variables del Rol
- tinc_key_size: El tamaño de las claves generadas (Por defecto:
4096
) - tinc_address_family puede ser ipv4/ipv6/cualquiera (o no definido)
- tinc_mode puede ser router, switch o hub. (Ver https://www.tinc-vpn.org/documentation/tinc.conf.5). (Por defecto:
router
) - tinc_netname: El nombre de la red tinc
- tinc_vpn_ip: La IP que se asignará a un solo punto final de VPN. Usa vars de host para configurarlo.
- tinc_vpn_cidr: El cidr utilizado en la red tinc (Por defecto:
/24
, o fuerza /32 en modo router). - tinc_vpn_interface: El dispositivo que tinc usará, en caso de que haya múltiples dispositivos tun (Por defecto:
tun0
) - tinc_control_plane_bind_ip: La IP donde se vinculará el servicio tincd (Por defecto:
ansible_default_ipv4.address
}} )
El inventario debe establecer tinc_control_plane_bind_ip (para el core) y/o tinc_vpn_ip (para nodos core y edge). Por favor, revisa los archivos de tareas.
Ejemplos
Modo router, topología anillo
(Inventario corto):
[tinc_nodes:children]
tinc_spine_nodes
tinc_leaf_nodes
[tinc_spine_nodes]
node1 tinc_vpn_ip=10.10.0.11
node2 tinc_vpn_ip=10.10.0.12
node3 tinc_vpn_ip=10.10.0.13
[tinc_leaf_nodes]
node1
node2
node3
Modo router, topología estrella
(Inventario detallado):
[tinc_nodes]
node1
node2
node3
[tinc_spine_nodes]
node1
[tinc_leaf_nodes]
node1
node2
node3
Variables de grupo para tinc_nodes
:
tinc_netname: mynetname
tinc_vpn_interface: tun0
Variables para el nodo spine, node1
:
tinc_control_plane_bind_ip: "{{ ansible_eth0.ipv4.address | default(ansible_default_ipv4.address) }}"
tinc_vpn_ip: 10.10.0.10
Variables para el nodo edge, node2
:
tinc_vpn_ip: 10.10.0.11
Variables para el nodo edge, node3
:
tinc_vpn_ip: 10.10.0.12
Dependencias
Ninguna
Ejemplo de Playbook
Ver https://raw.githubusercontent.com/evrardjp/ansible-tinc/master/molecule/default/converge.yml
No olvides establecer las variables necesarias en tu inventario (ver arriba).
Pruebas
Las pruebas se basan en el marco de trabajo Molecule de Ansible que:
- verifica la sintaxis del rol
- inicia varios contenedores con diferentes sistemas operativos (solo para pruebas. No mezclamos versiones de Tinc en producción)
- aplica este rol a cada contenedor
- realiza pruebas de idempotencia (asegúrate de que la segunda ejecución no realice cambios inesperados)
- verifica que cada nodo preparado pueda hacer ping a otros nodos a través de VPN
Las pruebas se ejecutan en acciones de GitHub en PR y diariamente. Además, puedes ejecutarlas en tu máquina local.
Dependencias que necesitas tener instaladas para ejecutar las pruebas:
Ejecutar pruebas manualmente, usando molecule directamente
Puedes ejecutar las pruebas existentes para topologías de estrella y anillo:
cd ansible-tinc
molecule test # esto ejecuta las pruebas predeterminadas para el escenario de Anillo
molecule test -s star
El comando 'molecule test' ejecuta el escenario completo: 'crear', 'converger', 'verificar idempotencia', 'verificar' y 'destruir' pasos. A menudo no querrás que el contenedor se destruya de inmediato y necesitarás acceder a él para depurar. Para esto, podría ser útil reemplazar 'molecule test' con:
molecule converge # esto crea contenedores y aplica el rol
molecule verify # ejecuta pruebas descritas en molecule/default/verify.yml
# después de ambos pasos tendrás contenedores de Docker activos
# puedes acceder a ellos con los comandos habituales 'docker ps', 'docker exec', etc.
molecule destroy
Ejecutar pruebas manualmente, usando tox
tox es un ejecutor de pruebas para Python. Instalará todas las dependencias de Python necesarias (ansible, molecule[docker]) en un entorno virtual.
Para ejecutar una prueba:
tox -e ansible-<version>-<escenario tinc>
Ver valores compatibles para version
en tox.ini
.
Los escenarios actuales que se pueden probar para tinc son ring
, o star
.
Los argumentos posicionales se pasarán al comando molecule test
.
Por ejemplo, para ejecutar una prueba para ansible-2.9, con la topología anillo y evitar que molecule destruya el entorno:
tox -e ansible-2.9-ring -- --destroy=never
Cómo probar el rol con un nuevo SO
Añade una nueva imagen a molecule/default/molecule.yml y molecule/star/molecule.yml siguiendo los ejemplos existentes. Los archivos son similares excepto por las variables scenario.name
y groups
. Los siguientes puntos podrían ser útiles:
- el código
privileged: true
concommand: /sbin/init
habilita systemd si el contenedor lo soporta. Por favor, no olvides que los contenedores privilegiados en tu sistema podrían ser un riesgo. - Las imágenes de Docker carecen de algunos programas estándar, así que molecule/default/converge.yml se encarga de instalar las dependencias necesarias.
- de acuerdo con https://github.com/ansible-community/molecule/issues/959, Docker no permite modificar /etc/hosts en un contenedor. Para solucionar esto, estamos omitiendo un paso con la etiqueta
molecule-notest
en tasks/tinc_configure.yml y modificando /etc/hosts durante la creación del contenedor - siguiendo las directrices correspondientes en molecule/default/molecule.yml.
Licencia
Apache2
Información del Autor
Jean-Philippe Evrard
ansible-galaxy install evrardjp.tinc