
みなさんこんにちは!
この記事では、Let's Encrypt証明書を一元的に更新し、ansibleを使用してインフラストラクチャを管理する問題をどのように解決したかについて説明します。
このソリューションでは次を使用します。
- アンシブル
- rsync、rsyncd
- inotify、incron
- certbot
- nginx
ソリューションが役立つ2つのアーキテクチャオプションを提供します。 次に、コメントでオプションを提案できます。
オプション1:複数のドメインにサービスを提供するパブリックIP(3など)を持つ複数のフロントエンドサーバーがあります。 これらのドメインは追加/削除できます。 各フロントエンドサーバーを監視しないようにするには、1つのletsencrypt server
これを行う方が便利です。

オプション2:パブリックIPを持つサーバーは1つだけで、ネットワーク内のサーバーに証明書が必要です。

Ansibleロールの説明
役割のあるリポジトリはこちらから入手できます 。
リポジトリには4つのロールがあります。
- nginx-simple
すべてのホストにnginx
をインストールし、基本設定をコピーします。 役割自体は、プレイブックからは始まりません。 他のロールからのメタ依存関係で実行されます。 - letsencrypt-server
letsencrypt server
ホストでrsyncd
を構成します。 メタ依存関係では、 nginx-simple
役割を果たします。 したがって、 nginx
が最初にインストールされ、その後、 letsencrypt server
の役割がletsencrypt server
ます。 - インクロン
incron
必要なパッケージをインストールし、基本incron
をコピーします。 また、ロールはnginx-simple
として直接開始されません。 - 正面
メタ依存関係では、 incron
およびnginx-simple
ロールがあります。 その後、 front
ロールはexample.comに必要なnginx
構成をコピーし、 cron
にタスクを追加して、 letsencrypt server
から新しい証明書を取得し、 letsencrypt server
にタスクをincron
してファイルの変更を確認し、 nginx -s reload
hookを実行します
練習に移りましょう:
初期設定
最初は、次のものがあります。
- SSL証明書を集中的に発行するための1台のサーバー(
letsencrypt server
) - nginxを備えた1つ以上のパブリックにアクセス可能なサーバー(
front
)
Ubuntu 16.04はすべてのサーバーにインストールされます。
nginxをインストールして構成する
まず、 nginx-simple
共通の役割からすべてのホストにnginxをインストールし、すべてのホストに共通のnginx構成(nginx.conf、sslパラメーター、証明書パスなど)を展開します。
テンプレートでletsencrypt Server用の.../site-available/default.conf
フォルダ.well_known
に配置されます/var/www/
:
{% if letsencrypt_server %} location /.well-known { root /var/www/; }
front
グループのサーバーでは、 .well_known
フォルダー.well_known
証明書の取得だけでなく他のソフトウェアにも使用されるため、 example.conf
letsencrypt-proxy.conf
インポートし、nginxはtry_file try_file
を使用してフロントサーバー上のフォルダーをローカルに検索します:
{% if nginx_proxy_well_known %} try_files $uri $uri/ @letsencrypt; {% endif %}
インベントリの変数に応じて、ドメインの構成が書き込まれます。 リポジトリでは、これはexample.comドメインです
また、 letsencrypt_server
変数に応じて、 nginx-simple
ロールはletsbotcryptサーバーにcertbotをインストールし、cronタスクを追加して証明書を更新します。
証明書を取得する
我々はレッツ・暗号化からワイルドカード証明書の前にこの問題を解決しているので、我々は、証明書を取得するために両方のオプションを検討します。
letsencryptサーバーサーバーでは、次のことを行います。
certbot certonly --agree-tos -d example.ru --webroot -w /var/www/
複数のドメインがある場合は、 -d
スイッチを使用して次のドメインを追加します。
ワイルドカード証明書を取得するには、DNS TXTにレコードを追加する必要があります。 現時点では、これがそのような証明書を取得する唯一の方法です。
certbot certonly --agree-tos -d example.ru -d *.example.ru --preferred-challenges dns --manual --server https:
Certbotは、追加する必要があるTXTレコードを書き込みます。
証明書の更新
証明書を取得しましたが、それらをフロントサーバー/サーバーにコピーするように構成します。 これを行うために、我々は設定しますrsyncd
IPアドレスの制限されたリストへの読み取りアクセス権を持つサーバーletsencryptを:
hosts allow = {{ hosts_allow }} hosts deny = * list = true use chroot = no [cert] path = /etc/letsencrypt/live/ uid = root gid = root read only = true
5分ごとに、フロントサーバーからのcronタスクは、証明書が更新されたかどうかを確認し、それらを取得します。 なぜなら 証明書はローテーションされ、 /etc/letsencrypt/live/{{ domain }}
は/etc/letsencrypt/live/{{ domain }}
フォルダーにあります。 -L
スイッチを追加して、元のファイルを引き出します。
/usr/bin/rsync -zavL --chmod=D0750,F640 --delete rsync://{{ hostvars['letsencrypt-server'].ansible_eth0.ipv4.address }}/cert /etc/letsencrypt/live/
nginxのフック
nginxを構成し、証明書を受け取って、フロントサーバーに持っていきました。 これは、ファイルがフォルダ内にあるかを決定するために残っている/etc/letsencrypt/live/{{ domain }}
{ドメイン}}変更やフックを実行nginx -s reload
Linuxのinotify
カーネルサブシステムとincron
デーモンがこれに役立ちます。 それらについての詳細はこちらをご覧ください 。
役割はincron
パッケージをインストールすると、テンプレートの役割front
、モニター、正しい証明書をフックにタスクを追加します。
/etc/letsencrypt/live/{{ domain }}/ IN_CREATE,IN_DELETE,IN_MODIFY,IN_MOVED_TO nginx -s reload
結論として
私たちは、インストールおよび構成プロセス全体を詳細に説明しようとしました。 すべてがansibleプレイブックに記述されています-記事は非常にコンパクトであることが判明しました。 彼らがよく言うのは、「100行強のコード」です。 私たちは、コメント、質問、批判、コメントに喜んでお答えします。