danvaida.letsencrypt
Rol de Ansible Let's Encrypt
Obtiene certificados TLS a través de ACME de Let's Encrypt.
Una vez que completes el(los) desafío(s) y obtengas el(los) Certificado(s), eres responsable de configurarlo(s) en tu(s) servidor(es) web de tu elección.
Requisitos
openssl
- Python >= 2.7.9
Variables del Rol
letsencrypt_certs_dir: Ruta al directorio de trabajo, donde se guardarán todos los CSRs, Claves y Certificados.
letsencrypt_account_key_name: Nombre de la clave RSA de la cuenta de Let's Encrypt.
letsencrypt_account_key_size: Tamaño de la clave RSA de la cuenta de Let's Encrypt.
letsencrypt_certs_to_generate: Lista de certificados a generar.
account_email: Dirección de correo electrónico que se intercambiará con el servidor ACME. Recibirás advertencias sobre la expiración del certificado.
account_key: Ruta al archivo de clave RSA.
acme_directory: Endpoint de la API de ACME. Usa el entorno de pruebas de Let's Encrypt por defecto.
agreement: URI del documento de Términos de Servicio con el que estás de acuerdo.
challenge: El tipo de desafío aceptado.
csr: Ruta al archivo CSR.
dest: Ruta al archivo del Certificado resultante (donde lo deseas guardar).
remaining_days: Número de días para que el certificado sea válido.
Dependencias
N/A
Ejemplo de Playbook
En este ejemplo, estamos solicitando un certificado de Let's Encrypt, aunque en teoría, este módulo de Ansible debería ser compatible con cualquier servidor ACME.
Tenemos tres tareas:
- crear CSR, Clave y emitir una solicitud para la liberación del certificado
- completar el desafío (registro DNS en Route53 en este caso)
- pedir validación del desafío y otorgar el certificado.
- name: Paso 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: 'tu-dominio.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 }}/tu-dominio.com/tu.csr"
dest: "{{ letsencrypt_certs_dir }}/tu-dominio.com/dominio.crt"
acme_directory: 'https://acme-v01.api.letsencrypt.org/directory'
tags: letsencrypt
tasks:
- name: Lista de registros de Route53 que deben ser creados deben ser establecidos como hecho
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: Resolución del desafío ACME (registro DNS en Route53)
hosts: localhost
connection: local
roles:
- role: route53
tags: route53
- name: Paso ACME 2
hosts: localhost
connection: local
pre_tasks:
- name: Debemos esperar a que los cambios de DNS se propaguen
pause: minutes=1
roles:
- role: letsencrypt
letsencrypt_acme_step: two
tags: letsencrypt
Completar otros tipos de desafíos debería ser lo mismo y transparente para este rol.
Pruebas
Las pruebas dependen del tipo de desafío DNS y se resuelven a través de AWS Route53.
Si deseas ejecutar las pruebas en el entorno de docker proporcionado, ejecuta los siguientes comandos:
$ cd /ruta/a/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
Tareas pendientes
- Soporte para otros tipos de desafíos
- Soporte para otras APIs de servicios DNS (es decir, Cloud DNS)
- Integración con algunos roles de servidores web (es decir, NGINX, Apache)
- Soporte para renovación
- Soporte para múltiples versiones de Ansible y distribuciones
- Actualizar Ansible en la imagen Docker de las pruebas para poder no especificar el acuerdo para el desafío DNS.
Licencia
Este proyecto está licenciado bajo los términos de la licencia GNU GPL v3.0.
Información del Autor
Rol creado por Dan Vaida.
Contribuciones
Consulta la lista de Tareas Pendientes. Las contribuciones son bienvenidas.
Obtains TLS certificates through ACME from Let's Encrypt.
ansible-galaxy install danvaida.letsencrypt