hampusstrom.headscale
Rôle Ansible : Headscale
Un rôle Ansible pour installer et configurer Headscale, une implémentation open source et auto-hébergée du serveur de contrôle Tailscale.
C'est génial, allez voir : juanfont/Headscale
Avertissement
L'auteur de ce projet n'est en aucun cas affilié au projet Headscale ou à Tailscale Inc.
LE LOGICIEL EST FOURNI "EN L'ÉTA T", SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, Y COMPRIS MAIS SANS S'Y LIMITER AUX GARANTIES DE COMMERCIALISATION, D'ADAPTATION À UN USAGE PARTICULIER ET DE NON-VIOLATION. EN AUCUN CAS L'AUTEUR NE SERA RESPONSABLE D'UNE RÉCLAMATION, DE DOMMAGES OU D'UNE AUTRE RESPONSABILITÉ, QUE CE SOIT DANS LE CADRE D'UN CONTRAT, DÉLIT OU AUTRE, DÉCOULANT DE OU EN LIEN AVEC LE LOGICIEL OU L'UTILISATION OU D'AUTRES ÉCHANGES DANS LE LOGICIEL.
UTILISEZ À VOS RISQUES ET PÉRILS
Compatibilité
Ce rôle a été testé sur les plates-formes suivantes :
- CentOS 8 x64
- Debian 10 x64
- Debian 11 x64
- Ubuntu Server 20.04 x64
- Ubuntu Server 22.04 x64
Installation
ansible-galaxy
ansible-galaxy install hampusstrom.headscale
Installation Manuelle
Pour l'utilisateur actuel seulement :
git clone https://github.com/hampusstrom/ansible-role-headscale.git ~/.ansible/roles/hampusstrom.headscale
Pour l'ensemble du système :
git clone https://github.com/hampusstrom/ansible-role-headscale.git /etc/ansible/roles/hampusstrom.headscale
Exigences
Ce rôle n'a pas d'exigences particulières et devrait fonctionner sur toutes les machines où Ansible, Headscale et systemd fonctionnent.
API GitHub
Ce rôle utilise l'API GitHub.
L'API GitHub est limitée en nombre d'appels.
Les utilisateurs non authentifiés ne peuvent faire que 60 demandes par heure.
Si vous êtes un développeur, vous pourriez facilement atteindre cette limite.
Pour contourner cela, vous pouvez récupérer un token d'accès personnel à partir de : https://github.com/settings/tokens/new
Remplissez les détails du token d'accès dans les variables headscale_github_api_*.
headscale_github_api_username: votre_nom_utilisateur_github
headscale_github_api_password: votre_token_d'accès_personnel
headscale_github_api_auth: true
Système d'init : systemd
Accès root requis : oui
Puisque nous avons besoin des droits root, utilisez ce rôle dans un playbook qui a become:yes
défini globalement ou appelez ce rôle en utilisant le mot-clé become: yes
.
- hosts: headscale
become: yes
roles:
- role: hampusstrom.headscale
# OU
- hosts: headscale
roles:
- role: hampusstrom.headscale
become: yes
Variables de rôle
Une description complète de toutes les variables disponibles peut être trouvée sous defaults/main.yaml
.
Convention de Nom des Variables
Les variables liées à ce rôle sont toujours préfixées par headscale_
.
headscale_version
Définit la version de headscale à télécharger et à installer sur les machines cibles. Peut être soit un numéro de version (sans le préfixe 'v'). Par exemple : 0.16.4 ou latest
Le mot "latest" récupérera automatiquement le dernier tag de version publié dans le dépôt GitHub juanfont/headscale.
par défaut : latest
headscale_config
Le contenu du fichier config.yaml de headscale exprimé sous forme d'objet YAML. Consultez la configuration par défaut dans le projet headscale pour vous inspirer. Au moment de l'écriture, les valeurs minimales suivantes sont requises pour la version 0.20.0 de 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
Le contenu du fichier acl.yaml de headscale exprimé sous forme d'objet YAML.
headscale_github_repository
Définit l'utilisateur/repo à utiliser lors de la recherche et du téléchargement du binaire headscale. Peut être changé par un autre repo pour permettre l'installation de forks, par exemple.
par défaut : juanfont/headscale
headscale_remove_unmanaged_users
Si défini sur vrai, tous les utilisateurs non spécifiés dans headscale_users seront supprimés de manière permanente.
Utilisez à vos risques et périls
par défaut : false
headscale_users
Une liste d'utilisateurs qui devraient être créés et non supprimés s'ils sont utilisés avec headscale_remove_unmanaged_users.
par défaut : []
headscale_binary_path
Définit où le binaire headscale sera téléchargé et installé.
par défaut : /usr/local/bin/headscale
headscale_user_name
Définit le nom de l'utilisateur système qui doit exécuter le démon systemd de headscale. Sera créé s'il n'existe pas déjà.
par défaut : headscale
headscale_user_group
Définit le nom du groupe principal pour l'utilisateur headscale_user_name.
par défaut : {{ headscale_user_name }}
headscale_user_uid
Définit l'ID de l'utilisateur de l'utilisateur headscale_user_name
.
par défaut : 777
headscale_user_gid
Définit l'ID de groupe du groupe headscale_user_group
.
par défaut : {{ headscale_user_uid }}
headscale_etc_dir_path
Définit le chemin dans lequel les données de configuration de headscale devront se trouver. Vous ne devriez normalement pas avoir à changer cela, mais pour certaines configurations personnalisées/forks, l'option est là.
par défaut : /etc/headscale
headscale_lib_dir_path
Définit le chemin dans lequel les données de bibliothèque de headscale devront se trouver. Vous ne devriez normalement pas avoir à changer cela, mais pour certaines configurations personnalisées/forks, l'option est là.
par défaut : /var/lib/headscale
headscale_run_dir_path
Définit le chemin dans lequel le socket UNIX de headscale devra se trouver. Vous ne devriez normalement pas avoir à changer cela, mais pour certaines configurations personnalisées/forks, l'option est là. L'entrée de configuration unix_socket doit pointer vers un fichier .sock dans ce répertoire. c'est-à-dire : unix_socket: /var/run/headscale/headscale.sock
par défaut : /var/run/headscale
headscale_db_path
Chemin du fichier de base de données sqlite.
par défaut : {{ headscale_lib_dir_path }}/db.sqlite
headscale_backup_dir_path
Chemin où les sauvegardes de la base de données seront stockées. Les sauvegardes sont automatiquement créées avant toute mise à jour de headscale. Si vous choisissez de rétrograder headscale, il est fortement recommandé de restaurer également votre base de données. Pour ce faire, il vous suffit d'arrêter headscale, de copier le fichier de base de données à headscale_db_path et de redémarrer headscale.
par défaut : {{ headscale_lib_dir_path }}/backups
Exemple de Playbook
Notez que vous devriez toujours vérifier la documentation officielle de headscale pour vous assurer que vous avez toutes les valeurs nécessaires pour votre version de headscale. Je recommande fortement de copier l'exemple de configuration officiel et de l'utiliser comme base pour votre configuration.
---
---
# Exécutez avec la commande :
# ansible-playbook -i "votrefichierdinventaire" -K exemple-playbook.yml
- hosts: all
become: yes
vars:
headscale_version: 0.20.0
headscale_config:
# headscale cherchera un fichier de configuration nommé `config.yaml` (ou `config.json`) dans cet ordre :
#
# - `/etc/headscale`
# - `~/.headscale`
# - répertoire de travail actuel
# L'url à laquelle les clients se connecteront.
# Typiquement, ce sera un domaine comme :
#
# https://monheadscale.exemple.com:443
#
server_url: http://127.0.0.1:8080
# Adresse à écouter / à lier sur le serveur
#
# Pour la production :
# listen_addr: 0.0.0.0:8080
listen_addr: 127.0.0.1:8080
# Adresse à écouter pour /metrics, vous pourriez vouloir
# garder ce point de terminaison privé à votre réseau interne
#
metrics_listen_addr: 127.0.0.1:9090
# Adresse à écouter pour gRPC.
# gRPC est utilisé pour contrôler un serveur headscale
# à distance avec la CLI
# Remarque : L'accès à distance _seulement_ fonctionne si vous avez
# des certificats valides.
#
# Pour la production :
# grpc_listen_addr: 0.0.0.0:50443
grpc_listen_addr: 127.0.0.1:50443
# Autoriser l'interface d'administration gRPC à fonctionner en mode INSECURE.
# Il n'est pas recommandé d'activer cela car le trafic sera
# non chiffré. N'activez cela que si vous savez ce que vous faites.
grpc_allow_insecure: false
# Clé privée utilisée pour chiffrer le trafic entre headscale
# et les clients Tailscale.
# Le fichier de clé privée sera généré automatiquement s'il manque.
#
# Pour la production :
# /var/lib/headscale/private.key
private_key_path: ./private.key
# La section Noise inclut la configuration spécifique pour le
# protocole Noise TS2021
noise:
# La clé privée Noise est utilisée pour chiffrer le
# trafic entre headscale et les clients Tailscale lors de
# l'utilisation du nouveau protocole basé sur Noise. Elle doit être différente
# de la clé privée d'origine.
#
# Pour la production :
# private_key_path: /var/lib/headscale/noise_private.key
private_key_path: ./noise_private.key
# Liste des préfixes IP à partir desquels allouer des adresses.
# Chaque préfixe se compose soit d'une adresse IPv4 soit IPv6,
# et de la longueur du préfixe associée, délimitées par une barre.
# Bien que cela semble pouvoir prendre des valeurs arbitraires, cela
# doit être dans des plages d'IP prises en charge par le client Tailscale.
# IPv6: https://github.com/tailscale/tailscale/blob/22ebb25e833264f58d7c3f534a8b166894a89536/net/tsaddr/tsaddr.go#LL81C52-L81C71
# IPv4: https://github.com/tailscale/tailscale/blob/22ebb25e833264f58d7c3f534a8b166894a89536/net/tsaddr/tsaddr.go#L33
ip_prefixes:
- fd7a:115c:a1e0::/48
- 100.64.0.0/10
# DERP est un système de relais que Tailscale utilise lorsque
# une connexion directe ne peut être établie.
# https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp
#
# headscale a besoin d'une liste de serveurs DERP qui peuvent être présentés
# aux clients.
derp:
server:
# Si activé, exécute le serveur DERP embarqué et l'intègre dans le reste de la configuration DERP.
# L'url du serveur headscale définie ci-dessus DOIT utiliser https, le DERP nécessite que TLS soit en place.
enabled: false
# ID de région à utiliser pour le serveur DERP embarqué.
# Le DERP local prévaut si l'ID de région entre en conflit avec d'autres ID de région provenant de
# la configuration DERP régulière.
region_id: 999
# Le code de région et le nom sont affichés dans l'interface utilisateur de Tailscale pour identifier une région DERP.
region_code: "headscale"
region_name: "DERP intégré Headscale"
# Écoute sur UDP à l'adresse configurée pour les connexions STUN - pour aider au traversal NAT.
# Lorsque le serveur DERP embarqué est activé, stun_listen_addr DOIT être défini.
#
# Pour plus de détails sur le fonctionnement, consultez cet excellent article : https://tailscale.com/blog/how-tailscale-works/
stun_listen_addr: "0.0.0.0:3478"
# Liste des cartes DERP accessibles externes encodées en JSON
urls:
- https://controlplane.tailscale.com/derpmap/default
# Fichiers de carte DERP disponibles localement encodés en YAML
#
# Cette option est surtout intéressante pour les personnes hébergeant
# leurs propres serveurs DERP :
# https://tailscale.com/kb/1118/custom-derp-servers/
#
# paths:
# - /etc/headscale/derp-example.yaml
paths: []
# Si activé, un travailleur sera mis en place pour rafraîchir périodiquement
# les sources données et mettre à jour la carte derp.
auto_update_enabled: true
# À quelle fréquence devrions-nous vérifier les mises à jour DERP ?
update_frequency: 24h
# Désactive la vérification automatique des mises à jour de headscale au démarrage
disable_check_updates: false
# Temps avant qu'un nœud éphémère inactif soit supprimé ?
ephemeral_node_inactivity_timeout: 30m
# Période de vérification des mises à jour des nœuds dans le tailnet. Une valeur trop basse affectera gravement
# la consommation du CPU de Headscale. Une valeur trop élevée (plus de 60s) causera des problèmes
# pour les nœuds, car ils ne recevront pas des mises à jour ou des messages de maintien en vie suffisamment souvent.
# En cas de doute, ne modifiez pas la valeur par défaut de 10s.
node_update_check_interval: 10s
# Configuration SQLite
db_type: sqlite3
# Pour la production :
# db_path: /var/lib/headscale/db.sqlite
db_path: ./db.sqlite
# # Configuration Postgres
# Si vous utilisez un socket Unix pour vous connecter à Postgres, mettez le chemin du socket dans le champ 'host' et laissez 'port' vide.
# db_type: postgres
# db_host: localhost
# db_port: 5432
# db_name: headscale
# db_user: foo
# db_pass: bar
# Si un autre 'sslmode' est requis au lieu de 'require(true)' et 'disabled(false)', définissez le 'sslmode' dont vous avez besoin
# dans le champ 'db_ssl'. Se référer à https://www.postgresql.org/docs/current/libpq-ssl.html Tableau 34.1.
# db_ssl: false
### Configuration TLS
#
## Let's Encrypt / ACME
#
# headscale prend en charge la demande automatique et la configuration
# de TLS pour un domaine avec Let's Encrypt.
#
# URL du répertoire ACME
acme_url: https://acme-v02.api.letsencrypt.org/directory
# Email pour s'inscrire auprès du fournisseur ACME
acme_email: ""
# Nom de domaine pour demander un certificat TLS :
tls_letsencrypt_hostname: ""
# Chemin pour stocker les certificats et les métadonnées nécessaires à
# letsencrypt
# Pour la production :
# tls_letsencrypt_cache_dir: /var/lib/headscale/cache
tls_letsencrypt_cache_dir: ./cache
# Type de challenge ACME à utiliser, types actuellement supportés :
# HTTP-01 ou TLS-ALPN-01
# Voir [docs/tls.md](docs/tls.md) pour plus d'informations
tls_letsencrypt_challenge_type: HTTP-01
# Lorsque le challenge HTTP-01 est choisi, letsencrypt doit mettre en place un
# point de terminaison de vérification, qui écoutera sur :
# :http = port 80
tls_letsencrypt_listen: ":http"
## Utiliser des certificats déjà définis :
tls_cert_path: ""
tls_key_path: ""
log:
# Format de sortie pour les logs : texte ou json
format: text
level: info
# Chemin vers un fichier contenant des politiques ACL.
# Les ACL peuvent être définies en tant que YAML ou HUJSON.
# https://tailscale.com/kb/1018/acls/
acl_policy_path: ""
## DNS
#
# headscale prend en charge la configuration DNS de Tailscale et MagicDNS.
# Veuillez consulter leur KB pour mieux comprendre les concepts :
#
# - https://tailscale.com/kb/1054/dns/
# - https://tailscale.com/kb/1081/magicdns/
# - https://tailscale.com/blog/2021-09-private-dns-with-magicdns/
#
dns_config:
# Que préférer utiliser le DNS fourni par Headscale ou utiliser le DNS local.
override_local_dns: true
# Liste des serveurs DNS à exposer aux clients.
nameservers:
- 1.1.1.1
# NextDNS (voir https://tailscale.com/kb/1218/nextdns/).
# "abc123" est un exemple d'ID NextDNS, remplacez-le par le vôtre.
#
# Avec partage de métadonnées :
# nameservers:
# - https://dns.nextdns.io/abc123
#
# Sans partage de métadonnées :
# nameservers:
# - 2a07:a8c0::ab:c123
# - 2a07:a8c1::ab:c123
# DNS fractionné (voir https://tailscale.com/kb/1054/dns/),
# liste des domaines de recherche et le DNS à interroger pour chacun.
#
# restricted_nameservers:
# foo.bar.com:
# - 1.1.1.1
# darp.headscale.net:
# - 1.1.1.1
# - 8.8.8.8
# Domaines de recherche à injecter.
domains: []
# Enregistrements DNS supplémentaires
# jusqu'à présent seuls les enregistrements A sont pris en charge (du côté tailscale)
# Voir 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"
#
# # vous pouvez aussi le mettre sur une ligne
# - { name: "prometheus.myvpn.example.com", type: "A", value: "100.64.0.3" }
# Que utiliser [MagicDNS](https://tailscale.com/kb/1081/magicdns/).
# Ne fonctionne que s'il y a au moins un serveur de noms défini.
magic_dns: true
# Définit le domaine de base pour créer les noms d'hôtes pour MagicDNS.
# `base_domain` doit être un FQDN, sans le point traînant.
# Le FQDN des hôtes sera
# `hostname.user.base_domain` (par exemple, _monhôte.monutilisateur.exemple.com_).
base_domain: example.com
# Socket Unix utilisé par la CLI pour se connecter sans authentification
# Remarque : pour la production, vous voudrez définir cela sur quelque chose comme :
# unix_socket: /var/run/headscale.sock
unix_socket: ./headscale.sock
unix_socket_permission: "0770"
#
# headscale prend en charge le support OpenID connect expérimental,
# il est toujours en cours d'essai et pourrait avoir quelques bogues, veuillez
# nous aider à le tester.
# OpenID Connect
# oidc:
# only_start_if_oidc_is_available: true
# issuer: "https://votre-oidc.issuer.com/path"
# client_id: "votre-id-client-oidc"
# client_secret: "votre-secret-client-oidc"
# # Alternativement, définissez `client_secret_path` pour lire le secret à partir du fichier.
# # Cela résout les variables d'environnement, ce qui permet une intégration facile avec systemd.
# client_secret_path: "${CREDENTIALS_DIRECTORY}/oidc_client_secret"
# # client_secret et client_secret_path sont mutuellement exclusifs.
#
# # La durée pendant laquelle un nœud est authentifié avec OpenID avant qu'il
# # n'expire et doive se ré-authentifier.
# # Définir la valeur à "0" signifie pas d'expiration.
# expiry: 180d
#
# # Utilisez l'expiration du token reçu de l'OpenID lorsque l'utilisateur a
# # été connecté, cela entraînera généralement un besoin fréquent de ré-authentification
# # et ne doit être activé que si vous savez ce que vous faites.
# # Remarque : activer cela ignorera `oidc.expiry`.
# use_expiry_from_token: false
#
# # Personnalisez les scopes utilisés dans le flux OIDC, par défaut "openid", "profile" et "email" et ajoutez des paramètres de requête personnalisés
# # à la demande du point de terminaison d'autorisation. Les scopes par défaut sont "openid", "profile" et "email".
#
# scope: ["openid", "profile", "email", "personnalisé"]
# extra_params:
# domain_hint: example.com
#
# # Liste des domaines et/ou utilisateurs autorisés. Si le domaine d'un utilisateur authentifié n'est pas dans cette liste, la
# # demande d'authentification sera rejetée.
#
# allowed_domains:
# - example.com
# # Remarque : Les groupes de keycloak ont un '/' devant
# allowed_groups:
# - /headscale
# allowed_users:
# - [email protected]
#
# # Si `strip_email_domain` est défini sur `true`, la partie domaine de l'adresse e-mail de l'utilisateur sera supprimée.
# # Cela transformera `[email protected]` en utilisateur `prenom.nom`
# # Si `strip_email_domain` est défini sur `false`, la partie domaine ne sera PAS supprimée, ce qui donnera l'utilisateur suivant : `prenom.nom.example.com`
#
# strip_email_domain: true
# Configuration Logtail
# Logtail est l'infrastructure de journalisation et d'audit de Tailscale, elle permet au panneau de contrôle
# d'instruire les nœuds de Tailscale à journaliser leur activité sur un serveur distant.
logtail:
# Activer logtail pour les clients de ce headscale.
# Comme il n'y a actuellement aucun support pour remplacer le serveur de journaux dans headscale, cela est
# désactivé par défaut. L'activer fera en sorte que vos clients envoient des journaux à Tailscale Inc.
enabled: false
# Activer cette option fait que les appareils préfèrent un port aléatoire pour le trafic WireGuard plutôt que le
# port statique par défaut 41641. Cette option est prévue comme solution de contournement pour certains appareils de pare-feu défectueux. Voir https://tailscale.com/kb/1181/firewalls/ pour plus d'informations.
randomize_client_port: false
roles:
- hampusstrom.headscale
Tags
install
Une installation complète et la configuration de headscale et de ses espaces de noms.
configure
Met seulement à jour le fichier de configuration et/ou le fichier d'unité systemd.
users
Configure uniquement les espaces de noms.
Licence
MIT Licence
Deploys Headscale, An open source, self-hosted implementation of the Tailscale control server.
ansible-galaxy install hampusstrom.headscale