danvaida.letsencrypt
Ansible Let's Encrypt 角色
通过 ACME 从 Let's Encrypt 获取 TLS 证书。
完成挑战并获得证书后,您需要负责将其设置在您选择的 web 服务器上。
要求
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: 证书有效天数。
依赖
无
示例剧本
在此示例中,我们从 Let's Encrypt 请求证书,尽管理论上此 Ansible 模块应与任何 ACME 服务器兼容。
我们有三个步骤:
- 创建 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
待办事项
- 支持其他挑战类型
- 支持其他 DNS 服务 API(即 Cloud DNS)
- 与某些 web 服务器角色集成(即 NGINX、Apache)
- 支持续期
- 支持多个 Ansible 版本和发行版
- 更新测试 Docker 镜像中的 Ansible,以便无需指定 DNS 挑战的协议。
许可证
该项目根据 GNU GPL v3.0 许可证条款授权。
作者信息
此角色由 Dan Vaida 创建。
贡献
请查看 待办事项 列表。欢迎贡献。
关于项目
Obtains TLS certificates through ACME from Let's Encrypt.
安装
ansible-galaxy install danvaida.letsencrypt
许可证
lgpl-3.0
下载
225
拥有者
sysadmin & solutions architect