tinc
Tinc
Этот ролик устанавливает tinc в звёздной или кольцевой топологии.
Узел, указанный в группе [tinc_nodes], представляет собой полный список узлов для применения/установки роли.
Узлы из [tinc_spine_nodes] являются "основными" узлами, к которым подключаются все остальные узлы.
Узлы в [tinc_leaf_nodes] подключаются только к основным узлам. Устройства за NAT будут примером таких узлов.
Если все узлы [tinc_nodes] входят в [tinc_spine_nodes], вы получаете более "кольцевую" топологию. Если у вас есть один узел в [tinc_spine_nodes], у вас будет более "звёздчатая" топология.
Требования
- Ubuntu 18.04 / CentOS 7 (или выше) / OpenWRT
- На CentOS и выше необходимо предварительно настроить репозиторий EPEL.
Для этого вы можете выполнить следующее:
yum install epel-release || dnf install epel-release
yum update || dnf update
Переменные роли
- tinc_key_size: Размер сгенерированных ключей (По умолчанию:
4096
) - tinc_address_family может быть ipv4/ipv6/any (или неопределённой)
- tinc_mode может быть router, switch или hub. (См. https://www.tinc-vpn.org/documentation/tinc.conf.5). (По умолчанию:
router
) - tinc_netname: Имя сети tinc
- tinc_vpn_ip: IP, который будет назначен одному конечному устройству VPN. Используйте переменные хоста для установки этого значения.
- tinc_vpn_cidr: CIDR, используемый в сети tinc (По умолчанию:
/24
, или принудительно /32 в режиме маршрутизатора). - tinc_vpn_interface: Устройство, которое будет использовать tinc, в случае, если существует несколько туннельных устройств (По умолчанию:
tun0
) - tinc_control_plane_bind_ip: IP для привязки службы tincd (По умолчанию:
ansible_default_ipv4.address
)
Инвентарь должен устанавливать tinc_control_plane_bind_ip (для основных узлов) и/или tinc_vpn_ip (для основных и крайних узлов). Пожалуйста, посмотрите на файлы задач.
Примеры
Режим маршрутизатора, кольцевая топология
(Кратко) Инвентарь:
[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
Режим маршрутизатора, звёздная топология
(Подробный) Инвентарь:
[tinc_nodes]
node1
node2
node3
[tinc_spine_nodes]
node1
[tinc_leaf_nodes]
node1
node2
node3
Групповые переменные для tinc_nodes
:
tinc_netname: mynetname
tinc_vpn_interface: tun0
Переменные хоста для основного узла, node1
:
tinc_control_plane_bind_ip: "{{ ansible_eth0.ipv4.address | default(ansible_default_ipv4.address) }}"
tinc_vpn_ip: 10.10.0.10
Переменные хоста для крайнего узла, node2
:
tinc_vpn_ip: 10.10.0.11
Переменные хоста для крайнего узла, node3
:
tinc_vpn_ip: 10.10.0.12
Зависимости
Нет
Пример плейбука
См. https://raw.githubusercontent.com/evrardjp/ansible-tinc/master/molecule/default/converge.yml
Не забудьте задать необходимые переменные в вашем инвентаре (см. выше).
Тестирование
Тесты основаны на фреймворке Ansible Molecule, который:
- проверяет синтаксис роли
- запускает несколько контейнеров с разными ОС (только для тестов. Мы не смешиваем версии Tinc в продакшен)
- применяет эту роль к каждому контейнеру
- выполняет тесты идемпотентности (на убедитесь, что второй запуск не внесет неожиданные изменения)
- проверяет, что каждый подготовленный узел может пинговать другие узлы по VPN
Тесты запускаются в действиях GitHub при PR и каждый день. Кроме того, вы можете выполнять их на локальной машине.
Зависимости, которые необходимо установить для запуска тестов:
Запуск тестов вручную, используя molecule напрямую
Вы можете запустить существующие тесты для звёздной и кольцевой топологи:
cd ansible-tinc
molecule test # это запустит тесты по умолчанию для сценария кольцо
molecule test -s star
Команда 'molecule test' выполняет полный сценарий: 'create', 'converge', 'check idempotency', 'verify' и 'destroy'. Часто вы не хотите, чтобы контейнер немедленно уничтожался и нужен доступ к нему для отладки. Для этого может быть полезно заменить 'molecule test' на:
molecule converge # это создаст контейнеры и применит роль
molecule verify # выполнит тесты, описанные в molecule/default/verify.yml
# после этих двух шагов у вас будут запущенные Docker контейнеры
# вы можете получить к ним доступ обычными командами 'docker ps', 'docker exec' и т. д.
molecule destroy
Запуск тестов вручную, используя tox
tox - это среда запуска тестов для Python. Она установит все необходимые зависимости Python (ansible, molecule[docker]) в виртуальной среде.
Чтобы запустить тест:
tox -e ansible-<version>-<tinc scenario>
См. поддерживаемые значения для version
в tox.ini
.
Текущие тестируемые сценарии для tinc - это ring
или star
.
Позиционные аргументы будут переданы команде molecule test
.
Например, чтобы запустить тест для ansible-2.9 с кольцевой топологией и предотвратить разрушение среды:
tox -e ansible-2.9-ring -- --destroy=never
Как протестировать роль с новой ОС
Добавьте новый образ в molecule/default/molecule.yml и molecule/star/molecule.yml, следуя существующим примерам. Файлы похожи, за исключением переменных scenario.name
и groups
. Следующие моменты могут быть полезны:
- код
privileged: true
сcommand: /sbin/init
включает systemd, если контейнер это поддерживает. Не забудьте, что привилегированные контейнеры в вашей системе могут представлять риск. - Docker-изображения могут не содержать стандартного программного обеспечения, поэтому molecule/default/converge.yml заботится об установке необходимых зависимостей.
- согласно https://github.com/ansible-community/molecule/issues/959 Docker не позволяет изменять /etc/hosts в контейнере. Чтобы обойти это, мы пропускаем один шаг с тегом
molecule-notest
в tasks/tinc_configure.yml и изменяем /etc/hosts во время создания контейнера - следуя соответствующим директивам в molecule/default/molecule.yml.
Лицензия
Apache2
Информация об авторе
Жан-Филипп Эврар
ansible-galaxy install evrardjp/ansible-tinc