papanito.cloudflared

Ansible-Rolle "papanito.cloudflared"

Ansible Rolle Ansible Qualitätsbewertung Ansible Rolle GitHub-Issues GitHub Pull-Requests

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:

  1. Cloudflared herunterladen und installieren auf Ihrem Computer.
  2. Cloudflared authentifizieren.

Sobald cloudflared installiert und authentifiziert ist, umfasst der Prozess, um Ihren ersten Tunnel zum Laufen zu bringen, 3 grundlegende Schritte:

  1. Einen Tunnel erstellen.
  2. Den Verkehr zu Ihrem Tunnel leiten.
  3. Ihren Tunnel ausführen.

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:

  1. Herunterladen und Installieren des Binaries gemäß [Downloads].

  2. Installieren/konfigurieren des Daemons - siehe Daemon authentifizieren.

  3. 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 }}"}
    
  4. 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.

  5. 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 von cf_tunnels.

      cloudflared tunnel --config {{ tunnel }}.yml
      
    • Init-V Systeme

      1. Installiert cloudflared service nach /etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}.
      2. Verlinkt das Stop-Skript zu /etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}.
      3. Verlinkt das Start-Skript zu /etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}.
  6. 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 CNAMEs, 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 CIDRs, 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 dem cf_cert_location kopiert, oder wenn cf_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

Geschrieben von Papanito - Gitlab / Github

Über das Projekt

Ansible role do install and run cloudflare argo tunnel

Installieren
ansible-galaxy install papanito.cloudflared
Lizenz
apache-2.0
Downloads
2.3k
Besitzer
A passionate DevOps Engineer from Switzerland, father of five and husband of the most beautiful and most amazing woman in the world.