mirror of
https://github.com/geerlingguy/ansible-role-certbot.git
synced 2026-08-25 01:05:36 +02:00
Compare commits
103
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7d0e31b5b3 | ||
|
|
c6e6679d42 | ||
|
|
1e5a11fd99 | ||
|
|
7e659d14bc | ||
|
|
5ad5bd94bf | ||
|
|
84e0193e31 | ||
|
|
261cf7aac5 | ||
|
|
01a8ac6f90 | ||
|
|
1011113914 | ||
|
|
95afe409cc | ||
|
|
f8e02e1e83 | ||
|
|
d35de757e0 | ||
|
|
ef85f3e63d | ||
|
|
3b3cc546d1 | ||
|
|
1749d0ace0 | ||
|
|
d2e42ea198 | ||
|
|
d5a1f4df3c | ||
|
|
de02f52275 | ||
|
|
6ab7f2db23 | ||
|
|
32d18724a6 | ||
|
|
11ac393df5 | ||
|
|
1278651f0d | ||
|
|
3d2fbc6202 | ||
|
|
4f1179392e | ||
|
|
b3ae28fb77 | ||
|
|
943abd882d | ||
|
|
2fde934223 | ||
|
|
851d2b9855 | ||
|
|
2d3cf2ad13 | ||
|
|
999372cc7e | ||
|
|
811fa11044 | ||
|
|
e5bfeaf936 | ||
|
|
9045ec5a59 | ||
|
|
98ea3238ed | ||
|
|
06ca208bb6 | ||
|
|
49e18182a7 | ||
|
|
48941fe2a0 | ||
|
|
6230e82ba9 | ||
|
|
0b414a9d74 | ||
|
|
78f4cb5ad5 | ||
|
|
d1cbcde4de | ||
|
|
03f4cc3a99 | ||
|
|
63638f4471 | ||
|
|
4be771f12a | ||
|
|
de52a1f4c8 | ||
|
|
cb3b03f435 | ||
|
|
5a23e85f1c | ||
|
|
08543f45b2 | ||
|
|
84642924df | ||
|
|
cfd9655ed0 | ||
|
|
47203f3b92 | ||
|
|
a3b34ef499 | ||
|
|
199f940604 | ||
|
|
1b04270982 | ||
|
|
a056da763e | ||
|
|
2deba31679 | ||
|
|
d30ddd946a | ||
|
|
3d55be0a54 | ||
|
|
3f133ad7ab | ||
|
|
c6297ddebb | ||
|
|
3fcd4e0258 | ||
|
|
eb4647ed9c | ||
|
|
31beafb338 | ||
|
|
1fc3a76d34 | ||
|
|
dd1f8bd22c | ||
|
|
de4cb90984 | ||
|
|
955ec8b17e | ||
|
|
a9a3ef77a3 | ||
|
|
e35a5d0fb9 | ||
|
|
854a36e048 | ||
|
|
2cad2addcd | ||
|
|
52a96f9bde | ||
|
|
7a7c1f8b06 | ||
|
|
40c4c1b433 | ||
|
|
bd58f8e72c | ||
|
|
123facdbab | ||
|
|
e1013946c5 | ||
|
|
b37af73500 | ||
|
|
23447ec217 | ||
|
|
50d8921ec2 | ||
|
|
2e13cb13cf | ||
|
|
e669ab0ac4 | ||
|
|
ca46eab49f | ||
|
|
5f476f829c | ||
|
|
34949a63d9 | ||
|
|
061509319f | ||
|
|
c7e5eec8cc | ||
|
|
23f593aaaf | ||
|
|
027af9b3b3 | ||
|
|
7317dbcabe | ||
|
|
5cfcc2d316 | ||
|
|
aaf3dbd40a | ||
|
|
96051f08f4 | ||
|
|
6647174286 | ||
|
|
3f8533436b | ||
|
|
d1d517c5a4 | ||
|
|
7ad49929dd | ||
|
|
6bb2ed6436 | ||
|
|
515e8af98b | ||
|
|
b17976752c | ||
|
|
02e1e4e148 | ||
|
|
fdba1c4352 | ||
|
|
8164566c4f |
@@ -1,56 +0,0 @@
|
||||
# Configuration for probot-stale - https://github.com/probot/stale
|
||||
|
||||
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
||||
daysUntilStale: 90
|
||||
|
||||
# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
|
||||
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
|
||||
daysUntilClose: 30
|
||||
|
||||
# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)
|
||||
onlyLabels: []
|
||||
|
||||
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
|
||||
exemptLabels:
|
||||
- pinned
|
||||
- security
|
||||
- planned
|
||||
|
||||
# Set to true to ignore issues in a project (defaults to false)
|
||||
exemptProjects: false
|
||||
|
||||
# Set to true to ignore issues in a milestone (defaults to false)
|
||||
exemptMilestones: false
|
||||
|
||||
# Set to true to ignore issues with an assignee (defaults to false)
|
||||
exemptAssignees: false
|
||||
|
||||
# Label to use when marking as stale
|
||||
staleLabel: stale
|
||||
|
||||
# Limit the number of actions per hour, from 1-30. Default is 30
|
||||
limitPerRun: 30
|
||||
|
||||
pulls:
|
||||
markComment: |-
|
||||
This pull request has been marked 'stale' due to lack of recent activity. If there is no further activity, the PR will be closed in another 30 days. Thank you for your contribution!
|
||||
|
||||
Please read [this blog post](https://www.jeffgeerling.com/blog/2020/enabling-stale-issue-bot-on-my-github-repositories) to see the reasons why I mark pull requests as stale.
|
||||
|
||||
unmarkComment: >-
|
||||
This pull request is no longer marked for closure.
|
||||
|
||||
closeComment: >-
|
||||
This pull request has been closed due to inactivity. If you feel this is in error, please reopen the pull request or file a new PR with the relevant details.
|
||||
|
||||
issues:
|
||||
markComment: |-
|
||||
This issue has been marked 'stale' due to lack of recent activity. If there is no further activity, the issue will be closed in another 30 days. Thank you for your contribution!
|
||||
|
||||
Please read [this blog post](https://www.jeffgeerling.com/blog/2020/enabling-stale-issue-bot-on-my-github-repositories) to see the reasons why I mark issues as stale.
|
||||
|
||||
unmarkComment: >-
|
||||
This issue is no longer marked for closure.
|
||||
|
||||
closeComment: >-
|
||||
This issue has been closed due to inactivity. If you feel this is in error, please reopen the issue or file a new issue with the relevant details.
|
||||
+11
-17
@@ -19,14 +19,14 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out the codebase.
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: 'geerlingguy.certbot'
|
||||
|
||||
- name: Set up Python 3.
|
||||
uses: actions/setup-python@v2
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.x'
|
||||
python-version: '3.13' # Can't go to 3.14+ until Ansible 13.x
|
||||
|
||||
- name: Install test dependencies.
|
||||
run: pip3 install yamllint
|
||||
@@ -41,39 +41,33 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- distro: centos8
|
||||
- distro: rockylinux9
|
||||
playbook: converge.yml
|
||||
experimental: false
|
||||
- distro: centos7
|
||||
- distro: ubuntu2404
|
||||
playbook: converge.yml
|
||||
experimental: false
|
||||
- distro: ubuntu1804
|
||||
- distro: debian12
|
||||
playbook: converge.yml
|
||||
experimental: false
|
||||
- distro: debian10
|
||||
playbook: converge.yml
|
||||
experimental: false
|
||||
- distro: centos7
|
||||
playbook: playbook-source-install.yml
|
||||
experimental: false
|
||||
|
||||
- distro: centos7
|
||||
- distro: rockylinux9
|
||||
playbook: playbook-snap-install.yml
|
||||
experimental: true
|
||||
|
||||
steps:
|
||||
- name: Check out the codebase.
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: 'geerlingguy.certbot'
|
||||
|
||||
- name: Set up Python 3.
|
||||
uses: actions/setup-python@v2
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.x'
|
||||
python-version: '3.13' # Can't go to 3.14+ until Ansible 13.x
|
||||
|
||||
- name: Install test dependencies.
|
||||
run: pip3 install ansible molecule[docker] docker
|
||||
run: pip3 install ansible molecule molecule-plugins[docker] docker
|
||||
|
||||
- name: Run Molecule tests.
|
||||
run: molecule test
|
||||
|
||||
@@ -22,17 +22,19 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out the codebase.
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: 'geerlingguy.certbot'
|
||||
|
||||
- name: Set up Python 3.
|
||||
uses: actions/setup-python@v2
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.x'
|
||||
python-version: '3.13' # Can't go to 3.14+ until Ansible 13.x
|
||||
|
||||
- name: Install Ansible.
|
||||
run: pip3 install ansible-base
|
||||
run: pip3 install ansible-core
|
||||
|
||||
- name: Trigger a new import on Galaxy.
|
||||
run: ansible-galaxy role import --api-key ${{ secrets.GALAXY_API_KEY }} $(echo ${{ github.repository }} | cut -d/ -f1) $(echo ${{ github.repository }} | cut -d/ -f2)
|
||||
run: >-
|
||||
ansible-galaxy role import --api-key ${{ secrets.GALAXY_API_KEY }}
|
||||
$(echo ${{ github.repository }} | cut -d/ -f1) $(echo ${{ github.repository }} | cut -d/ -f2)
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
name: Close inactive issues
|
||||
'on':
|
||||
schedule:
|
||||
- cron: "55 12 * * 1" # semi-random time
|
||||
|
||||
jobs:
|
||||
close-issues:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@v8
|
||||
with:
|
||||
days-before-stale: 120
|
||||
days-before-close: 60
|
||||
exempt-issue-labels: bug,pinned,security,planned
|
||||
exempt-pr-labels: bug,pinned,security,planned
|
||||
stale-issue-label: "stale"
|
||||
stale-pr-label: "stale"
|
||||
stale-issue-message: |
|
||||
This issue has been marked 'stale' due to lack of recent activity. If there is no further activity, the issue will be closed in another 30 days. Thank you for your contribution!
|
||||
|
||||
Please read [this blog post](https://www.jeffgeerling.com/blog/2020/enabling-stale-issue-bot-on-my-github-repositories) to see the reasons why I mark issues as stale.
|
||||
close-issue-message: |
|
||||
This issue has been closed due to inactivity. If you feel this is in error, please reopen the issue or file a new issue with the relevant details.
|
||||
stale-pr-message: |
|
||||
This pr has been marked 'stale' due to lack of recent activity. If there is no further activity, the issue will be closed in another 30 days. Thank you for your contribution!
|
||||
|
||||
Please read [this blog post](https://www.jeffgeerling.com/blog/2020/enabling-stale-issue-bot-on-my-github-repositories) to see the reasons why I mark issues as stale.
|
||||
close-pr-message: |
|
||||
This pr has been closed due to inactivity. If you feel this is in error, please reopen the issue or file a new issue with the relevant details.
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -3,8 +3,11 @@ extends: default
|
||||
|
||||
rules:
|
||||
line-length:
|
||||
max: 120
|
||||
max: 180
|
||||
level: warning
|
||||
indentation:
|
||||
spaces: 2
|
||||
indent-sequences: consistent
|
||||
|
||||
ignore: |
|
||||
.github/stale.yml
|
||||
.github/workflows/stale.yml
|
||||
|
||||
@@ -1,39 +1,52 @@
|
||||
# Ansible Role: Certbot (for Let's Encrypt)
|
||||
|
||||
[](https://github.com/geerlingguy/ansible-role-certbot/actions?query=workflow%3ACI)
|
||||
[](https://github.com/geerlingguy/ansible-role-certbot/actions/workflows/ci.yml)
|
||||
|
||||
Installs and configures Certbot (for Let's Encrypt).
|
||||
|
||||
## Requirements
|
||||
|
||||
If installing from source, Git is required. You can install Git using the `geerlingguy.git` role.
|
||||
If installing from source (deprecated), Git is required. You can install Git using the `geerlingguy.git` role.
|
||||
|
||||
Generally, installing from source (see section `Source Installation from Git`) leads to a better experience using Certbot and Let's Encrypt, especially if you're using an older OS release.
|
||||
For the `pip` install method, only Debian-family targets are supported (apt is used for the `python3-venv` / `libaugeas-dev` / `gcc` prerequisites).
|
||||
|
||||
If you want an always-latest Certbot install on modern distros, prefer `pip` (see `Pip Installation` below) over `source` — the legacy source method relies on `certbot-auto`, which EFF removed from the Certbot repo in 2021.
|
||||
|
||||
## Role Variables
|
||||
|
||||
certbot_install_method: package
|
||||
|
||||
Controls how Certbot is installed. Available options are 'package', 'snap', and 'source'.
|
||||
Controls how Certbot is installed. Available options are 'package', 'snap', 'pip', and 'source' (deprecated).
|
||||
|
||||
certbot_auto_renew: true
|
||||
certbot_auto_renew_user: "{{ ansible_user | default(lookup('env', 'USER')) }}"
|
||||
certbot_auto_renew_hour: "3"
|
||||
certbot_auto_renew_minute: "30"
|
||||
certbot_auto_renew_options: "--quiet --no-self-upgrade"
|
||||
certbot_auto_renew_options: "--quiet"
|
||||
|
||||
By default, this role configures a cron job to run under the provided user account at the given hour and minute, every day. The defaults run `certbot renew` (or `certbot-auto renew`) via cron every day at 03:30:00 by the user you use in your Ansible playbook. It's preferred that you set a custom user/hour/minute so the renewal is during a low-traffic period and done by a non-root user account.
|
||||
|
||||
### Automatic Certificate Generation
|
||||
|
||||
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 the `standalone` and `webroot` method are supported for generating new certificates using this role.
|
||||
|
||||
**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: false
|
||||
|
||||
Set `certbot_create_if_missing` to `yes` or `True` to let this role generate certs.
|
||||
|
||||
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 the method used for generating certs with the `certbot_create_method` variable — current allowed values are: `standalone` or `webroot`.
|
||||
|
||||
certbot_testmode: false
|
||||
|
||||
Enable test mode to only run a test request without actually creating certificates.
|
||||
|
||||
certbot_hsts: false
|
||||
|
||||
Enable (HTTP Strict Transport Security) for the certificate generation.
|
||||
|
||||
certbot_admin_email: email@example.com
|
||||
|
||||
@@ -41,17 +54,18 @@ The email address used to agree to Let's Encrypt's TOS and subscribe to cert-rel
|
||||
|
||||
certbot_certs: []
|
||||
# - email: janedoe@example.com
|
||||
# webroot: "/var/www/html"
|
||||
# domains:
|
||||
# - example1.com
|
||||
# - example2.com
|
||||
# - domains:
|
||||
# - example3.com
|
||||
|
||||
A list of domains (and other data) for which certs should be generated. You can add an `email` key to any list item to override the `certbot_admin_email`.
|
||||
A list of domains (and other data) for which certs should be generated. You can add an `email` key to any list item to override the `certbot_admin_email`. When using the `webroot` creation method, a `webroot` item has to be provided, specifying which directory to use for the authentication. Make sure your webserver correctly delivers contents from this directory.
|
||||
|
||||
certbot_create_command: "{{ certbot_script }} certonly --standalone --noninteractive --agree-tos --email {{ cert_item.email | default(certbot_admin_email) }} -d {{ cert_item.domains | join(',') }}"
|
||||
|
||||
The `certbot_create_command` defines the command used to generate the cert.
|
||||
The `certbot_create_command` defines the command used to generate the cert. See the full default command inside `defaults/main.yml` for a full example—and you can easily add in extra arguments that are not in the default command with the `certbot_create_extra_args` variable.
|
||||
|
||||
#### Standalone Certificate Generation
|
||||
|
||||
@@ -70,7 +84,33 @@ Setting `certbot_install_method: snap` configures this role to install Certbot v
|
||||
|
||||
This install method is currently experimental and may or may not work across all Linux distributions.
|
||||
|
||||
### Source Installation from Git
|
||||
#### Webroot Certificate Generation
|
||||
|
||||
When using the `webroot` creation method, a `webroot` item has to be provided for every `certbot_certs` item, specifying which directory to use for the authentication. Also, make sure your webserver correctly delivers contents from this directory.
|
||||
|
||||
### Pip Installation
|
||||
|
||||
Setting `certbot_install_method: pip` installs Certbot into a Python virtual environment at `{{ certbot_dir }}` (default `/opt/certbot`) using EFF's recommended pip install path: <https://certbot.eff.org/instructions?os=pip>. The `certbot` binary is symlinked into `/usr/local/bin` so it is on `PATH`.
|
||||
|
||||
This is the modern equivalent of the legacy `source` install — use it when you want an always-latest Certbot on a distro whose packaged version is too old. Only Debian-family targets are supported by the included tasks; the necessary apt prerequisites (`python3-venv`, `libaugeas-dev`, `gcc`, etc.) are installed automatically.
|
||||
|
||||
If `certbot_keep_updated: true` (the default), each role run will upgrade Certbot to the latest version on PyPI.
|
||||
|
||||
certbot_dir: /opt/certbot
|
||||
|
||||
The directory used as the venv root for the `pip` install (and the clone target for the legacy `source` install).
|
||||
|
||||
certbot_pip_extra_packages: []
|
||||
|
||||
Extra pip packages installed alongside Certbot in the same venv when using the `pip` install method. Use this for plugins, e.g.:
|
||||
|
||||
certbot_pip_extra_packages:
|
||||
- certbot-dns-rfc2136
|
||||
- certbot-dns-cloudflare
|
||||
|
||||
### Source Installation from Git (deprecated)
|
||||
|
||||
> **Deprecated.** EFF removed the `certbot-auto` shim from the Certbot repo in 2021, so this install path no longer produces a working `certbot` binary. Use `certbot_install_method: pip` for the modern equivalent.
|
||||
|
||||
You can install Certbot from it's Git source repository if desired with `certbot_install_method: source`. 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).
|
||||
|
||||
@@ -80,10 +120,6 @@ You can install Certbot from it's Git source repository if desired with `certbot
|
||||
|
||||
Certbot Git repository options. If installing from source, the configured `certbot_repo` is cloned, respecting the `certbot_version` setting. If `certbot_keep_updated` is set to `yes`, the repository is updated every time this role runs.
|
||||
|
||||
certbot_dir: /opt/certbot
|
||||
|
||||
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.
|
||||
|
||||
+47
-6
@@ -4,36 +4,77 @@ certbot_auto_renew: true
|
||||
certbot_auto_renew_user: "{{ ansible_user | default(lookup('env', 'USER')) }}"
|
||||
certbot_auto_renew_hour: "3"
|
||||
certbot_auto_renew_minute: "30"
|
||||
certbot_auto_renew_options: "--quiet --no-self-upgrade"
|
||||
certbot_auto_renew_options: "--quiet"
|
||||
|
||||
certbot_testmode: false
|
||||
certbot_hsts: false
|
||||
|
||||
|
||||
# Parameters used when creating new Certbot certs.
|
||||
certbot_create_if_missing: false
|
||||
certbot_create_method: standalone
|
||||
certbot_create_extra_args: ""
|
||||
certbot_admin_email: email@example.com
|
||||
certbot_expand: false
|
||||
|
||||
# Default webroot, overwritten by individual per-cert webroot directories
|
||||
certbot_webroot: /var/www/letsencrypt
|
||||
|
||||
certbot_certs: []
|
||||
# - email: janedoe@example.com
|
||||
# - name: example.com
|
||||
# email: janedoe@example.com
|
||||
# webroot: "/var/www/html/"
|
||||
# domains:
|
||||
# - example1.com
|
||||
# - example2.com
|
||||
# - domains:
|
||||
# - example3.com
|
||||
|
||||
certbot_create_command: >-
|
||||
{{ certbot_script }} certonly --standalone --noninteractive --agree-tos
|
||||
{{ certbot_script }} certonly --{{ certbot_create_method }}
|
||||
{{ '--hsts' if certbot_hsts else '' }}
|
||||
{{ '--test-cert' if certbot_testmode else '' }}
|
||||
--noninteractive --agree-tos
|
||||
--email {{ cert_item.email | default(certbot_admin_email) }}
|
||||
{{ '--expand' if certbot_expand else '' }}
|
||||
{{ '--webroot-path ' if certbot_create_method == 'webroot' else '' }}
|
||||
{{ cert_item.webroot | default(certbot_webroot) if certbot_create_method == 'webroot' else '' }}
|
||||
{{ certbot_create_extra_args }}
|
||||
--cert-name {{ cert_item_name }}
|
||||
-d {{ cert_item.domains | join(',') }}
|
||||
{{ '--expand' if certbot_expand else '' }}
|
||||
{{ '--pre-hook /etc/letsencrypt/renewal-hooks/pre/stop_services'
|
||||
if certbot_create_standalone_stop_services and certbot_create_method == 'standalone'
|
||||
else '' }}
|
||||
{{ '--post-hook /etc/letsencrypt/renewal-hooks/post/start_services'
|
||||
if certbot_create_standalone_stop_services and certbot_create_method == 'standalone'
|
||||
else '' }}
|
||||
{{ "--deploy-hook '" ~ cert_item.deploy_hook ~ "'"
|
||||
if 'deploy_hook' in cert_item
|
||||
else '' }}
|
||||
|
||||
certbot_create_standalone_stop_services:
|
||||
- nginx
|
||||
# - apache
|
||||
# - varnish
|
||||
|
||||
# Available options: 'package', 'snap', 'source'.
|
||||
# Available options: 'package', 'snap', 'source', 'pip'.
|
||||
# Note: 'source' is deprecated — it relies on certbot-auto, which EFF removed
|
||||
# from the certbot repo in 2021. Use 'pip' for the equivalent always-latest
|
||||
# install (creates a venv at {{ certbot_dir }} and pip-installs certbot).
|
||||
certbot_install_method: 'package'
|
||||
|
||||
# Source install configuration.
|
||||
# Source / pip install configuration.
|
||||
certbot_repo: https://github.com/certbot/certbot.git
|
||||
certbot_version: master
|
||||
certbot_keep_updated: true
|
||||
|
||||
# Where to put Certbot when installing from source.
|
||||
# Where to put Certbot when installing from source or pip (venv root for pip).
|
||||
certbot_dir: /opt/certbot
|
||||
|
||||
# Extra pip packages installed alongside certbot in the same venv (pip method only).
|
||||
# Use this for plugins, e.g.:
|
||||
# certbot_pip_extra_packages:
|
||||
# - certbot-dns-rfc2136
|
||||
# - certbot-dns-cloudflare
|
||||
certbot_pip_extra_packages: []
|
||||
|
||||
+1
-5
@@ -7,12 +7,8 @@ galaxy_info:
|
||||
description: "Installs and configures Certbot (for Let's Encrypt)."
|
||||
company: "Midwestern Mac, LLC"
|
||||
license: "license (BSD, MIT)"
|
||||
min_ansible_version: 2.4
|
||||
min_ansible_version: 2.10
|
||||
platforms:
|
||||
- name: EL
|
||||
versions:
|
||||
- 7
|
||||
- 8
|
||||
- name: Fedora
|
||||
versions:
|
||||
- all
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
- name: Converge
|
||||
hosts: all
|
||||
become: true
|
||||
# become: true
|
||||
|
||||
vars:
|
||||
certbot_auto_renew_user: root
|
||||
@@ -9,7 +9,7 @@
|
||||
pre_tasks:
|
||||
- name: Update apt cache.
|
||||
apt: update_cache=yes cache_valid_time=600
|
||||
when: ansible_os_family == 'Debian'
|
||||
when: ansible_facts.os_family == 'Debian'
|
||||
changed_when: false
|
||||
|
||||
- name: Install dependencies (RedHat).
|
||||
@@ -18,11 +18,11 @@
|
||||
- cronie
|
||||
- epel-release
|
||||
state: present
|
||||
when: ansible_os_family == 'RedHat'
|
||||
when: ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- name: Install cron (Debian).
|
||||
apt: name=cron state=present
|
||||
when: ansible_os_family == 'Debian'
|
||||
when: ansible_facts.os_family == 'Debian'
|
||||
|
||||
roles:
|
||||
- geerlingguy.certbot
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
---
|
||||
role_name_check: 1
|
||||
dependency:
|
||||
name: galaxy
|
||||
options:
|
||||
ignore-errors: true
|
||||
driver:
|
||||
name: docker
|
||||
platforms:
|
||||
- name: instance
|
||||
image: "geerlingguy/docker-${MOLECULE_DISTRO:-centos7}-ansible:latest"
|
||||
image: "geerlingguy/docker-${MOLECULE_DISTRO:-rockylinux9}-ansible:latest"
|
||||
command: ${MOLECULE_DOCKER_COMMAND:-""}
|
||||
volumes:
|
||||
- /sys/fs/cgroup:/sys/fs/cgroup:ro
|
||||
- /sys/fs/cgroup:/sys/fs/cgroup:rw
|
||||
cgroupns_mode: host
|
||||
privileged: true
|
||||
pre_build_image: true
|
||||
provisioner:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
- name: Converge
|
||||
hosts: all
|
||||
become: true
|
||||
#become: true
|
||||
|
||||
vars:
|
||||
certbot_install_method: 'snap'
|
||||
@@ -10,16 +10,16 @@
|
||||
pre_tasks:
|
||||
- name: Update apt cache.
|
||||
apt: update_cache=yes cache_valid_time=600
|
||||
when: ansible_os_family == 'Debian'
|
||||
when: ansible_facts.os_family == 'Debian'
|
||||
changed_when: false
|
||||
|
||||
- name: Install cron (RedHat).
|
||||
yum: name=cronie state=present
|
||||
when: ansible_os_family == 'RedHat'
|
||||
when: ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- name: Install cron (Debian).
|
||||
apt: name=cron state=present
|
||||
when: ansible_os_family == 'Debian'
|
||||
when: ansible_facts.os_family == 'Debian'
|
||||
|
||||
roles:
|
||||
- geerlingguy.git
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
- name: Converge
|
||||
hosts: all
|
||||
become: true
|
||||
#become: true
|
||||
|
||||
vars:
|
||||
certbot_install_method: 'source'
|
||||
@@ -10,16 +10,16 @@
|
||||
pre_tasks:
|
||||
- name: Update apt cache.
|
||||
apt: update_cache=yes cache_valid_time=600
|
||||
when: ansible_os_family == 'Debian'
|
||||
when: ansible_facts.os_family == 'Debian'
|
||||
changed_when: false
|
||||
|
||||
- name: Install cron (RedHat).
|
||||
yum: name=cronie state=present
|
||||
when: ansible_os_family == 'RedHat'
|
||||
when: ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- name: Install cron (Debian).
|
||||
apt: name=cron state=present
|
||||
when: ansible_os_family == 'Debian'
|
||||
when: ansible_facts.os_family == 'Debian'
|
||||
|
||||
roles:
|
||||
- geerlingguy.git
|
||||
|
||||
@@ -91,7 +91,8 @@
|
||||
certbot_create_if_missing: true
|
||||
certbot_create_standalone_stop_services: []
|
||||
certbot_certs:
|
||||
- domains:
|
||||
- name: certbot-test.servercheck.in
|
||||
domains:
|
||||
- certbot-test.servercheck.in
|
||||
nginx_vhosts:
|
||||
- listen: "443 ssl http2"
|
||||
@@ -110,19 +111,19 @@
|
||||
pre_tasks:
|
||||
- name: Update apt cache.
|
||||
apt: update_cache=true cache_valid_time=600
|
||||
when: ansible_os_family == 'Debian'
|
||||
when: ansible_facts.os_family == 'Debian'
|
||||
changed_when: false
|
||||
|
||||
- name: Install dependencies (RedHat).
|
||||
yum: name={{ item }} state=present
|
||||
when: ansible_os_family == 'RedHat'
|
||||
when: ansible_facts.os_family == 'RedHat'
|
||||
with_items:
|
||||
- cronie
|
||||
- epel-release
|
||||
|
||||
- name: Install cron (Debian).
|
||||
apt: name=cron state=present
|
||||
when: ansible_os_family == 'Debian'
|
||||
when: ansible_facts.os_family == 'Debian'
|
||||
|
||||
roles:
|
||||
- geerlingguy.certbot
|
||||
|
||||
@@ -1,23 +1,63 @@
|
||||
---
|
||||
- name: Determine certificate name
|
||||
set_fact:
|
||||
cert_item_name: "{{ cert_item.name | default(cert_item.domains | first | replace('*.', '')) }}"
|
||||
|
||||
- name: Check if certificate already exists.
|
||||
stat:
|
||||
path: /etc/letsencrypt/live/{{ cert_item.domains | first | replace('*.', '') }}/cert.pem
|
||||
path: /etc/letsencrypt/live/{{ cert_item_name }}/cert.pem
|
||||
register: letsencrypt_cert
|
||||
|
||||
- name: Stop services to allow certbot to generate a cert.
|
||||
service:
|
||||
name: "{{ item }}"
|
||||
state: stopped
|
||||
when: not letsencrypt_cert.stat.exists
|
||||
with_items: "{{ certbot_create_standalone_stop_services }}"
|
||||
- name: Ensure pre and post hook folders exist.
|
||||
file:
|
||||
path: /etc/letsencrypt/renewal-hooks/{{ item }}
|
||||
state: directory
|
||||
mode: 0755
|
||||
owner: root
|
||||
group: root
|
||||
with_items:
|
||||
- pre
|
||||
- post
|
||||
|
||||
- name: Create pre hook to stop services.
|
||||
template:
|
||||
src: stop_services.j2
|
||||
dest: /etc/letsencrypt/renewal-hooks/pre/stop_services
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0750
|
||||
when:
|
||||
- certbot_create_standalone_stop_services is defined
|
||||
- certbot_create_standalone_stop_services is truthy
|
||||
|
||||
- name: Create post hook to start services.
|
||||
template:
|
||||
src: start_services.j2
|
||||
dest: /etc/letsencrypt/renewal-hooks/post/start_services
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0750
|
||||
when:
|
||||
- certbot_create_standalone_stop_services is defined
|
||||
- certbot_create_standalone_stop_services is truthy
|
||||
|
||||
- name: Check if domains have changed
|
||||
block:
|
||||
- name: Register certificate domains
|
||||
shell: "{{ certbot_script }} certificates --cert-name {{ cert_item_name }} | grep -E '(Domains|Identifiers)' | cut -d':' -f2"
|
||||
changed_when: false
|
||||
register: letsencrypt_cert_domains_dirty
|
||||
|
||||
- name: Cleanup domain list
|
||||
set_fact:
|
||||
letsencrypt_cert_domains: "{{ letsencrypt_cert_domains_dirty.stdout | trim | split(' ') | map('trim') | select('!=', '') | list | sort }}"
|
||||
|
||||
- name: Determine if domains have changed
|
||||
set_fact:
|
||||
letsencrypt_cert_domains_changed: "{{ letsencrypt_cert_domains != (cert_item.domains | map('trim') | select('!=', '') | list | sort) }}"
|
||||
|
||||
when: letsencrypt_cert.stat.exists
|
||||
|
||||
- name: Generate new certificate if one doesn't exist.
|
||||
command: "{{ certbot_create_command }}"
|
||||
when: not letsencrypt_cert.stat.exists
|
||||
|
||||
- name: Start services after cert has been generated.
|
||||
service:
|
||||
name: "{{ item }}"
|
||||
state: started
|
||||
when: not letsencrypt_cert.stat.exists
|
||||
with_items: "{{ certbot_create_standalone_stop_services }}"
|
||||
when: not letsencrypt_cert.stat.exists or letsencrypt_cert_domains_changed | default(false)
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
---
|
||||
- name: Determine certificate name
|
||||
set_fact:
|
||||
cert_item_name: "{{ cert_item.name | default(cert_item.domains | first | replace('*.', '')) }}"
|
||||
|
||||
- name: Check if certificate already exists.
|
||||
stat:
|
||||
path: /etc/letsencrypt/live/{{ cert_item_name }}/cert.pem
|
||||
register: letsencrypt_cert
|
||||
|
||||
- name: Create webroot directory if it doesn't exist yet
|
||||
file:
|
||||
path: "{{ cert_item.webroot | default(certbot_webroot) }}"
|
||||
state: directory
|
||||
|
||||
- name: Check if domains have changed
|
||||
block:
|
||||
- name: Register certificate domains
|
||||
shell: "{{ certbot_script }} certificates --cert-name {{ cert_item_name }} | grep -E '(Domains|Identifiers)' | cut -d':' -f2"
|
||||
changed_when: false
|
||||
register: letsencrypt_cert_domains_dirty
|
||||
|
||||
- name: Cleanup domain list
|
||||
set_fact:
|
||||
letsencrypt_cert_domains: "{{ letsencrypt_cert_domains_dirty.stdout | trim | split(' ') | map('trim') | select('!=', '') | list | sort }}"
|
||||
|
||||
- name: Determine if domains have changed
|
||||
set_fact:
|
||||
letsencrypt_cert_domains_changed: "{{ letsencrypt_cert_domains != (cert_item.domains | map('trim') | select('!=', '') | list | sort) }}"
|
||||
|
||||
when: letsencrypt_cert.stat.exists
|
||||
|
||||
- name: Generate new certificate if one doesn't exist.
|
||||
command: "{{ certbot_create_command }}"
|
||||
when: not letsencrypt_cert.stat.exists or letsencrypt_cert_domains_changed | default(false)
|
||||
@@ -2,7 +2,7 @@
|
||||
- name: Load a variable file based on the OS type, or a default if not found.
|
||||
include_vars: "{{ item }}"
|
||||
with_first_found:
|
||||
- "{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml"
|
||||
- "{{ ansible_distribution }}.yml"
|
||||
- "{{ ansible_os_family }}.yml"
|
||||
- "{{ ansible_facts.distribution }}-{{ ansible_facts.distribution_version }}.yml"
|
||||
- "{{ ansible_facts.distribution }}.yml"
|
||||
- "{{ ansible_facts.os_family }}.yml"
|
||||
- "default.yml"
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
---
|
||||
- name: Install Certbot.
|
||||
package: "name={{ certbot_package }} state=present"
|
||||
package:
|
||||
name: "{{ certbot_package }}"
|
||||
state: present
|
||||
|
||||
- name: Set Certbot script variable.
|
||||
set_fact:
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
---
|
||||
# Pip-in-venv install — EFF's recommended path now that certbot-auto is gone.
|
||||
# https://certbot.eff.org/instructions?os=pip
|
||||
# Debian-family only; RedHat goes through setup-RedHat.yml + package install.
|
||||
|
||||
- name: Install certbot pip prerequisites.
|
||||
ansible.builtin.apt:
|
||||
name:
|
||||
- python3
|
||||
- python3-dev
|
||||
- python3-venv
|
||||
- libaugeas-dev
|
||||
- gcc
|
||||
state: present
|
||||
update_cache: true
|
||||
cache_valid_time: 3600
|
||||
|
||||
- name: Install certbot in a venv via pip.
|
||||
ansible.builtin.pip:
|
||||
name: certbot
|
||||
state: "{{ 'latest' if certbot_keep_updated else 'present' }}"
|
||||
virtualenv: "{{ certbot_dir }}"
|
||||
virtualenv_command: python3 -m venv
|
||||
|
||||
- name: Install certbot pip plugins.
|
||||
ansible.builtin.pip:
|
||||
name: "{{ certbot_pip_extra_packages }}"
|
||||
state: "{{ 'latest' if certbot_keep_updated else 'present' }}"
|
||||
virtualenv: "{{ certbot_dir }}"
|
||||
when: certbot_pip_extra_packages | length > 0
|
||||
|
||||
- name: Symlink certbot binary onto PATH.
|
||||
ansible.builtin.file:
|
||||
src: "{{ certbot_dir }}/bin/certbot"
|
||||
dest: /usr/local/bin/certbot
|
||||
state: link
|
||||
|
||||
- name: Set Certbot script variable.
|
||||
ansible.builtin.set_fact:
|
||||
certbot_script: "{{ certbot_dir }}/bin/certbot"
|
||||
@@ -16,6 +16,7 @@
|
||||
src: /var/lib/snapd/snap
|
||||
dest: /snap
|
||||
state: link
|
||||
when: ansible_facts.os_family != "Debian"
|
||||
|
||||
- name: Update snap after install.
|
||||
shell: snap install core; snap refresh core
|
||||
@@ -33,6 +34,7 @@
|
||||
src: /snap/bin/certbot
|
||||
dest: /usr/bin/certbot
|
||||
state: link
|
||||
ignore_errors: "{{ ansible_check_mode }}"
|
||||
|
||||
- name: Set Certbot script variable.
|
||||
set_fact:
|
||||
|
||||
+12
-1
@@ -2,7 +2,7 @@
|
||||
- import_tasks: include-vars.yml
|
||||
|
||||
- import_tasks: setup-RedHat.yml
|
||||
when: ansible_os_family == 'RedHat'
|
||||
when: ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- import_tasks: install-with-package.yml
|
||||
when: certbot_install_method == 'package'
|
||||
@@ -13,6 +13,9 @@
|
||||
- import_tasks: install-from-source.yml
|
||||
when: certbot_install_method == 'source'
|
||||
|
||||
- import_tasks: install-with-pip.yml
|
||||
when: certbot_install_method == 'pip'
|
||||
|
||||
- include_tasks: create-cert-standalone.yml
|
||||
with_items: "{{ certbot_certs }}"
|
||||
when:
|
||||
@@ -21,5 +24,13 @@
|
||||
loop_control:
|
||||
loop_var: cert_item
|
||||
|
||||
- include_tasks: create-cert-webroot.yml
|
||||
with_items: "{{ certbot_certs }}"
|
||||
when:
|
||||
- certbot_create_if_missing
|
||||
- certbot_create_method == 'webroot'
|
||||
loop_control:
|
||||
loop_var: cert_item
|
||||
|
||||
- import_tasks: renew-cron.yml
|
||||
when: certbot_auto_renew
|
||||
|
||||
+9
-17
@@ -1,20 +1,12 @@
|
||||
---
|
||||
# See: https://github.com/geerlingguy/ansible-role-certbot/issues/107
|
||||
- block:
|
||||
- name: Ensure dnf-plugins are installed on Rocky/AlmaLinux.
|
||||
yum:
|
||||
name: dnf-plugins-core
|
||||
state: present
|
||||
|
||||
- name: Ensure dnf-plugins are installed on CentOS 8+.
|
||||
yum:
|
||||
name: dnf-plugins-core
|
||||
state: present
|
||||
|
||||
- name: Enable DNF module for CentOS 8+.
|
||||
shell: |
|
||||
dnf config-manager --set-enabled powertools
|
||||
args:
|
||||
warn: false
|
||||
register: dnf_module_enable
|
||||
changed_when: false
|
||||
|
||||
when:
|
||||
- ansible_distribution == 'CentOS'
|
||||
- ansible_distribution_major_version | int >= 8
|
||||
- name: Enable DNF module for Rocky/AlmaLinux.
|
||||
shell: |
|
||||
dnf config-manager --set-enabled crb
|
||||
changed_when: false
|
||||
when: ansible_distribution != 'Fedora'
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
# {{ ansible_managed }}
|
||||
|
||||
{% for item in certbot_create_standalone_stop_services %}
|
||||
echo "starting service {{ item }}"
|
||||
{% if ansible_facts.service_mgr == 'systemd' %}
|
||||
systemctl start {{ item }}
|
||||
{% elif ansible_facts.service_mgr == 'upstart' %}
|
||||
initctl start {{ item }}
|
||||
{% elif ansible_facts.service_mgr == 'openrc' %}
|
||||
rc-service {{ item }} start
|
||||
{% else %}
|
||||
service {{ item }} start
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
@@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
# {{ ansible_managed }}
|
||||
|
||||
{% for item in certbot_create_standalone_stop_services %}
|
||||
echo "stopping service {{ item }}"
|
||||
{% if ansible_facts.service_mgr == 'systemd' %}
|
||||
systemctl stop {{ item }}
|
||||
{% elif ansible_facts.service_mgr == 'upstart' %}
|
||||
initctl stop {{ item }}
|
||||
{% elif ansible_facts.service_mgr == 'openrc' %}
|
||||
rc-service {{ item }} stop
|
||||
{% else %}
|
||||
service {{ item }} stop
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
Reference in New Issue
Block a user