danvaida.letsencrypt
Ansible Let's Encrypt ロール
Let's Encrypt から ACME を使用して TLS 証明書を取得します。
チャレンジを完了し、証明書を取得した後は、選択したウェブサーバーに設定する責任があります。
要件
openssl
- Python >= 2.7.9
ロール変数
letsencrypt_certs_dir: すべての CSR、キー、および証明書が保存される作業ディレクトリへのパス。
letsencrypt_account_key_name: Let's Encrypt アカウントの RSA キーの名前。
letsencrypt_account_key_size: Let's Encrypt アカウントの RSA キーのサイズ。
letsencrypt_certs_to_generate: 生成する証明書のリスト。
account_email: ACME サーバーとの交換に使用されるメールアドレス。証明書の有効期限についての警告が届きます。
account_key: RSA キーのファイルパス。
acme_directory: ACME API のエンドポイント。デフォルトでは Let's Encrypt のステージングを使用します。
agreement: 同意する利用規約の URI。
challenge: 受け入れられるチャレンジの種類。
csr: CSR ファイルのパス。
dest: 生成された証明書ファイルの保存先パス。
remaining_days: 証明書が有効な日数。
依存関係
該当なし
例 Playbook
この例では、Let's Encrypt から証明書をリクエストしていますが、理論的にはこの Ansible モジュールは任意の ACME サーバーと互換性があります。
3つのプレイがあります:
- CSR、キーを作成し、証明書の発行リクエストを行います。
- チャレンジを完了します(この場合は Route53 の DNS レコード)。
- チャレンジを検証し、証明書を発行するように依頼します。
- name: ACME ステップ 1
hosts: localhost
connection: local
roles:
- role: letsencrypt
letsencrypt_certs_dir: './files/production/certs'
letsencrypt_account_key_name: 'letsencrypt_account'
letsencrypt_account_key_size: 2048
letsencrypt_certs_to_generate:
- domain: 'your-domain.com'
key_size: 2048
account_email: '[email protected]'
account_key: "{{ letsencrypt_certs_dir }}/{{ letsencrypt_account_key_name }}.key"
challenge: 'dns-01'
agreement: 'https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf'
csr: "{{ letsencrypt_certs_dir }}/your-domain.com/your.csr"
dest: "{{ letsencrypt_certs_dir }}/your-domain.com/domain.crt"
acme_directory: 'https://acme-v01.api.letsencrypt.org/directory'
tags: letsencrypt
tasks:
- name: Route53に追加するレコードを設定する必要があります
set_fact:
route53_records_to_add: "{{
route53_records_to_add | default([]) +
[{'zone': item.1.domain,
'record': item.0.challenge_data[item.1.domain]['dns-01']['resource'] + '.' + item.1.domain + '.',
'ttl': 300,
'type': 'TXT',
'value': '\"' + item.0.challenge_data[item.1.domain]['dns-01']['resource_value'] + '\"' }]
}}"
with_together:
- "{{ letsencrypt_acme_step_one }}"
- "{{ letsencrypt_certs_to_obtain | default([]) }}"
when: item.1.domain == item.0.item.domain
tags: route53
- name: ACME チャレンジ解決 (Route53 の DNS レコード)
hosts: localhost
connection: local
roles:
- role: route53
tags: route53
- name: ACME ステップ 2
hosts: localhost
connection: local
pre_tasks:
- name: DNS の変更が伝播するまで待つ必要があります
pause: minutes=1
roles:
- role: letsencrypt
letsencrypt_acme_step: two
tags: letsencrypt
他のチャレンジタイプを完了するのは、同じであり、このロールに対しては不透明です。
テスト
テストは DNS チャレンジタイプに依存しており、AWS Route53 を介して解決されます。
提供された Docker 環境でテストを実行したい場合は、次のコマンドを実行してください:
$ cd /path/to/ansible-roles/letsencrypt
$ ansible-galaxy install \
--force \
--role-file=./tests/requirements.yml \
--roles-path=./tests/dependencies
$ docker build \
--no-cache \
--pull \
--tag ansible-roles-test \
tests/support
$ docker run \
--rm \
--interactive \
--tty \
--volume $PWD:/etc/ansible/roles/letsencrypt \
--volume $PWD/tests/dependencies:/etc/ansible/roles/letsencrypt/tests/roles:ro \
--env AWS_ACCESS_KEY=$AWS_ACCESS_KEY \
--env AWS_SECRET_KEY=$AWS_SECRET_KEY \
--workdir /etc/ansible/roles/letsencrypt/tests \
ansible-roles-test
To-do
- 他のチャレンジタイプのサポート
- 他の DNS サービス API のサポート(例:Cloud DNS)
- 一部のウェブサーバーロールとの統合(例:NGINX、Apache)
- 更新のサポート
- 複数の Ansible バージョンとディストリビューションのサポート
- DNS チャレンジのために合意が必要ないように、テスト用の Docker イメージで Ansible を更新します。
ライセンス
このプロジェクトは GNU GPL v3.0 ライセンスの条件に基づいてライセンスされています。
著者情報
このロールは Dan Vaida によって作成されました。
貢献
ToDo リストを参照してください。貢献を歓迎します。
Obtains TLS certificates through ACME from Let's Encrypt.
ansible-galaxy install danvaida.letsencrypt