headscale

Ansible Роль: Headscale

CI

Это Ansible роль для установки и настройки Headscale — открытой, самостоятельно размещаемой реализации сервера управления Tailscale.

Это восхитительно, ознакомьтесь: juanfont/Headscale

Отказ от ответственности

Автор этого проекта никоим образом не связан с проектом Headscale или Tailscale Inc.

ПО ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ ГАРАНТИЙ ЛЮБОГО РОДА, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОГО КАЧЕСТВА, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НАРУШЕНИЯ ПРАВ. НИ В КОЕМ СЛУЧАЕ АВТОР НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ИСКИ, УБЫТКИ ИЛИ ИНУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ ТО В РАМКАХ ДОГОВОРА, ДЕЛИКТОВ ИЛИ ИНЫМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ИЗ ИЛИ В СВЯЗИ С ЭТИМ ПО ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ИНДИВИДУАЛЬНЫМИ СДЕЛКАМИ С ЭТИМ ПО.

ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК

Совместимость

Эта роль была протестирована на следующих платформах:

  • CentOS 8 x64
  • Debian 10 x64
  • Debian 11 x64
  • Ubuntu Server 20.04 x64
  • Ubuntu Server 22.04 x64

Установка

ansible-galaxy

ansible-galaxy install hampusstrom.headscale

Ручная установка

Текущий пользователь только:

git clone https://github.com/hampusstrom/ansible-role-headscale.git ~/.ansible/roles/hampusstrom.headscale

Для всей системы:

git clone https://github.com/hampusstrom/ansible-role-headscale.git /etc/ansible/roles/hampusstrom.headscale

Требования

Эта роль не имеет никаких необычных требований и должна работать везде, где работают ansible, headscale и systemd.

GitHub API

Эта роль использует GitHub API.

GitHub API имеет ограничение по количеству запросов.

Неаутентифицированным пользователям разрешается делать только 60 запросов в час.

Если вы разработчик, вы можете быстро достичь этого лимита.

Чтобы обойти это, вы можете получить Личный токен доступа по адресу: https://github.com/settings/tokens/new

Заполните детали токена доступа в переменные headscale_github_api_*.

headscale_github_api_username: ваш_логин_на_github

headscale_github_api_password: ваш_личный_токен_доступа

headscale_github_api_auth: true

Инициализационная система: systemd

Необходимы права суперпользователя: да

Поскольку требуется root, используйте эту роль в плейбуке, который имеет глобально определённый become:yes или вызовите эту роль, используя ключевое слово become: yes.

- hosts: headscale
  become: yes
  roles:
    - role: hampusstrom.headscale

# ИЛИ

- hosts: headscale
  roles:
    - role: hampusstrom.headscale
      become: yes

Переменные роли

Полное описание всех доступных переменных можно найти в defaults/main.yaml.

Конвенция наименования переменных

Переменные, относящиеся к этой роли, всегда имеют префикс headscale_.

headscale_version

Определяет версию headscale для скачивания и установки на целевых машинах. Может быть либо номер версии (без префикса 'v'). Например, 0.16.4 или latest.

Latest автоматически извлечет последнюю метку релиза из juanfont/headscale репозитория GitHub.

по умолчанию: latest

headscale_config

Содержимое файла конфигурации headscale config.yaml, выраженное как объект yaml. Проверьте стандартную конфигурацию в проекте headscale для вдохновения. На момент написания следующие минимальные значения требуются для версии 0.20.0 headscale.

headscale_config:
  server_url: "http://127.0.01:8080"
  listen_addr: 127.0.0.1:8080
  private_key_path: "{{ headscale_lib_dir_path }}/private.key"
  db_type: sqlite3
  unix_socket: "{{ headscale_run_dir_path }}/headscale.sock"
  ip_prefixes:
    - 100.64.0.0/10
  noise:
    private_key_path: "{{ headscale_lib_dir_path }}/noise_private.key"

headscale_acl

Содержимое файла headscale acl.yaml, выраженное как объект yaml.

headscale_github_repository

Определяет пользователя/repo, которые будут использоваться при поиске и скачивании бинарного файла headscale. Может быть изменен на другой репозиторий для установки форков, например.

по умолчанию: juanfont/headscale

headscale_remove_unmanaged_users

Если установлено в true, любые пользователи, не указанные в headscale_users, будут удалены безвозвратно.

Используйте на свой страх и риск

по умолчанию: false

headscale_users

Список пользователей, которые должны быть созданы и не удаляться, если используются вместе с headscale_remove_unmanaged_users.

по умолчанию: []

headscale_binary_path

Определяет, куда будет загружен и установлен бинарный файл headscale.

по умолчанию: /usr/local/bin/headscale

headscale_user_name

Определяет имя системного пользователя, который должен запускать демона headscale systemd. Будет создано, если еще не существует.

по умолчанию: headscale

headscale_user_group

Определяет имя основной группы для пользователя headscale_user_name.

по умолчанию: {{ headscale_user_name }}

headscale_user_uid

Определяет идентификатор пользователя пользователя headscale_user_name.

по умолчанию: 777

headscale_user_gid

Определяет идентификатор группы группы headscale_user_group.

по умолчанию: {{ headscale_user_uid }}

headscale_etc_dir_path

Определяет путь, в котором должны находиться конфигурационные данные headscale. Вы обычно не должны изменять это, но опция есть для некоторых пользовательских конфигураций/форков.

по умолчанию: /etc/headscale

headscale_lib_dir_path

Определяет путь, в котором должны находиться библиотеки headscale. Вы обычно не должны изменять это, но опция есть для некоторых пользовательских конфигураций/форков.

по умолчанию: /var/lib/headscale

headscale_run_dir_path

Определяет путь, в котором должен находиться UNIX-сокет headscale. Вы обычно не должны изменять это, но опция есть для некоторых пользовательских конфигураций/форков. Параметр конфигурации unix_socket должен указывать на файл .sock в этом каталоге. например: unix_socket: /var/run/headscale/headscale.sock

по умолчанию: /var/run/headscale

headscale_db_path

Путь к файлу базы данных sqlite.

по умолчанию: {{ headscale_lib_dir_path }}/db.sqlite

headscale_backup_dir_path

Путь, где будут храниться резервные копии базы данных. Резервные копии автоматически создаются перед любым обновлением headscale. Если вы решите понизить версию headscale, настоятельно рекомендуется восстановить вашу базу данных. Для этого просто остановите headscale, скопируйте файл базы данных в headscale_db_path и перезапустите headscale.

по умолчанию: {{ headscale_lib_dir_path }}/backups

Пример плейбука

Обратите внимание, что вам всегда следует проверять официальную документацию headscale, чтобы убедиться, что все необходимые значения указаны для вашей версии headscale. Я настоятельно рекомендую скопировать Официальный пример конфигурации и использовать его как основу для вашей конфигурации.

---
---
# Запустите с командой:
# ansible-playbook -i "вашфайлинвентаризации" -K example-playbook.yml
- hosts: all
  become: yes
  vars:
    headscale_version: 0.20.0
    headscale_config:
    # headscale будет искать файл конфигурации с именем `config.yaml` (или `config.json`) в следующем порядке:
    #
    # - `/etc/headscale`
    # - `~/.headscale`
    # - текущий рабочий каталог

    # URL, к которому будут подключаться клиенты.
    # Обычно это будет домен, например:
    #
    # https://myheadscale.example.com:443
    #
    server_url: http://127.0.0.1:8080

    # Адрес для прослушивания / привязки на сервере
    #
    # Для производственной версии:
    # listen_addr: 0.0.0.0:8080
    listen_addr: 127.0.0.1:8080

    # Адрес для прослушивания метрик, вы можете захотеть
    # сделать этот конечный пункт приватным для вашей внутренней
    # сети
    #
    metrics_listen_addr: 127.0.0.1:9090

    # Адрес для прослушивания gRPC.
    # gRPC используется для удалённого управления сервером headscale
    # с помощью CLI
    # Примечание: удаленный доступ _только_ работает, если у вас есть
    # действительные сертификаты.
    #
    # Для производственной версии:
    # grpc_listen_addr: 0.0.0.0:50443
    grpc_listen_addr: 127.0.0.1:50443

    # Разрешает запуск интерфейса администратора gRPC в НЕЗАЩИЩЁННОМ
    # режиме. Это не рекомендуется, так как трафик будет
    # нешифрованным. Включайте только, если вы знаете, что делаете.
    grpc_allow_insecure: false

    # Закрытый ключ, используемый для шифрования трафика между headscale
    # и клиентами Tailscale.
    # Файл закрытого ключа будет автоматически сгенерирован, если отсутствует.
    #
    # Для производственной версии:
    # /var/lib/headscale/private.key
    private_key_path: ./private.key

    # Раздел Noise включает в себя специфическую конфигурацию для
    # протокола TS2021 Noise
    noise:
      # Закрытый ключ Noise используется для шифрования
      # трафика между headscale и клиентами Tailscale при
      # использовании нового протокола на основе Noise. Он должен отличаться
      # от обычного закрытого ключа.
      #
      # Для производственной версии:
      # private_key_path: /var/lib/headscale/noise_private.key
      private_key_path: ./noise_private.key

    # Список префиксов IP для аллокации tailaddresses.
    # Каждый префикс состоит либо из IPv4, либо из IPv6,
    # и связанной длины префикса, разделенной косой чертой.
    # Хотя это выглядит так, будто это может принимать произвольные значения, это
    # должно быть в пределах поддерживаемых диапазонов IP клиентом Tailscale.
    ip_prefixes:
      - fd7a:115c:a1e0::/48
      - 100.64.0.0/10

    # DERP — это релейная система, которую Tailscale использует, когда не удается установить прямое
    # соединение.
    # https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp
    #
    # headscale нуждается в списке DERP-серверов, которые можно представить
    # клиентам.
    derp:
      server:
        # Если включено, запускает встроенный DERP-сервер и объединяет его с остальной конфигурацией DERP
        # URL сервера Headscale, определяемый выше, должен использовать https, DERP требует наличия TLS
        enabled: false

        # Идентификатор региона для использования встроенного DERP-сервера.
        # Локальный DERP преобладает, если идентификатор региона совпадает с другим идентификатором региона из
        # регулярной конфигурации DERP.
        region_id: 999

        # Код региона и название отображаются в интерфейсе Tailscale для идентификации региона DERP
        region_code: "headscale"
        region_name: "Headscale Embedded DERP"

        # Слушает по UDP на настроенном адресе для STUN-подключений - чтобы помочь с транзитом через NAT.
        # Когда встроенный DERP-сервер включен, stun_listen_addr ДОЛЖЕН быть определён.
        #
        # Для получения дополнительной информации о том, как это работает, ознакомьтесь с этой отличной статьёй: https://tailscale.com/blog/how-tailscale-works/
        stun_listen_addr: "0.0.0.0:3478"

      # Список доступных DERP-карт, закодированных в JSON
      urls:
        - https://controlplane.tailscale.com/derpmap/default

      # Локально доступные файлы карт DERP, закодированные в YAML
      #
      # Эта опция в основном интересует людей, размещающих
      # свои собственные DERP-серверы:
      # https://tailscale.com/kb/1118/custom-derp-servers/
      #
      # paths:
      #   - /etc/headscale/derp-example.yaml
      paths: []

      # Если включено, будет настроен рабочий процесс для периодического
      # обновления указанных источников и обновления derpmap.
      auto_update_enabled: true

      # Как часто мы должны проверять обновления DERP?
      update_frequency: 24h

    # Отключает автоматическую проверку обновлений headscale при запуске
    disable_check_updates: false

    # Время, прежде чем неактивная временная нода будет удалена?
    ephemeral_node_inactivity_timeout: 30m

    # Период для проверки обновлений нод в tailnet. Слишком низкое значение значительно повлияет на
    # потребление CPU Headscale. Слишком высокое значение (более 60 секунд) может вызвать проблемы
    # для нод, поскольку они не будут получать обновления или сообщения о жизнеспособности достаточно часто.
    # В случае сомнений не трогайте стандартные 10 секунд.
    node_update_check_interval: 10s

    # Конфигурация SQLite
    db_type: sqlite3

    # Для производственной версии:
    # db_path: /var/lib/headscale/db.sqlite
    db_path: ./db.sqlite

    # # Конфигурация Postgres
    # Если используете Unix-сокет для подключения к Postgres, установите путь сокета в поле 'host' и оставьте 'port' пустым.
    # db_type: postgres
    # db_host: localhost
    # db_port: 5432
    # db_name: headscale
    # db_user: foo
    # db_pass: bar

    # Если требуется другой 'sslmode' вместо 'require(true)' и 'disabled(false)', установите необходимый 'sslmode' в поле 'db_ssl'. Ссылается на https://www.postgresql.org/docs/current/libpq-ssl.html таблицу 34.1.
    # db_ssl: false

    ### Конфигурация TLS
    #
    ## Let's Encrypt / ACME
    #
    # headscale поддерживает автоматическую заявку и настройку
    # TLS для домена с Let's Encrypt.
    #
    # URL для директории ACME
    acme_url: https://acme-v02.api.letsencrypt.org/directory

    # Электронная почта для регистрации у провайдера ACME
    acme_email: ""

    # Имя домена, для которого требуется сертификат TLS:
    tls_letsencrypt_hostname: ""

    # Путь для хранения сертификатов и метаданных, необходимых для
    # letsencrypt
    # Для производственной версии:
    # tls_letsencrypt_cache_dir: /var/lib/headscale/cache
    tls_letsencrypt_cache_dir: ./cache

    # Тип вызова ACME, который будет использоваться, в настоящее время поддерживаемые типы:
    # HTTP-01 или TLS-ALPN-01
    # См. [docs/tls.md](docs/tls.md) для получения дополнительной информации
    tls_letsencrypt_challenge_type: HTTP-01
    # Когда выбран вызов HTTP-01, letsencrypt должен настроить
    # конечную точку проверки, и он будет слушать на:
    # :http = порт 80
    tls_letsencrypt_listen: ":http"

    ## Используйте уже определённые сертификаты:
    tls_cert_path: ""
    tls_key_path: ""

    log:
      # Формат вывода для журналов: текст или json
      format: text
      level: info

    # Путь к файлу, содержащему политик ACL.
    # ACL могут определяться как YAML или HUJSON.
    # https://tailscale.com/kb/1018/acls/
    acl_policy_path: ""

    ## DNS
    #
    # headscale поддерживает настройку DNS Tailscale и MagicDNS.
    # Пожалуйста, ознакомьтесь с их базой знаний, чтобы лучше понять концепции:
    #
    # - https://tailscale.com/kb/1054/dns/
    # - https://tailscale.com/kb/1081/magicdns/
    # - https://tailscale.com/blog/2021-09-private-dns-with-magicdns/
    #
    dns_config:
      # Предпочитать использование DNS, предоставляемого Headscale, или локального.
      override_local_dns: true

      # Список DNS-серверов, выставляемых клиентам.
      nameservers:
        - 1.1.1.1

      # NextDNS (см. https://tailscale.com/kb/1218/nextdns/).
      # "abc123" — пример ID NextDNS, замените на свой.
      #
      # С совместным использованием метаданных:
      # nameservers:
      #   - https://dns.nextdns.io/abc123
      #
      # Без совместного использования метаданных:
      # nameservers:
      #   - 2a07:a8c0::ab:c123
      #   - 2a07:a8c1::ab:c123

      # Разделенный DNS (см. https://tailscale.com/kb/1054/dns/),
      # список доменных запросов и то, к какому DNS следует обращаться для каждого из них.
      #
      # restricted_nameservers:
      #   foo.bar.com:
      #     - 1.1.1.1
      #   darp.headscale.net:
      #     - 1.1.1.1
      #     - 8.8.8.8

      # Поиск доменов, которые будут внедрены.
      domains: []

      # Дополнительные DNS-записи
      # на данный момент поддерживаются только A-записи (с стороны tailscale)
      # См. https://github.com/juanfont/headscale/blob/main/docs/dns-records.md#Limitations
      # extra_records:
      #   - name: "grafana.myvpn.example.com"
      #     type: "A"
      #     value: "100.64.0.3"
      #
      #   # вы также можете записать это в одну строку
      #   - { name: "prometheus.myvpn.example.com", type: "A", value: "100.64.0.3" }

      # Использовать [MagicDNS](https://tailscale.com/kb/1081/magicdns/).
      # Работает только если определён хотя бы один nameserver.
      magic_dns: true

      # Определяет основной домен для создания имен хостов для MagicDNS.
      # `base_domain` должен быть FQDN, без завершающей точки.
      # FQDN хостов будет
      # `hostname.user.base_domain` (например, _myhost.myuser.example.com_).
      base_domain: example.com

    # Unix-сокет, используемый для подключения CLI без аутентификации
    # Примечание: для производственной версии вам потребуется установить это на что-то вроде:
    # unix_socket: /var/run/headscale.sock
    unix_socket: ./headscale.sock
    unix_socket_permission: "0770"
    #
    # headscale поддерживает экспериментальную поддержку OpenID connect,
    # она всё ещё тестируется и может иметь некоторые ошибки, пожалуйста,
    # помогите нам протестировать это.
    # OpenID Connect
    # oidc:
    #   only_start_if_oidc_is_available: true
    #   issuer: "https://your-oidc.issuer.com/path"
    #   client_id: "your-oidc-client-id"
    #   client_secret: "your-oidc-client-secret"
    #   # Или установите `client_secret_path`, чтобы читать секрет из файла.
    #   # Он разрешает переменные окружения, что упрощает интеграцию с systemd's
    #   # `LoadCredential`:
    #   client_secret_path: "${CREDENTIALS_DIRECTORY}/oidc_client_secret"
    #   # client_secret и client_secret_path исключают друг друга.
    #
    #   # Время, в течение которого нода аутентифицирована с помощью OpenID и
    #   # истекает и требуется повторная аутентификация.
    #   # Установка значения "0" означает отсутствие срока действия.
    #   expiry: 180d
    #
    #   # Использовать срок действия токена, полученный от OpenID, когда пользователь вошел
    #   # в систему, это обычно приведёт к частой необходимости повторной аутентификации и должно
    #   # быть включено только если вы знаете, что делаете.
    #   # Примечание: включение этого приведёт к игнорированию `oidc.expiry`.
    #   use_expiry_from_token: false
    #
    #   # Настраивать области, используемые в процессе OIDC, по умолчанию "openid", "profile" и "email" и добавьте пользовательский запрос
    #   # параметры к запросу конечной точки авторизации. Области по умолчанию "openid", "profile" и "email".
    #
    #   scope: ["openid", "profile", "email", "custom"]
    #   extra_params:
    #     domain_hint: example.com
    #
    #   # Список разрешённых доменных имён и/или пользователей. Если домен аутентифицированного пользователя не находится в этом списке, 
    #   # запрос на аутентификацию будет отклонён.
    #
    #   allowed_domains:
    #     - example.com
    #   # Примечание: Группы из keycloak имеют ведущий '/'
    #   allowed_groups:
    #     - /headscale
    #   allowed_users:
    #     - [email protected]
    #
    #   # Если `strip_email_domain` установлено в `true`, доменная часть адреса электронной почты пользователя будет удалена.
    #   # Это преобразует `[email protected]` в пользователя `first-name.last-name`
    #   # Если `strip_email_domain` установлено в `false`, доменная часть не будет удалена, что приведёт к следующему
    #   пользователю: `first-name.last-name.example.com`
    #
    #   strip_email_domain: true

    # Конфигурация Logtail
    # Logtail - это инфраструктура ведения журнала и аудита Tailscale, она позволяет контролировать панель
    # инструктировать узлы tailscale вести журнал своей активности на удаленный сервер.
    logtail:
      # Включить logtail для этих клиентов headscale.
      # Поскольку в headscale в настоящее время нет поддержки переопределения сервера журнала, это
      # по умолчанию отключено. Включение этого заставит ваших клиентов отправлять журналы в Tailscale Inc.
      enabled: false

    # Включение этой опции заставляет устройства предпочитать случайный порт для трафика WireGuard вместо
    # стандартного статического порта 41641. Эта опция предназначена как обходное решение для некоторых неправильных
    # сетевых устройств. См. https://tailscale.com/kb/1181/firewalls/ для получения дополнительной информации.
    randomize_client_port: false

  roles:
    - hampusstrom.headscale

Теги

install

Полная установка и конфигурация headscale и его пространств имен.

configure

Только обновляет файл конфигурации и/или файл юнита systemd.

users

Только настраивает пространства имен.

Лицензия

MIT Лицензия

О проекте

Deploys Headscale, An open source, self-hosted implementation of the Tailscale control server.

Установить
ansible-galaxy install hampusstrom/ansible-role-headscale
Лицензия
mit
Загрузки
70
Владелец