papanito.cloudflared
Ansible-Rolle "papanito.cloudflared"
Diese Ansible-Rolle lädt cloudflared
auf dem Host herunter und installiert es. Optional wird der [argo-tunnel] als Dienst installiert.
Änderungen in Version 3.0.0
Dies ist eine wichtige Änderung, um das neue Verhalten von benannten Tunneln widerzuspiegeln.
Die Rolle kümmert sich um die Bereinigung, wenn Sie die Rolle vor v.3.0.0 verwendet haben. Allerdings müssen Sie die Konfiguration (Variablen) in Ihrem Ansible-Projekt aktualisieren. Ich habe die Variablen umbenannt, häufig mit
cf_
vorangestellt, um sie eindeutig für die Rolle zu machen. Wenn sie nicht eindeutig sind, kann es zu unerwünschten Nebeneffekten kommen, wenn Variablen mit dem gleichen Namen in verschiedenen Rollen verwendet werden.
Cloudflared und Apps mit Tunneln verbinden
Laut [1] müssen Sie zunächst Folgendes tun, um Tunnel zu erstellen und zu verwalten:
- Cloudflared herunterladen und installieren auf Ihrem Computer.
- Cloudflared authentifizieren.
Sobald cloudflared installiert und authentifiziert ist, umfasst der Prozess, um Ihren ersten Tunnel zum Laufen zu bringen, 3 grundlegende Schritte:
Die Schritte 4-5 werden einmal pro Tunnel ausgeführt, normalerweise von einem Administrator, und Schritt 6 wird ausgeführt, wann immer der Tunnel gestartet werden soll, normalerweise von dem, der den Tunnel besitzt (der möglicherweise nicht der Administrator ist).
Was macht die Rolle?
Die Rolle hat tatsächlich zwei Zwecke:
Server-seitige Daemon-Installation
Die Rolle kümmert sich nur um das Einrichten des Dienstes auf den Knoten, d.h. Schritte 1, 2, 4 und 5 von oben, weil
Das Erstellen von Tunneln und das Ermöglichen von Routen ist eine Aufgabe, die von einem Administrator und nicht von der Rolle erledigt werden sollte [1].
Sie können ein oder mehrere [benannte Tunnel] sowie [einzelne Dienste] konfigurieren - normalerweise benötigen Sie mit [benannten Tunneln] nur einen Daemon. Die Rolle führt tatsächlich diese Schritte aus:
Herunterladen und Installieren des Binaries gemäß [Downloads].
Installieren/konfigurieren des Daemons - siehe Daemon authentifizieren.
Für [benannte Tunnel] wird eine [Zugangsdaten-Datei] unter
{{ cf_credentials_dir }}/{{ tunnel_id }}.json
erstellt, die ähnlich aussieht wie:{"AccountTag":"{{ account_tag }}","TunnelSecret":"{{ tunnel_secret }}","TunnelID":"{{ tunnel_id }}","TunnelName":"{{ cf_tunnels.key }}"}
Für jeden Schlüssel in
cf_tunnels
wird eine Tunnelkonfiguration in/etc/cloudflare
erstellt.Die Datei wird
{{ tunnel }}.yml
genannt und die minimale Konfiguration sieht wie folgt aus:benannte Tunnel
tunnel: {{ cf_tunnels.key }} credentials-file: {{ cf_credentials_dir }}/{{ tunnel_id }}.json ingress: {{ item.value.ingress }}
einzelner Dienst
hostname: {{ hostname }} url: {{ url }}
Zusätzliche Parameter werden mit Tunnel-Konfigurationsparametern konfiguriert.
Abhängig von Ihrem Init-System - gesteuert durch
cf_init_system
- macht die Rolle Folgendes:Systemd
Erstellt eine [systemd-unit-template]
cloudflared@{{ tunnel }}.service
und startet eine Instanz für jeden Dienst in der Liste voncf_tunnels
.cloudflared tunnel --config {{ tunnel }}.yml
Init-V Systeme
- Installiert cloudflared service nach
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
. - Verlinkt das Stop-Skript zu
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
. - Verlinkt das Start-Skript zu
/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
.
- Installiert cloudflared service nach
Wenn Sie [benannte Tunnel] verwenden, erstellt die Rolle auch eine [DNS-Route].
SSH-Client-Konfiguration
Von dort, wo Sie auf Ihre Knoten über SSH zugreifen, die über cloudflared weitergeleitet werden, müssen Sie die [SSH-Guide-Client] befolgen. Sie müssen Folgendes hinzufügen:
Host xxx.mycompany.com
ProxyCommand /usr/bin/cloudflared access ssh --hostname %h
Sie können diese Konfiguration erreichen, wenn Sie cf_ssh_client_config
aktivieren. Zusätzlich müssen Sie auch cf_ssh_client_config_group
angeben. Angenommen, Ihr Inventar sieht folgendermaßen aus:
all:
children:
servers:
hosts:
host001:
host002:
Wenn Sie cf_ssh_client_config_group: servers
angeben, erhalten Sie einen Eintrag für host001
und host002
.
Anforderungen
Keine
Rollenvonvariablen
Installations- und Deinstallationsparameter
Die folgenden Parameter steuern die Installation und/oder Deinstallation:
Parameter | Beschreibung | Standardwert |
---|---|---|
cf_download_baseurl |
Basis-URL für cloudflare -Binaries |
https://github.com/cloudflare/cloudflared/releases/latest/download/ |
cf_install_only |
Auf true setzen, wenn Sie nur das Binary ohne Konfiguration oder Anmeldung installieren möchten |
false |
cf_ssh_client_config |
Auf true setzen, wenn Sie die Proxy-Konfiguration für Ihren [SSH-Guide-Client] einrichten möchten, siehe SSH-Client-Konfiguration |
false |
cf_ssh_client_config_group |
Name der Inventargruppe, für die die SSH-Proxy-Konfiguration erstellt werden soll, siehe SSH-Client-Konfiguration | `` |
cf_force_install |
Auf true setzen, wenn Sie cloudflared neu installieren möchten. Standardmäßig wird davon ausgegangen, dass cloudflared als Dienst läuft und automatisch aktualisiert. |
false |
cf_remove_unused_tunnel |
Entfernt ungenutzte cf_tunnels, d.h. cf_tunnels, die laufen, aber nicht in cf_tunnels aufgeführt sind. |
false |
cf_remove_setup_certificate |
Entfernen Sie cert.pem nach der Installation des Dienstes | false |
cf_credential_file_base |
Ordner, in dem die Zugangsdaten-Dateien gespeichert werden | /root/.cloudflared/ |
cf_config_dir |
Ordner, in dem die Cloudflare-Konfigurationsdateien gespeichert werden | /etc/cloudflared |
cf_os_package_enable |
Verwenden Sie das OS-Paketierungssystem und das Cloudflare-Paket-Repository (derzeit nur Debian/Ubuntu) | false |
cf_repository_key_url |
Wenn cf_os_package_enable auf true gesetzt ist, URL des GPG-Schlüssels für das APT-Repository | https://pkg.cloudflare.com/pubkey.gpg |
cf_repository_key_install_path |
Wenn cf_os_package_enable auf true gesetzt ist, Pfad zum Installieren des GPG-Schlüssels für das APT-Repository | /usr/share/keyrings/cloudflare-main.gpg |
cf_repository |
Wenn cf_os_package_enable auf true gesetzt ist, URL für das Cloudflare APT-Repository | deb [signed-by={{ cf_repository_key_install_path }}] https://pkg.cloudflare.com/cloudflared {{ ansible_distribution_release }} main |
cf_binary_name |
Name des Cloudflare-Daemon-Binaries - nur ändern, wenn Sie wissen, was Sie tun | cloudflared |
Cloudflared Dienstparameter
Diese Parameter sind erforderlich, um den Systemdienst zu erstellen.
Parameter | Beschreibung | Standardwert |
---|---|---|
cf_init_system |
Definiere, welches Init-Dienst verwendet werden soll. Mögliche Werte sind systemd und initv |
systemd |
cf_systemd_user |
Benutzer für den systemd-Dienst im Falle von cf_init_system: systemd |
root |
cf_systemd_group |
Gruppe für den systemd-Dienst im Falle von cf_init_system: systemd |
root |
cf_cert_location |
Standort des zu kopierenden Zertifikats - siehe Daemon authentifizieren | - |
cf_cert_content |
Inhalt des zu kopierenden Zertifikats - siehe Daemon authentifizieren | - |
cf_tunnels |
[Mandatory] Liste der Tunnel-Dienste, die jeweils Cloudflare-Parameter definieren | - |
cf_sysctl_buffer_size_increase |
Erhöht die von OS erlaubte UDP-Empfangspuffergröße (nicht BSD) - mehr Details | false |
Es wird empfohlen, [benannte Tunnel] für cf_tunnels
zu verwenden, die Cloudflare benannte Tunnelparameter erfordern, aber Sie können auch Cloudflare-legacy-Tunnelparameter verwenden.
Cloudflare benannte Tunnelparameter
...
cf_tunnels:
test:
routes:
dns:
- "{{ inventory_hostname }}"
cidr:
- "192.168.42.0/24"
lb:
- hostname: website.mycompany.com
poolname: bzh-west1.website.mycompany.com
account_tag: !vault....
tunnel_secret: !vault....
tunnel_id: !vault....
ingress:
- hostname: website.mycompany.com
service: http://localhost:1313
- hostname: hello.mycompany.com
service: hello_world
- hostname: ssh.mycompany.com
service: ssh://localhost:22
- service: http_status:404
Der key
des Tunnels sollte mit dem tunnel_id
übereinstimmen.
Parameter | Beschreibung | Standardwert |
---|---|---|
account_tag |
[Mandatory] Account-Tag aus der [Zugangsdaten-Datei], die beim Erstellen eines Tunnels generiert wird | - |
tunnel_secret |
[Mandatory] Tunnelgeheimnis aus der [Zugangsdaten-Datei], die beim Erstellen eines Tunnels generiert wird | - |
tunnel_id |
[Mandatory] Tunnel-ID aus der [Zugangsdaten-Datei], die beim Erstellen eines Tunnels generiert wird | - |
ingress |
[Mandatory] [Ingress-Regeln] für den Tunnel | - |
routes |
Liste der Routen, die erstellt werden sollen. Momentan erlaubt es eine Liste für dns -Routen (siehe Beispiel oben) |
- |
Routen
DNS
dns
-Routen erwarten eine Liste von CNAME
s, die wie hier beschrieben erstellt werden sollen. Wenn der CNAME
bereits existiert, wird die Aufgabe übersprungen, aber kein Fehler ausgelöst. Fügen Sie nur CNAME
hinzu, keinen FQDN, da der FQDN
von cloudflared
bestimmt wird.
Privates Netzwerk
private network
-Routen erwarten eine Liste von CIDR
s, die erstellt werden sollen, wie hier beschrieben. Das Playbook läuft durch die Liste, um cloudflared tunnel route ip add {{ cf_cidr_entry }} {{ cf_tunnel.key }}
auszuführen. Wenn der CIDR
bereits existiert, wird ein Fehler ausgelöst, aber ignoriert.
Lastenausgleich
lb
-Routen erwarten eine Liste von bestehenden cloudflared Lastenausgleichern (plus ihres Pools), auf denen Tunnel geroutet werden sollen, wie hier beschrieben. Das Playbook läuft durch die Liste, um cloudflared tunnel route lb {{ cf_tunnel.key }} {{ cf_lb_entry.host_name }} {{ cf_lb_entry.pool_name }}
auszuführen. Wenn der Tunnel bereits im Pool gebunden ist, wird ein ignorierter Fehler ausgelöst.
Cloudflare einzelne Dienstparameter
Wie bei vorherigen Versionen dieser Rolle können Sie den [Einzelservice-Konfigurationsstil][single service] verwenden.
Wenn Sie den Verkehr nur an einen lokalen Dienst weiterleiten müssen, können Sie dies mit der Konfigurationsdatei tun. Alternativ können Sie die Einzelservice-Konfiguration einrichten.
cf_tunnels:
ssh:
hostname: xxx
url: ssh.mycompany.com
Parameter | Beschreibung | Standardwert |
---|---|---|
hostname |
[Mandatory] Name oder einzigartig | - |
url |
[Mandatory] URL, zu der verbunden werden soll [config] z. B. ssh://localhost:22 oder https://localhost:443 |
- |
Tunnel-Konfigurationsparameter
Diese Parameter werden verwendet, um die Parameter pro cloudflared-Dienst zu konfigurieren. Sie können weiterhin Pro-Regel-Konfiguration für benannte Tunnel als Teil des ingress
unter cf_tunnels
konfigurieren.
Parameter | Beschreibung | Standardwert |
---|---|---|
autoupdate_freq |
Autoupdate-Frequenz - siehe dokumentation | 24h |
edge_ip_version |
Bestimmt die IP-Adresse Version (IPv4 oder IPv6), die verwendet wird, um eine Verbindung zwischen cloudflared und dem Cloudflare Global Network herzustellen. Verfügbare Werte sind auto , 4 und 6 |
auto |
edge_bind_address |
Bestimmt die ausgehende IP-Adresse, die verwendet wird, um eine Verbindung zwischen cloudflared und dem Cloudflare Global Network herzustellen | - |
grace_period |
Wenn cloudflared SIGINT/SIGTERM erhält, lehnt es neue Anfragen ab, wartet darauf, dass laufende Anfragen abgeschlossen werden, und beendet dann. Das Warten auf laufende Anfragen hat nach dieser Karenzzeit oder beim Empfang eines zweiten SIGTERM/SIGINT ein Timeout | 30s |
metrics |
Adresse, um die Nutzungsmetriken abzufragen - siehe dokumentation | localhost: |
metrics_update_freq |
Frequenz zur Aktualisierung der Tunnelmetriken - siehe dokumentation | 5s |
no_autoupdate |
Deaktiviert die regelmäßige Überprüfung auf Updates und das Neustarten des Servers mit der neuen Version - siehe dokumentation | false |
no_chunked_encoding |
Deaktiviert die chunkweise Übertragungscodierung; nützlich, wenn Sie einen WSGI-Server betreiben - siehe dokumentation | false |
no_tls_verify |
Deaktiviert die TLS-Überprüfung des vom Ursprung bereitgestellten Zertifikats. Erlaubt, dass jedes Zertifikat vom Ursprung akzeptiert wird - siehe dokumentation | - |
origin_server_name |
Hostname, den cloudflared vom Zertifikat Ihres Ursprungservers erwarten sollte - siehe dokumentation |
- |
origin_ca_pool |
Pfad zum CA für das Zertifikat Ihres Ursprungs. Diese Option sollte nur verwendet werden, wenn Ihr Zertifikat nicht von Cloudflare signiert ist - siehe dokumentation | - |
protocol |
Bestimmt das Protokoll, das für den Tunnel verwendet werden soll - siehe dokumentation | auto |
logfile |
Aktiviert das Schreiben einer Protokolldatei für cloudflared - es wird trotzdem ins Journal protokolliert | true |
loglevel |
Bestimmt die Detailgenauigkeit der Protokollierung. Der Standardwert "info" ist nicht laut, aber Sie möchten möglicherweise "warn" in der Produktion verwenden - siehe dokumentation | info |
region |
Erlaubt Ihnen, die Regionen auszuwählen, zu denen Verbindungen hergestellt werden. Auslassen oder leer lassen, um sich mit der globalen Region zu verbinden. Setzen Sie --region=us , um alle Verbindungen durch die US-Region 1 und US-Region 2 zu leiten |
- |
retries |
Maximale Anzahl von erneuten Versuchen bei Verbindungs-/Protokollfehlern. Wiederholungen verwenden exponentielles Backoff (erneutes Versuchen nach 1, 2, 4, 8, 16 Sekunden standardmäßig), daher wird eine signifikante Erhöhung dieses Wertes nicht empfohlen - siehe dokumentation | 5 |
tag |
Benutzerdefinierte Tags, um diesen Tunnel zu identifizieren, im Format KEY=VALUE - siehe dokumentation |
- |
token |
Verknüpft die cloudflared-Instanz mit einem bestimmten Tunnel. Das Token des Tunnels wird im Dashboard angezeigt, wenn Sie den Tunnel zum ersten Mal erstellen. Sie können das Token auch mit der API abrufen. | - |
transport_loglevel |
Bestimmt die Detailgenauigkeit der Protokolle für den Transport zwischen cloudflared und dem Cloudflare-Edge. Verfügbare Ebenen sind: trace , debug , info , warn , error , fatal , panic . Jeder Wert unter warn erzeugt erheblichen Output und sollte nur verwendet werden, um niedrigstufige Leistungsprobleme und Protokollquirks zu debuggen - siehe dokumentation |
info |
warp_routing |
Erlaubt Benutzern, über WARP eine Verbindung zu internen Diensten herzustellen, Details siehe [warp-routing] | false |
Abhängigkeiten
Keine
Beispiel-Playbooks
Das folgende Beispiel installiert einen einzelnen Dienst für einen SSH-Tunnel für jeden Server
.
- hosts: servers
vars:
cf_systemd_user: root
cf_systemd_group: root
cf_cert_location: /home/papanito/cert.pem
services:
ssh:
hostname: "{{ inventory_hostname }}.mycompany.com"
url: ssh://localhost:22
roles:
- papanito.cloudflared
Das folgende Beispiel installiert einen [benannten Tunnel] servers
mit einem Ingress zu {{ inventory_hostname }}.mycompany.com
für SSH und einen [Hello World]-Dienst, wenn Sie auf hello-{{ inventory_hostname }}.mycompany.com
über den Browser zugreifen.
- hosts: servers
remote_user: ansible
become: true
vars:
cf_cert_location: /home/papanito/.cloudflared/cert.mycompany.com.pem
cf_tunnels:
test:
account_tag: !vault...
tunnel_secret: !vault...
tunnel_id: !vault...
routes:
dns:
- "{{ inventory_hostname }}"
- "hello-{{ inventory_hostname }}"
ingress:
- hostname: "hello-{{ inventory_hostname }}.mycompany.com"
service: hello_world
- hostname: "{{ inventory_hostname }}.mycompany.com"
service: ssh://localhost:22
- service: http_status:404
roles:
- papanito.cloudflared
Das folgende Beispiel lädt einfach cloudflared
auf Ihrem lokalen Computer herunter und konfiguriert die SSH-Konfigurationsdatei:
- hosts: localhost
remote_user: papanito # Ihr lokaler Benutzer mit Administratorrechten
vars:
cf_install_only: true
cf_ssh_client_config: true
cf_ssh_client_config_group: servers
roles:
- papanito.cloudflared
Test
ansible-playbook tests/test.yml -i tests/inventory
Zusätzliche Infos
Daemon authentifizieren
Laut [authenticate-the-cloudflare-daemon] wird beim Authentifizieren des Daemons ein Browserfenster geöffnet oder - falls dies nicht möglich ist - muss der Link manuell eingegeben werden. Während dieser Zeit wartet der Daemon. Ich konnte keine Lösung finden, um dieses Verhalten zu automatisieren, daher habe ich die folgende Implementierung gewählt.
Wenn nichts angegeben ist, ruft Ansible
cloudflared login
auf und fährt fort, wenn die Authentifizierung abgeschlossen ist - dies macht Sinn, wenn Sie die Rolle verwenden, um den Daemon lokal auf Ihrem Computer zu installieren, wo Sie ein Browserfenster haben.Wenn der Wert von
cf_cert_location
angegeben ist, wird das Zertifikat tatsächlich aus demcf_cert_location
kopiert, oder wenncf_cert_content
definiert ist, wird das Zertifikat direkt aus dem gespeicherten Wert erstellt. So können Sie sich einmal in Cloudflare von Ihrem Master-Knoten (wo Sie Ansible ausführen) oder von einem Remote-Standort aus anmelden.Sie können das
cert.pem
mit Ansible Vault verschlüsseln und an einem sicheren Ort speichern.
Referenzen:
- [downloads] - cloudflared Download-Anleitungen
- [ssh-guide] - SSH-Verbindungen mit cloudflared
- [cli-args] - Befehlszeilenargumente
- [config] - Das Format der Konfigurationsdatei verwendet YAML-Syntax.
Lizenz
Dies ist freie Software, die unter den Bedingungen der Apache v2-Lizenz veröffentlicht wird.
Autoreninformation
ansible-galaxy install papanito.cloudflared