pull/50/head
Yoan Tournade 6 years ago
commit e079338ace
No known key found for this signature in database
GPG Key ID: C6A3FAA68AE36EB4
  1. 3
      .gitignore
  2. 36
      .travis.yml
  3. 16
      README.md
  4. 14
      defaults/main.yml
  5. 29
      molecule/default/molecule.yml
  6. 9
      molecule/default/playbook-source-install.yml
  7. 27
      molecule/default/playbook-standalone-nginx-aws.yml
  8. 9
      molecule/default/playbook.yml
  9. 0
      molecule/default/requirements.yml
  10. 14
      molecule/default/tests/test_default.py
  11. 6
      molecule/default/yaml-lint.yml
  12. 2
      tasks/install-from-source.yml
  13. 4
      tasks/test-cert-exists.yml
  14. 11
      tests/README.md
  15. 1
      vars/Ubuntu-16.04.yml

3
.gitignore vendored

@ -1,2 +1,3 @@
*.retry *.retry
tests/test.sh */__pycache__
*.pyc

@ -1,23 +1,33 @@
--- ---
language: python
services: docker services: docker
env: env:
- distro: centos7 global:
- distro: centos6 - ROLE_NAME: certbot
playbook: test-source-install.yml matrix:
- distro: ubuntu1604 - MOLECULE_DISTRO: centos7
- distro: ubuntu1404 - MOLECULE_DISTRO: centos6
playbook: test-source-install.yml MOLECULE_PLAYBOOK: playbook-source-install.yml
- distro: debian8 - MOLECULE_DISTRO: ubuntu1804
playbook: test-source-install.yml - MOLECULE_DISTRO: ubuntu1604
- MOLECULE_DISTRO: ubuntu1404
MOLECULE_PLAYBOOK: playbook-source-install.yml
- MOLECULE_DISTRO: debian9
script: install:
# Download test shim. # Install test dependencies.
- wget -O ${PWD}/tests/test.sh https://gist.githubusercontent.com/geerlingguy/73ef1e5ee45d8694570f334be385e181/raw/ - pip install molecule docker
- chmod +x ${PWD}/tests/test.sh
before_script:
# Use actual Ansible Galaxy role name for the project directory.
- cd ../
- mv ansible-role-$ROLE_NAME geerlingguy.$ROLE_NAME
- cd geerlingguy.$ROLE_NAME
script:
# Run tests. # Run tests.
- ${PWD}/tests/test.sh - molecule test
notifications: notifications:
webhooks: https://galaxy.ansible.com/api/v1/notifications/ webhooks: https://galaxy.ansible.com/api/v1/notifications/

@ -15,7 +15,7 @@ Generally, installing from source (see section `Source Installation from Git`) l
The variable `certbot_install_from_source` controls whether to install Certbot from Git or package management. The latter is the default, so the variable defaults to `no`. The variable `certbot_install_from_source` controls whether to install Certbot from Git or package management. The latter is the default, so the variable defaults to `no`.
certbot_auto_renew: true certbot_auto_renew: true
certbot_auto_renew_user: "{{ ansible_user }}" certbot_auto_renew_user: "{{ ansible_user | default(lookup('env', 'USER')) }}"
certbot_auto_renew_hour: 3 certbot_auto_renew_hour: 3
certbot_auto_renew_minute: 30 certbot_auto_renew_minute: 30
certbot_auto_renew_options: "--quiet --no-self-upgrade" certbot_auto_renew_options: "--quiet --no-self-upgrade"
@ -26,9 +26,9 @@ By default, this role configures a cron job to run under the provided user accou
Currently there is one built-in method for generating new certificates using this role: `standalone`. Other methods (e.g. using nginx or apache and a webroot) may be added in the future. Currently there is one built-in method for generating new certificates using this role: `standalone`. Other methods (e.g. using nginx or apache and a webroot) may be added in the future.
**For a complete example**: see the fully functional test playbook in [tests/test-standalone-nginx-aws.yml](tests/test-standalone-nginx-aws.yml). **For a complete example**: see the fully functional test playbook in [molecule/default/playbook-standalone-nginx-aws.yml](molecule/default/playbook-standalone-nginx-aws.yml).
certbot_create_if_missing: no certbot_create_if_missing: false
certbot_create_method: standalone certbot_create_method: standalone
Set `certbot_create_if_missing` to `yes` or `True` to let this role generate certs. Set the method used for generating certs with the `certbot_create_method` variable—current allowed values include: `standalone`. Set `certbot_create_if_missing` to `yes` or `True` to let this role generate certs. Set the method used for generating certs with the `certbot_create_method` variable—current allowed values include: `standalone`.
@ -64,10 +64,10 @@ These services will only be stopped the first time a new cert is generated.
You can install Certbot from it's Git source repository if desired. This might be useful in several cases, but especially when older distributions don't have Certbot packages available (e.g. CentOS < 7, Ubuntu < 16.10 and Debian < 8). You can install Certbot from it's Git source repository if desired. This might be useful in several cases, but especially when older distributions don't have Certbot packages available (e.g. CentOS < 7, Ubuntu < 16.10 and Debian < 8).
certbot_install_from_source: no certbot_install_from_source: false
certbot_repo: https://github.com/certbot/certbot.git certbot_repo: https://github.com/certbot/certbot.git
certbot_version: master certbot_version: master
certbot_keep_updated: yes certbot_keep_updated: true
Certbot Git repository options. To install from source, set `certbot_install_from_source` to `yes`. This clones the configured `certbot_repo`, respecting the `certbot_version` setting. If `certbot_keep_updated` is set to `yes`, the repository is updated every time this role runs. Certbot Git repository options. To install from source, set `certbot_install_from_source` to `yes`. This clones the configured `certbot_repo`, respecting the `certbot_version` setting. If `certbot_keep_updated` is set to `yes`, the repository is updated every time this role runs.
@ -75,6 +75,12 @@ Certbot Git repository options. To install from source, set `certbot_install_fro
The directory inside which Certbot will be cloned. The directory inside which Certbot will be cloned.
### Wildcard Certificates
Let's Encrypt supports [generating wildcard certificates](https://community.letsencrypt.org/t/acme-v2-and-wildcard-certificate-support-is-live/55579), but the process for generating and using them is slightly more involved. See comments in [this pull request](https://github.com/geerlingguy/ansible-role-certbot/pull/60#issuecomment-423919284) for an example of how to use this role to maintain wildcard certs.
Michael Porter also has a walkthrough of [Creating A Let’s Encrypt Wildcard Cert With Ansible](https://www.michaelpporter.com/2018/09/creating-a-wildcard-cert-with-ansible/), specifically with Cloudflare.
## Dependencies ## Dependencies
None. None.

@ -1,13 +1,13 @@
--- ---
# Certbot auto-renew cron job configuration (for certificate renewals). # Certbot auto-renew cron job configuration (for certificate renewals).
certbot_auto_renew: true certbot_auto_renew: true
certbot_auto_renew_user: "{{ ansible_user }}" certbot_auto_renew_user: "{{ ansible_user | default(lookup('env', 'USER')) }}"
certbot_auto_renew_hour: 3 certbot_auto_renew_hour: 3
certbot_auto_renew_minute: 30 certbot_auto_renew_minute: 30
certbot_auto_renew_options: "--quiet --no-self-upgrade" certbot_auto_renew_options: "--quiet --no-self-upgrade"
# Parameters used when creating new Certbot certs. # Parameters used when creating new Certbot certs.
certbot_create_if_missing: no certbot_create_if_missing: false
certbot_create_method: standalone certbot_create_method: standalone
certbot_admin_email: email@example.com certbot_admin_email: email@example.com
certbot_certs: [] certbot_certs: []
@ -17,7 +17,11 @@ certbot_certs: []
# - example2.com # - example2.com
# - domains: # - domains:
# - example3.com # - example3.com
certbot_create_command: "{{ certbot_script }} certonly --standalone --noninteractive --expand --agree-tos --email {{ cert_item.email | default(certbot_admin_email) }} -d {{ cert_item.domains | join(',') }}" certbot_create_command: >-
{{ certbot_script }} certonly --standalone --noninteractive --agree-tos
--expand --email {{ cert_item.email | default(certbot_admin_email) }}
-d {{ cert_item.domains | join(',') }}
certbot_create_standalone_stop_services: certbot_create_standalone_stop_services:
- nginx - nginx
# - apache # - apache
@ -25,10 +29,10 @@ certbot_create_standalone_stop_services:
# To install from source (on older OSes or if you need a specific or newer # To install from source (on older OSes or if you need a specific or newer
# version of Certbot), set this variable to `yes` and configure other options. # version of Certbot), set this variable to `yes` and configure other options.
certbot_install_from_source: no certbot_install_from_source: false
certbot_repo: https://github.com/certbot/certbot.git certbot_repo: https://github.com/certbot/certbot.git
certbot_version: master certbot_version: master
certbot_keep_updated: yes certbot_keep_updated: true
# Where to put Certbot when installing from source. # Where to put Certbot when installing from source.
certbot_dir: /opt/certbot certbot_dir: /opt/certbot

@ -0,0 +1,29 @@
---
dependency:
name: galaxy
driver:
name: docker
lint:
name: yamllint
options:
config-file: molecule/default/yaml-lint.yml
platforms:
- name: instance
image: "geerlingguy/docker-${MOLECULE_DISTRO:-centos7}-ansible:latest"
command: ${MOLECULE_DOCKER_COMMAND:-""}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
privileged: true
pre_build_image: true
provisioner:
name: ansible
lint:
name: ansible-lint
playbooks:
converge: ${MOLECULE_PLAYBOOK:-playbook.yml}
scenario:
name: default
verifier:
name: testinfra
lint:
name: flake8

@ -1,8 +1,11 @@
--- ---
- hosts: all - name: Converge
hosts: all
become: true
vars: vars:
certbot_install_from_source: yes certbot_install_from_source: true
certbot_auto_renew_user: root
pre_tasks: pre_tasks:
- name: Update apt cache. - name: Update apt cache.
@ -20,4 +23,4 @@
roles: roles:
- geerlingguy.git - geerlingguy.git
- role_under_test - geerlingguy.certbot

@ -9,7 +9,7 @@
# Play 1: Provision EC2 instance and A record. # Play 1: Provision EC2 instance and A record.
- hosts: localhost - hosts: localhost
connection: local connection: local
gather_facts: no gather_facts: false
tasks: tasks:
- name: Configure EC2 Security Group. - name: Configure EC2 Security Group.
@ -50,9 +50,10 @@
Name: "certbot-standalone-nginx-test" Name: "certbot-standalone-nginx-test"
group: ['default', 'certbot_test_http'] group: ['default', 'certbot_test_http']
instance_type: t2.micro instance_type: t2.micro
image: ami-02e98f78 # CentOS Linux 7 x86_64 HVM EBS # CentOS Linux 7 x86_64 HVM EBS
image: ami-02e98f78
region: "us-east-1" region: "us-east-1"
wait: yes wait: true
wait_timeout: 500 wait_timeout: 500
exact_count: 1 exact_count: 1
count_tag: count_tag:
@ -68,25 +69,25 @@
type: A type: A
ttl: 300 ttl: 300
value: "{{ created_instance.tagged_instances.0.public_ip }}" value: "{{ created_instance.tagged_instances.0.public_ip }}"
wait: yes wait: true
overwrite: yes overwrite: true
- name: Add EC2 instance to inventory groups. - name: Add EC2 instance to inventory groups.
add_host: add_host:
name: "certbot-test.servercheck.in" name: "certbot-test.servercheck.in"
groups: "aws,aws_nginx" groups: "aws,aws_nginx"
ansible_ssh_user: centos ansible_ssh_user: centos
host_key_checking: False host_key_checking: false
when: created_instance.tagged_instances.0.id is defined when: created_instance.tagged_instances.0.id is defined
# Play 2: Configure EC2 instance with Certbot and Nginx. # Play 2: Configure EC2 instance with Certbot and Nginx.
- hosts: aws_nginx - hosts: aws_nginx
gather_facts: yes gather_facts: true
become: yes become: true
vars: vars:
certbot_admin_email: https@servercheck.in certbot_admin_email: https@servercheck.in
certbot_create_if_missing: yes certbot_create_if_missing: true
certbot_create_standalone_stop_services: [] certbot_create_standalone_stop_services: []
certbot_certs: certbot_certs:
- domains: - domains:
@ -107,7 +108,7 @@
pre_tasks: pre_tasks:
- name: Update apt cache. - name: Update apt cache.
apt: update_cache=yes cache_valid_time=600 apt: update_cache=true cache_valid_time=600
when: ansible_os_family == 'Debian' when: ansible_os_family == 'Debian'
changed_when: false changed_when: false
@ -135,12 +136,12 @@
url: https://certbot-test.servercheck.in/ url: https://certbot-test.servercheck.in/
status_code: 200 status_code: 200
delegate_to: localhost delegate_to: localhost
become: no become: false
# Play 3: Tear down EC2 instance and A record. # Play 3: Tear down EC2 instance and A record.
- hosts: localhost - hosts: localhost
connection: local connection: local
gather_facts: no gather_facts: false
tasks: tasks:
- name: Destroy EC2 instance. - name: Destroy EC2 instance.
@ -149,7 +150,7 @@
instance_ids: ["{{ created_instance.tagged_instances.0.id }}"] instance_ids: ["{{ created_instance.tagged_instances.0.id }}"]
region: "us-east-1" region: "us-east-1"
state: absent state: absent
wait: yes wait: true
wait_timeout: 500 wait_timeout: 500
- name: Delete Security Group. - name: Delete Security Group.

@ -1,5 +1,10 @@
--- ---
- hosts: all - name: Converge
hosts: all
become: true
vars:
certbot_auto_renew_user: root
pre_tasks: pre_tasks:
- name: Update apt cache. - name: Update apt cache.
@ -19,4 +24,4 @@
when: ansible_os_family == 'Debian' when: ansible_os_family == 'Debian'
roles: roles:
- role_under_test - geerlingguy.certbot

@ -0,0 +1,14 @@
import os
import testinfra.utils.ansible_runner
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')
def test_hosts_file(host):
f = host.file('/etc/hosts')
assert f.exists
assert f.user == 'root'
assert f.group == 'root'

@ -0,0 +1,6 @@
---
extends: default
rules:
line-length:
max: 120
level: warning

@ -5,7 +5,7 @@
dest: "{{ certbot_dir }}" dest: "{{ certbot_dir }}"
version: "{{ certbot_version }}" version: "{{ certbot_version }}"
update: "{{ certbot_keep_updated }}" update: "{{ certbot_keep_updated }}"
force: yes force: true
- name: Set Certbot script variable. - name: Set Certbot script variable.
set_fact: set_fact:

@ -1,12 +1,12 @@
--- ---
- name: Check if certificate already exists. - name: Check if certificate already exists.
stat: stat:
path: /etc/letsencrypt/live/{{ cert_item.domains | first }}/cert.pem path: /etc/letsencrypt/live/{{ cert_item.domains | first | replace('*.', '') }}/cert.pem
register: letsencrypt_cert_exists register: letsencrypt_cert_exists
- name: Check if certificate domain list has changed. - name: Check if certificate domain list has changed.
lineinfile: lineinfile:
path: /etc/letsencrypt/domains-{{ cert_item.domains | first }}.json path: /etc/letsencrypt/domains-{{ cert_item.domains | first | replace('*.', '' }}.json
line: " {{ cert_item.domains | to_json }}" line: " {{ cert_item.domains | to_json }}"
state: present state: present
create: yes create: yes

@ -1,11 +0,0 @@
# Ansible Role tests
To run the test playbook(s) in this directory:
1. Install and start Docker.
1. Download the test shim (see .travis.yml file for the URL) into `tests/test.sh`:
- `wget -O tests/test.sh https://gist.githubusercontent.com/geerlingguy/73ef1e5ee45d8694570f334be385e181/raw/`
1. Make the test shim executable: `chmod +x tests/test.sh`.
1. Run (from the role root directory) `distro=[distro] playbook=[playbook] ./tests/test.sh`
If you don't want the container to be automatically deleted after the test playbook is run, add the following environment variables: `cleanup=false container_id=$(date +%s)`

@ -1 +1,2 @@
---
certbot_package: letsencrypt certbot_package: letsencrypt

Loading…
Cancel
Save