papanito.cloudflared

Ansibleロール「papanito.cloudflared」

このAnsibleロールは、ホストにcloudflaredをダウンロードしてインストールし、オプションで[argo-tunnel]をサービスとしてインストールします。

3.0.0の重大な変更

これは、命名されたトンネル新しい動作を反映するための重大な変更です。

このロールは、バージョン3.0.0以前にロールを使用した場合のクリーンアップを行います。ただし、あなたはAnsibleプロジェクト内の設定(変数)を更新する必要があります。 変数をユニークにするために、通常はcf_で始まる名前に変更しました。同じ名前の変数が異なるロールで使用されていると、予期しない副作用が発生することがあります。

Cloudflaredとトンネルへの接続アプリ

[1] によると、トンネルを作成して管理するには、まず次のことを行う必要があります。

  1. cloudflaredをダウンロードしてインストールします
  2. cloudflaredを認証します

cloudflaredがインストールされて認証されたら、最初のトンネルを立ち上げるためのプロセスは次の3つの高レベルの手順を含みます。

  1. トンネルを作成します
  2. トンネルへのトラフィックをルーティングします
  3. トンネルを実行します

手順4と5は、通常は管理者によって、トンネルごとに1回実行されます。手順6は、トンネルを開始する必要があるときに、通常はトンネルの所有者によって実行されます(管理者とは異なる場合があります)。

このロールは何をするのか?

このロールには実際に2つの目的があります。

サーバー側デーモンのインストール

このロールは、ノード上にサービスをセットアップすることだけを行います。つまり、上記の手順1、2、4、および5です。

トンネルを作成し、ルーティングを有効にするのは、ロールではなく管理者が行うべきタスクです [1]

1つまたは複数の[named tunnels]と[single service]を設定することができますが、通常、[named tunnels]の場合は1つのデーモンで済みます。実際、このロールは以下の手順を実行します:

  1. [downloads]に従ってバイナリをダウンロードしてインストールします。

  2. デーモンをインストール/構成します - Authenticate the daemonを参照。

  3. [named tunnels]の場合、{{ cf_credentials_dir }}/{{ tunnel_id }}.jsonの下に[credentials file]が作成されます。内容は以下のようになります。

    {"AccountTag":"{{ account_tag }}","TunnelSecret":"{{ tunnel_secret }}","TunnelID":"{{ tunnel_id }}","TunnelName":"{{ cf_tunnels.key }}"}
    
  4. cf_tunnels内の各キーについて、/etc/cloudflareにトンネル設定を作成します。

    ファイルは{{ tunnel }}.ymlという名前で、最小限の設定は次のとおりです。

    named tunnels

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

    single service

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

    追加のパラメータは、Tunnel configuration paramsを使用して設定します。

  5. Initシステムに応じて - cf_init_systemで制御されます - ロールは以下のことを行います。

    • Systemd

      [systemd-unit-template] cloudflared@{{ tunnel }}.serviceを作成し、cf_tunnelsのリスト内の各サービスのインスタンスを開始します。

      cloudflared tunnel --config {{ tunnel }}.yml
      
    • Init-Vシステム

      1. cloudflared service/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}にインストールします。
      2. 停止スクリプトを/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}にリンクします。
      3. 開始スクリプトを/etc/init.d/{{ systemd_filename }}-{{ tunnel_name }}にリンクします。
  6. [named tunnels]を使用する場合、ロールは[dns route]も作成します。

SSHクライアント設定

cloudflaredによってプロキシされたノードにSSHでアクセスする場合、[ssh-guide-client]に従う必要があります。次のように追加する必要があります。

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

この設定は、cf_ssh_client_configを有効にすると実現できます。さらに、cf_ssh_client_config_groupも指定する必要があります。このため、あなたのインベントリが次のように見えると仮定します。

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

cf_ssh_client_config_group: serversを指定すると、host001およびhost002のエントリが作成されます。

必要条件

なし

ロール変数

インストールとアンインストールのパラメータ

以下のパラメータは、インストールおよび/またはアンインストールを制御します。

パラメータ 説明 デフォルト値
cf_download_baseurl cloudflareバイナリのベースURL https://github.com/cloudflare/cloudflared/releases/latest/download/
cf_install_only 設定やログインなしにバイナリをインストールしたい場合はtrueに設定 false
cf_ssh_client_config [ssh-guide-client]のプロキシ設定を構成したい場合はtrueに設定 false
cf_ssh_client_config_group SSHプロキシ設定を作成するインベントリグループの名前 ``
cf_force_install cloudflaredを再インストールしたい場合はtrueに設定 false
cf_remove_unused_tunnel 使用されていないcf_tunnelsを削除します false
cf_remove_setup_certificate サービスをインストールした後にcert.pemを削除します false
cf_credential_file_base 認証ファイルを配置するフォルダ /root/.cloudflared/
cf_config_dir Cloudflare構成ファイルを配置するフォルダ /etc/cloudflared
cf_os_package_enable OSパッケージシステムとCloudflareパッケージリポジトリを使用する (現在はDebian/Ubuntuのみ) false
cf_repository_key_url cf_os_package_enableがtrueのとき、aptリポジトリ用のGPGキーのURL https://pkg.cloudflare.com/pubkey.gpg
cf_repository_key_install_path cf_os_package_enableがtrueのとき、aptリポジトリ用のGPGキーをインストールするパス /usr/share/keyrings/cloudflare-main.gpg
cf_repository cf_os_package_enableがtrueのとき、Cloudflare aptリポジトリのURL deb [signed-by={{ cf_repository_key_install_path }}] https://pkg.cloudflare.com/cloudflared {{ ansible_distribution_release }} main
cf_binary_name Cloudflareデーモンのバイナリ名 - 知っている場合のみ変更してください cloudflared

Cloudflaredサービスパラメータ

これらはシステムサービスを作成するために必要なパラメータです。

パラメータ 説明 デフォルト値
cf_init_system 使用するinitサービスを定義します。可能な値はsystemdinitvです systemd
cf_systemd_user cf_init_system: systemdのときのsystemdサービス用のユーザー root
cf_systemd_group cf_init_system: systemdのときのsystemdサービス用のグループ root
cf_cert_location コピーする証明書の場所 - Authenticate the daemonを参照 -
cf_cert_content コピーする証明書の内容 - Authenticate the daemonを参照 -
cf_tunnels [必須] トンネルサービスのリスト、各トンネルはCloudflareパラメータを定義します -
cf_sysctl_buffer_size_increase OS (BSD以外)によって許可されるUDP受信バッファサイズの増加 - 詳細 false

cf_tunnelsに対して[named tunnels]を使用することをお勧めしますが、Cloudflare legacy tunnel parametersも使用できます。

Cloudflare named tunnel parameters

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

トンネルのkeytunnel_idと一致する必要があります。

パラメータ 説明 デフォルト値
account_tag [必須] トンネルを作成する際に生成された[credentials file]からのアカウントタグ -
tunnel_secret [必須] トンネルを作成する際に生成された[credentials file]からのトンネルシークレット -
tunnel_id [必須] トンネルを作成する際に生成された[credentials file]からのトンネルID -
ingress [必須] トンネルの[ingress rules] -
routes 作成されるルートのリスト。現時点ではdnsルートのリストを許可します (上記の例参照) -

ルート

DNS

dnsルートは、こちらに説明されていますが記載されているCNAMEのリストを期待します。CNAMEがすでに存在する場合、タスクはスキップされますが、エラーは表示されません。また、FQDNではなくCNAMEのみを追加してください。FQDNはcloudflaredによって決定されます。

プライベートネットワーク

private networkルートは、こちらに説明されていますが記載されているCIDRのリストを期待します。プレイブックはリスト上の各CIDRに対してcloudflared tunnel route ip add {{ cf_cidr_entry }} {{ cf_tunnel.key }}を実行します。CIDRがすでに存在する場合、エラーが表示されますが無視されます。

ロードバランサー

lbルートは、こちらに説明されていますが記載されている、トンネルをルーティングするための既存のcloudflaredロードバランサー(およびそのプール)のリストを期待します。プレイブックはリスト上の各要素に対してcloudflared tunnel route lb {{ cf_tunnel.key }} {{ cf_lb_entry.host_name }} {{ cf_lb_entry.pool_name }}を実行します。トンネルがすでにプールにバインドされている場合、無視されるエラーが表示されます。

Cloudflare single service parameters

このロールの以前のバージョンと同様に、[単一サービス構成スタイル][single service]を使用できます。

ローカルサービスにトラフィックをプロキシする必要がある場合、構成ファイルを使用して行うことができます。別の方法として、単一サービスの構成を設定できます。

cf_tunnels:
  ssh:
    hostname: xxx
    url: ssh.mycompany.com
パラメータ 説明 デフォルト値
hostname [必須]名前またはユニーク -
url [必須]接続するURL [config]例えばssh://localhost:22またはhttps://localhost:443 -

トンネル構成パラメータ

これらは、cloudflaredサービスごとにパラメータを設定するために使用されます。cf_tunnelsingressの一部として、named tunnelsのルールごとの構成を設定することもできます。

パラメータ 説明 デフォルト値
autoupdate_freq 自動更新頻度 - docuを参照 24h
edge_ip_version cloudflaredとCloudflareグローバルネットワークの間の接続に使用するIPアドレスバージョンを指定。利用可能な値はauto46 auto
edge_bind_address cloudflaredとCloudflareグローバルネットワーク間の接続に使用される送信IPアドレスを指定 -
grace_period cloudflaredがSIGINT/SIGTERMを受け取ると、新しいリクエストの受け付けを停止し、進行中のリクエストが終了するのを待ってからシャットダウンします 30s
metrics 使用状況メトリックをクエリするアドレス - docuを参照 localhost:
metrics_update_freq トンネルメトリックを更新する頻度 - docuを参照 5s
no_autoupdate 更新の定期チェックを無効にし、新しいバージョンでサーバーを再起動します - docuを参照 false
no_chunked_encoding チャンク化トランスファーエンコーディングを無効にします; WSGIサーバーを実行している場合に便利 - docuを参照 false
no_tls_verify 起源から提示された証明書のTLS確認を無効にします - docuを参照 -
origin_server_name cloudflaredが期待する起源サーバー証明書のホスト名 - docuを参照 -
origin_ca_pool 起源証明書のCAへのパス。Cloudflareによって署名されていない証明書の場合のみ使用します - docuを参照 -
protocol トンネルに使用するプロトコルを指定 - docuを参照 auto
logfile cloudflaredのログファイルの書き込みを有効にします - ジャーナルにもログを記録し続けます true
loglevel ログの冗長性を指定します。デフォルトの「info」は騒がしくありませんが、プロダクションでは「warn」で実行することも検討できます - docuを参照 info
region 接続される地域を選択できるようにします。グローバル地域に接続するには省略または空のままにします。すべての接続を米国地域1および2を経由させるには、--region=usを設定します -
retries 接続/プロトコルエラーの最大再試行回数。再試行は指数バックオフを使用します(デフォルトでは1, 2, 4, 8, 16秒ごとに再試行)ので、この値を大幅に増やすことは推奨されません - docuを参照 5
tag このトンネルを識別するのに役立つカスタムタグ、形式はKEY=VALUE - docuを参照 -
token cloudflaredインスタンスを特定のトンネルに関連付けます。トンネルのトークンは、最初にトンネルを作成する際にダッシュボードに表示されます。APIを使用してトークンを取得することもできます - APIを参照 -
transport_loglevel cloudflaredとCloudflareエッジ間の輸送ログの冗長性を指定します。利用可能なレベルはtracedebuginfowarnerrorfatalpanicです info
warp_routing WARPを使用して内部サービスに接続できるようにします; 詳細は[warp-routing]を参照 false

依存関係

なし

例プレイブック

以下の例は、各サーバーのためにSSHトンネルの単一サービスをインストールします。

- 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

以下の例は、SSHトンネルのために[named tunnel] serversをインストールし、{{ inventory_hostname }}.mycompany.comへのingressを設定します。ブラウザからhello-{{ inventory_hostname }}.mycompany.comにアクセスする場合、[hello world]を表示します。

- 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

以下の例は、ローカルマシンに単にcloudflaredをダウンロードし、ssh-configファイルを設定します。

- hosts: localhost
  remote_user: papanito #管理者権限のあるローカルユーザー
  vars:
    cf_install_only: true
    cf_ssh_client_config: true
    cf_ssh_client_config_group: servers
  roles:
    - papanito.cloudflared

テスト

ansible-playbook tests/test.yml -i tests/inventory

追加情報

デーモンの認証

[authenticate-the-cloudflare-daemon]によれば、デーモンを認証する際、ブラウザウィンドウが開きますが、それが不可能な場合は手動でリンクを入力する必要があります。この間、デーモンは待機します。この動作を自動化する解決策は思いつかなかったので、以下の実装を考えました。

  • 何も指定されていない場合、ansibleはcloudflared loginを呼び出し、認証が完了するまで続行しません。これは、ロールを使用してデーモンをローカルにインストールする場合に意味があります。
  • cf_cert_locationが指定されている場合、証明書はその場所から実際にコピーされます。または、cf_cert_contentが指定されている場合、その値から直接証明書が作成されます。このため、マスターノードから一度cloudflareにログインすることができます(ansibleを実行する場所)またはリモートからログインすることもできます。

あなたはcert.pemをansibleボールトで暗号化し、安全な場所に保存できます。

参照:

  • [downloads] - cloudflaredダウンロード手順
  • [ssh-guide] - cloudflaredでのssh接続
  • [cli-args] - コマンドライン引数
  • [config] - 構成ファイルフォーマットはYAML構文を使用

ライセンス

これはフリーソフトウェアで、Apache v2ライセンスの条件のもとでリリースされています。

著者情報

著者:Papanito - Gitlab / Github

プロジェクトについて

Ansible role do install and run cloudflare argo tunnel

インストール
ansible-galaxy install papanito.cloudflared
ライセンス
apache-2.0
ダウンロード
2.3k
所有者
A passionate DevOps Engineer from Switzerland, father of five and husband of the most beautiful and most amazing woman in the world.