papanito.cloudflared

Rola Ansible "papanito.cloudflared"

Rola Ansible Ocena jakości Ansible Rola Ansible Problemy na GitHubie Prośby o połączenie na GitHubie

Ta rola Ansible pobiera i instaluje cloudflared na hoście i opcjonalnie instaluje [argo-tunel] jako usługę.

Zmiany przełamujące z wersji 3.0.0

To jest zmiana przełamująca, aby odzwierciedlić nowe zachowanie nazwanych tuneli

Rola powinna zająć się czyszczeniem, jeśli korzystałeś z roli przed wersją 3.0.0. Jednak musisz zaktualizować konfigurację (zmienne) w swoim projekcie Ansible. Zmieniłem nazwy zmiennych - zazwyczaj z prefiksem cf_, aby były unikalne dla roli. Jeśli nie są unikalne, może zdarzyć się, że zmienne o tej samej nazwie w różnych rolach mogą prowadzić do niepożądanych skutków ubocznych.

Cloudflared i łączenie aplikacji z tunelami

Zgodnie z 1, aby utworzyć i zarządzać tunelami, musisz najpierw:

  1. Pobierz i zainstaluj cloudflared na swoim komputerze
  2. Uwierzodfnij cloudflared

Po zainstalowaniu i uwierzytelnieniu cloudflared, proces uruchomienia pierwszego tunelu obejmuje 3 główne kroki:

  1. Utwórz tunel
  2. Kieruj ruch do swojego tunelu
  3. Uruchom swój tunel

Kroki 4-5 są wykonywane raz na tunel, zazwyczaj przez administratora, a krok 6 jest wykonywany za każdym razem, gdy tunel ma być uruchomiony, zazwyczaj przez właściciela tunelu (który może być inny niż administrator).

Co robi ta rola?

Rola ma dwa cele:

Instalacja demona po stronie serwera

Rola zajmuje się jedynie konfiguracją usługi na węzłach, tzn. krokami 1, 2, 4 i 5 powyżej, ponieważ

Tworzenie tuneli i włączanie routingu to zadanie, które powinno być wykonywane przez administratora, a nie rolę 1

Można skonfigurować od jednego do wielu [nazwanych tuneli] oraz [jednostkowej usługi] - z tym, że przy [nazwanych tunelach] zwykle potrzebny jest tylko jeden demon. Rola wykonuje następujące kroki:

  1. Pobiera i instaluje binarkę zgodnie z [pobieraniem]

  2. Instaluje/konfiguruje demona - patrz Uwierzytelniaj demona

  3. Dla [nazwanych tuneli] tworzony jest [plik uwierzytelniający] w {{ cf_credentials_dir }}/{{ tunnel_id }}.json, podobny do tego

    {"AccountTag":"{{ account_tag }}","TunnelSecret":"{{ tunnel_secret }}","TunnelID":"{{ tunnel_id }}","TunnelName":"{{ cf_tunnels.key }}"}
    
  4. Dla każdego klucza w cf_tunnels tworzona jest konfiguracja tunelu w /etc/cloudflare

    Plik nazywa się {{ tunnel }}.yml i zawiera minimalną konfigurację, która wygląda następująco

    nazwane tunel

    tunnel: {{ cf_tunnels.key }}
    credentials-file: {{ cf_credentials_dir }}/{{ tunnel_id }}.json
    ingress:
      {{ item.value.ingress }}
    

    jednostkowa usługa

    hostname: {{ hostname }}
    url: {{ url }}
    

    Dodatkowe parametry są konfigurowane za pomocą parametrów konfiguracji tunelu

  5. W zależności od Twojego systemu inicjacji - kontrolowanego przez cf_init_system - rola wykonuje następujące czynności

    • Systemd

      Tworzy [szablon jednostki systemd] cloudflared@{{ tunnel }}.service i uruchamia instancję dla każdej usługi z listy cf_tunnels

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

      1. Instalacja usługi cloudflared w /etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
      2. Link do skryptu zatrzymania w /etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
      3. Link do skryptu uruchamiania w /etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}
  6. Jeśli używasz [nazwanych tuneli], rola utworzy również [trasę DNS].

Konfiguracja klienta SSH

Skąd uzyskujesz dostęp do swoich węzłów przez ssh, który jest przesyłany przez cloudflared, musisz postępować zgodnie z [przewodnikiem ssh-klienta]. Musisz dodać następujące

Host xxx.mycompany.com
  ProxyCommand /usr/bin/cloudflared access ssh --hostname %h

Możesz osiągnąć tę konfigurację, jeśli włączysz cf_ssh_client_config. Dodatkowo musisz również określić cf_ssh_client_config_group. Załóżmy, że twoja inwentarz wygląda następująco:

all:
  children:
    servers:
      hosts:
        host001:
        host002:

Jeśli określisz cf_ssh_client_config_group: servers, otrzymasz wpis dla host001 i host002.

Wymagania

brak

Zmienne roli

Parametry instalacji i deinstalacji

Poniższe parametry kontrolują instalację i/lub deinstalację

Parametr Opis Domyślna wartość
cf_download_baseurl Podstawowy adres URL dla binarnych plików cloudflare https://github.com/cloudflare/cloudflared/releases/latest/download/
cf_install_only Ustaw na true, jeśli chcesz tylko zainstalować binarkę bez jakiejkolwiek konfiguracji lub logowania false
cf_ssh_client_config Ustaw na true, jeśli chcesz skonfigurować ustawienia proxy dla swojego [przewodnika SSH-klienta], patrz Konfiguracja klienta SSH false
cf_ssh_client_config_group Nazwa grupy inwentarza dla której ma być utworzone ustawienie proxy ssh, patrz Konfiguracja klienta SSH ``
cf_force_install Ustaw na true, jeśli chcesz ponownie zainstalować cloudflared. Domyślnie zakłada się, że cloudflared działa jako usługa i automatycznie aktualizuje. false
cf_remove_unused_tunnel Usuwa nieużywane cf_tunnels, czyli cf_tunnels działające, ale nie wymienione w cf_tunnels. false
cf_remove_setup_certificate Usuwa cert.pem po zainstalowaniu usługi false
cf_credential_file_base Folder, w którym umieszczane są pliki uwierzytelniające /root/.cloudflared/
cf_config_dir Folder, w którym umieszczane są pliki konfiguracyjne cloudflare /etc/cloudflared
cf_os_package_enable Użyj systemu pakietów OS i repozytorium pakietów Cloudflare (aktualnie tylko Debian/Ubuntu) false
cf_repository_key_url Jeśli cf_os_package_enable jest prawdą, adres URL klucza GPG dla repozytorium apt https://pkg.cloudflare.com/pubkey.gpg
cf_repository_key_install_path Jeśli cf_os_package_enable jest prawdą, ścieżka, gdzie instalowany jest klucz GPG dla repozytorium apt /usr/share/keyrings/cloudflare-main.gpg
cf_repository Jeśli cf_os_package_enable jest prawdą, adres URL dla repozytorium apt Cloudflare deb [signed-by={{ cf_repository_key_install_path }}] https://pkg.cloudflare.com/cloudflared {{ ansible_distribution_release }} main
cf_binary_name Nazwa binarki demona cloudflare - zmieniaj tylko, jeśli wiesz, co robisz cloudflared

Parametry usługi Cloudflared

To są parametry wymagane do utworzenia usługi systemowej

Parametr Opis Domyślna wartość
cf_init_system Określa, który system inicjacji użyć. Możliwe wartości to systemd i initv systemd
cf_systemd_user Użytkownik dla usługi systemd, w przypadku cf_init_system: systemd root
cf_systemd_group Grupa dla usługi systemd, w przypadku cf_init_system: systemd root
cf_cert_location Lokalizacja certyfikatu do skopiowania - patrz Uwierzytelniaj demona -
cf_cert_content Zawartość certyfikatu do skopiowania - patrz Uwierzytelniaj demona -
cf_tunnels [Obowiązkowe] Lista usług tunelowych, z każdą definiującą parametry Cloudflare -
cf_sysctl_buffer_size_increase Zwiększenie dozwolonego rozmiaru bufora UDP przyjmowanego przez system operacyjny (non BSD) - więcej szczegółów false

Zaleca się używanie [nazwanych tuneli] dla cf_tunnels, które wymagają parametrów nazwanych tuneli Cloudflare, ale można również użyć parametrów historycznych tuneli Cloudflare

Parametry nazwanych tuneli Cloudflare

  ...
    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

Klucz tunelu powinien odpowiadać tunnel_id.

Parametr Opis Domyślna wartość
account_tag [Obowiązkowe] Tag konta z [pliku uwierzytelniającego] wygenerowanego podczas tworzenia tunelu -
tunnel_secret [Obowiązkowe] Sekret tunelu z [pliku uwierzytelniającego] wygenerowanego podczas tworzenia tunelu -
tunnel_id [Obowiązkowe] ID tunelu z [pliku uwierzytelniającego] wygenerowanego podczas tworzenia tunelu -
ingress [Obowiązkowe] [reguły ingress] dla tunelu -
routes Lista tras, które należy utworzyć. Obecnie pozwala na listę dla tras dns (patrz przykład powyżej) -

Trasy

DNS

Trasy dns oczekują listy CNAME, które mają być utworzone, jak opisano tutaj. Jeśli CNAME już istnieje, zadanie zostanie pominięte, ale żaden błąd nie zostanie zgłoszony. Dodawaj tylko CNAME, a nie FQDN, ponieważ FQDN ustala się przez cloudlfared.

Sieć prywatna

Trasy private network oczekują listy CIDR, które mają być utworzone, jak opisano tutaj. Playbook wykonuje pętlę po liście, aby wykonać cloudflared tunnel route ip add {{ cf_cidr_entry }} {{ cf_tunnel.key }}. Jeśli CIDR już istnieje, zgłoszony zostanie błąd, który zostanie zignorowany.

Równoważnik obciążenia

Trasy lb oczekują listy istniejących równoważników obciążenia cloudflared (plus jego pul) do routingu tunelowego, jak opisano tutaj. Playbook wykonuje pętlę po liście, aby wykonać cloudflared tunnel route lb {{ cf_tunnel.key }} {{ cf_lb_entry.host_name }} {{ cf_lb_entry.pool_name }}. Jeśli tunel jest już powiązany z pulą, zgłoszony zostanie błąd, który zostanie zignorowany.

Parametry jednostkowej usługi Cloudflare

Jak w poprzednich wersjach tych ról, można używać konfiguracji jednostkowej usługi

Jeśli musisz przesyłać ruch tylko do jednej lokalnej usługi, możesz to zrobić za pomocą pliku konfiguracyjnego. Alternatywnie możesz skonfigurować konfigurację jednostkową

cf_tunnels:
  ssh:
    hostname: xxx
    url: ssh.mycompany.com
Parametr Opis Domyślna wartość
hostname [Obowiązkowe] Nazwa lub unikalny identyfikator -
url [Obowiązkowe] adres URL, do którego należy się połączyć [konfiguracja], np. ssh://localhost:22 lub https://localhost:443 -

Parametry konfiguracji tunelu

Te służą do konfigurowania parametrów dla każdego serwisu cloudflared. Możesz nadal konfigurować Konfigurację per-regułę dla nazwanych tuneli jako część ingress pod cf_tunnels.

Parametr Opis Domyślna wartość
autoupdate_freq Częstotliwość automatycznych aktualizacji - patrz dokumentację 24h
edge_ip_version Określa wersję adresu IP (IPv4 lub IPv6) używaną do nawiązywania połączenia między cloudflared a globalną siecią Cloudflare. Dostępne wartości to auto, 4, i 6 auto
edge_bind_address Określa wychodzący adres IP używany do nawiązywania połączenia między cloudflared a globalną siecią Cloudflare -
grace_period Gdy cloudflared otrzyma SIGINT/SIGTERM, przestanie akceptować nowe żądania, poczeka na zakończenie żądań w toku, a następnie się zamknie. Czekanie na żądania w toku zakończy się po tym okresie łaski lub po otrzymaniu drugiego SIGTERM/SIGINT 30s
metrics Adres do zapytania o metryki użytkowania - patrz dokumentacja localhost:
metrics_update_freq Częstotliwość aktualizacji metryk tunelu - patrz dokumentacja 5s
no_autoupdate Wyłącza okresowe sprawdzanie aktualizacji, ponownie uruchamiając serwer z nową wersją - patrz dokumentacja false
no_chunked_encoding Wyłącza kodowanie przesyłania po kawałkach; przydatne, jeśli uruchamiasz serwer WSGI - patrz dokumentacja false
no_tls_verify Wyłącza weryfikację TLS certyfikatu przedstawionego przez Twoje źródło. Pozwoli to zaakceptować każdy certyfikat pochodzący z źródła - patrz dokumentacja -
origin_server_name Nazwa hosta, której cloudflared powinien oczekiwać od certyfikatu Twojego serwera źródłowego - patrz dokumentacja -
origin_ca_pool Ścieżka do CA dla certyfikatu Twojego źródła. Ta opcja powinna być używana tylko wtedy, gdy Twój certyfikat nie jest podpisany przez Cloudflare - patrz dokumentacja -
protocol Określa protokół do użycia dla tunelu - patrz dokumentacja auto
logfile Włącza zapis do pliku dziennika dla cloudflared - nadal będzie logować do dziennika true
loglevel Określa szczegółowość logowania. Domyślna wartość "info" nie jest głośna, ale możesz chcieć używać "warn" w produkcji - patrz dokumentacja info
region Pozwala na wybór regionów, do których nawiązywane są połączenia. Pomiń lub pozostaw puste, aby połączyć się z globalnym regionem. Ustaw --region=us, aby kierować wszystkie połączenia przez region us 1 i us 2 -
retries Maksymalna liczba prób ponownych w przypadku błędów połączenia/protokolu. Ponowne próby używają wykładniczego opóźnienia (ponawiają co 1, 2, 4, 8, 16 sekund domyślnie), więc znaczne zwiększenie tej wartości nie jest zalecane - patrz dokumentacja 5
tag Niestandardowe tagi używane do identyfikacji tego tunelu, w formacie KEY=VALUE - patrz dokumentacja -
token Powiązuje instancję cloudflared z określonym tunelem. Token tunelu jest wyświetlany na pulpicie nawigacyjnym przy pierwszym tworzeniu tunelu. Możesz także odzyskać token za pomocą API -
transport_loglevel Określa szczegółowość logów dla transportu między cloudflared a krawędzią Cloudflare. Dostępne poziomy to: trace, debug, info, warn, error, fatal, panic. Każda wartość poniżej warn generuje znaczne wyjście i powinna być używana tylko do debugowania problemów z wydajnością o niskim poziomie i dziwności protokołów - patrz dokumentacja info
warp_routing Pozwala użytkownikom łączyć się z usługami wewnętrznymi za pomocą WARP, szczegóły patrz warp-routing false

Zależności

brak

Przykładowe Playbooki

Poniższy przykład instaluje pojedynczą usługę dla tunelu ssh dla każdego serwera

- 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

Poniższy przykład instaluje [nazwa tunelu] servers z połączeniem do {{ inventory_hostname }}.mycompany.com dla ssh i hello world, jeśli uzyskasz dostęp do hello-{{ inventory_hostname }}.mycompany.com przez przeglądarkę

- 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

Poniższy przykład po prostu pobiera cloudflared na lokalny komputer i konfiguruje plik ssh-config:

- hosts: localhost
  remote_user: papanito # twój lokalny użytkownik, który ma uprawnienia administratora
  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

Dodatkowe informacje

Uwierzytelnianie demona

Zgodnie z authenticate-the-cloudflare-daemon podczas uwierzytelniania demona otwiera się okno przeglądarki lub - jeśli to nie jest możliwe - należy ręcznie umieścić link. W tym czasie demon czeka. Nie mogłem wymyślić rozwiązania, jak zautomatyzować to zachowanie, więc wpadłem na poniższą implementację.

  • jeśli nic nie jest określone, wtedy ansible wywołuje cloudflared login i będzie kontynuowane, gdy uwierzytelnienie zostanie zakończone - ma to sens, jeśli używasz roli do zainstalowania demona lokalnie na komputerze, gdzie masz okno przeglądarki

  • jeśli cf_cert_location, certyfikat jest faktycznie kopiowany z cf_cert_location, lub jeśli cf_cert_content jest określony, wtedy certyfikat zostaje utworzony bezpośrednio z wartości, którą tam przechowano. Więc mógłbyś zalogować się raz do cloudflare z węzła macierzystego (gdzie uruchamiasz ansible) lub z lokalizacji zdalnej.

    Można zaszyfrować cert.pem za pomocą ansible vault i przechować go gdzie indziej.

Odniesienia:

  • [pobierania] - instrukcje dotyczące pobierania cloudflared
  • [przewodnik SSH] - połączenia SSH z cloudflared
  • [argumenty CLI] - argumenty wiersza poleceń
  • [konfiguracja] - Format pliku konfiguracyjnego używa składni YAML

Licencja

To jest oprogramowanie wolne, wydane na podstawie warunków licencji Apache v2.

Informacje o autorze

Napisane przez Papanito - Gitlab / Github

O projekcie

Ansible role do install and run cloudflare argo tunnel

Zainstaluj
ansible-galaxy install papanito.cloudflared
Licencja
apache-2.0
Pobrania
2.3k
Właściciel
A passionate DevOps Engineer from Switzerland, father of five and husband of the most beautiful and most amazing woman in the world.