Initial commit
This commit is contained in:
commit
8eff0a45fc
12 changed files with 317 additions and 0 deletions
29
.travis.yml
Normal file
29
.travis.yml
Normal file
|
@ -0,0 +1,29 @@
|
|||
---
|
||||
language: python
|
||||
python: "2.7"
|
||||
|
||||
# Use the new container infrastructure
|
||||
sudo: false
|
||||
|
||||
# Install ansible
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- python-pip
|
||||
|
||||
install:
|
||||
# Install ansible
|
||||
- pip install ansible
|
||||
|
||||
# Check ansible version
|
||||
- ansible --version
|
||||
|
||||
# Create ansible.cfg with correct roles_path
|
||||
- printf '[defaults]\nroles_path=../' >ansible.cfg
|
||||
|
||||
script:
|
||||
# Basic role syntax check
|
||||
- ansible-playbook tests/test.yml -i tests/inventory --syntax-check
|
||||
|
||||
notifications:
|
||||
webhooks: https://galaxy.ansible.com/api/v1/notifications/
|
19
LICENSE
Normal file
19
LICENSE
Normal file
|
@ -0,0 +1,19 @@
|
|||
MIT License Copyright (c) 2020 Jan Beilicke <dev@jotbe.io>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
||||
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
42
README.md
Normal file
42
README.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
Traefik (Docker-Compose)
|
||||
========================
|
||||
|
||||
Traefik acts as a reverse proxy and loadbalancer in container environments. It will handle Let's Encrypt certificates for Docker Compose services automatically.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
- Ubuntu or Debian server
|
||||
- [Docker Engine](https://docs.docker.com/install/) + [Docker Compose](https://docs.docker.com/compose/install/)
|
||||
|
||||
Role Variables
|
||||
--------------
|
||||
|
||||
```
|
||||
traefik_virtual_host: localhost
|
||||
traefik:
|
||||
expose_internally: True
|
||||
expose_externally: False
|
||||
use_acme_staging: True
|
||||
dns_challenge_provider: False
|
||||
# NOT WORKING YET!
|
||||
# Extra mapping, for name -> internal address, like myservice: 'http://otherhost:12345'
|
||||
#extra_mapping:
|
||||
# myservice: http://otherhost:12345
|
||||
# use key:value pairs here to add additional environment variables to your traefik docker image.
|
||||
# for instance, if you're using a dns challenge provider place your api keys etc here.
|
||||
#additional_env_vars:
|
||||
# # DUMMY_KEY: DUMMY_VALUE
|
||||
# CLOUDFLARE_EMAIL: EMAIL
|
||||
# CLOUDFLARE_API_KEY: API_KEY
|
||||
```
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
MIT
|
||||
|
||||
Author Information
|
||||
------------------
|
||||
|
||||
An optional section for the role authors to include contact information, or a website (HTML is not allowed).
|
18
defaults/main.yml
Normal file
18
defaults/main.yml
Normal file
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
# defaults file for traefik
|
||||
traefik_virtual_host: localhost
|
||||
traefik:
|
||||
expose_internally: True
|
||||
expose_externally: False
|
||||
use_acme_staging: True
|
||||
dns_challenge_provider: False
|
||||
# NOT WORKING YET!
|
||||
# Extra mapping, for name -> internal address, like myservice: 'http://otherhost:12345'
|
||||
#extra_mapping:
|
||||
# myservice: http://otherhost:12345
|
||||
# use key:value pairs here to add additional environment variables to your traefik docker image.
|
||||
# for instance, if you're using a dns challenge provider place your api keys etc here.
|
||||
#additional_env_vars:
|
||||
# # DUMMY_KEY: DUMMY_VALUE
|
||||
# CLOUDFLARE_EMAIL: EMAIL
|
||||
# CLOUDFLARE_API_KEY: API_KEY
|
2
handlers/main.yml
Normal file
2
handlers/main.yml
Normal file
|
@ -0,0 +1,2 @@
|
|||
---
|
||||
# handlers file for traefik
|
53
meta/main.yml
Normal file
53
meta/main.yml
Normal file
|
@ -0,0 +1,53 @@
|
|||
galaxy_info:
|
||||
author: your name
|
||||
description: your role description
|
||||
company: your company (optional)
|
||||
|
||||
# If the issue tracker for your role is not on github, uncomment the
|
||||
# next line and provide a value
|
||||
# issue_tracker_url: http://example.com/issue/tracker
|
||||
|
||||
# Choose a valid license ID from https://spdx.org - some suggested licenses:
|
||||
# - BSD-3-Clause (default)
|
||||
# - MIT
|
||||
# - GPL-2.0-or-later
|
||||
# - GPL-3.0-only
|
||||
# - Apache-2.0
|
||||
# - CC-BY-4.0
|
||||
license: license (GPL-2.0-or-later, MIT, etc)
|
||||
|
||||
min_ansible_version: 2.9
|
||||
|
||||
# If this a Container Enabled role, provide the minimum Ansible Container version.
|
||||
# min_ansible_container_version:
|
||||
|
||||
#
|
||||
# Provide a list of supported platforms, and for each platform a list of versions.
|
||||
# If you don't wish to enumerate all versions for a particular platform, use 'all'.
|
||||
# To view available platforms and versions (or releases), visit:
|
||||
# https://galaxy.ansible.com/api/v1/platforms/
|
||||
#
|
||||
# platforms:
|
||||
# - name: Fedora
|
||||
# versions:
|
||||
# - all
|
||||
# - 25
|
||||
# - name: SomePlatform
|
||||
# versions:
|
||||
# - all
|
||||
# - 1.0
|
||||
# - 7
|
||||
# - 99.99
|
||||
|
||||
galaxy_tags: []
|
||||
# List tags for your role here, one per line. A tag is a keyword that describes
|
||||
# and categorizes the role. Users find roles by searching for tags. Be sure to
|
||||
# remove the '[]' above, if you add tags to this list.
|
||||
#
|
||||
# NOTE: A tag is limited to a single word comprised of alphanumeric characters.
|
||||
# Maximum 20 tags per role.
|
||||
|
||||
dependencies: []
|
||||
# List your role dependencies here, one per line. Be sure to remove the '[]' above,
|
||||
# if you add dependencies to this list.
|
||||
|
59
tasks/main.yml
Normal file
59
tasks/main.yml
Normal file
|
@ -0,0 +1,59 @@
|
|||
---
|
||||
# tasks file for traefik
|
||||
|
||||
- name: Ensure traefik config directory exists
|
||||
file:
|
||||
path: /home/{{ docker_user }}/traefik
|
||||
state: directory
|
||||
owner: '{{ docker_user }}'
|
||||
group: '{{ docker_user }}'
|
||||
tags: config
|
||||
|
||||
- name: Provide docker-compose.yml
|
||||
template:
|
||||
src: templates/docker-compose.traefik.yml.j2
|
||||
dest: /home/{{ docker_user }}/traefik/docker-compose.yml
|
||||
owner: "{{ docker_user }}"
|
||||
group: "{{ docker_user }}"
|
||||
mode: '0644'
|
||||
tags: config
|
||||
|
||||
- name: Provide traefik.toml
|
||||
template:
|
||||
src: templates/traefik.toml.j2
|
||||
dest: /home/{{ docker_user }}/traefik/traefik.toml
|
||||
owner: "{{ docker_user }}"
|
||||
group: "{{ docker_user }}"
|
||||
mode: '0644'
|
||||
tags: config
|
||||
|
||||
- name: Configure SSL
|
||||
copy:
|
||||
content: ""
|
||||
force: no
|
||||
dest: /home/{{ docker_user }}/traefik/acme.json
|
||||
mode: 0600
|
||||
state: touch
|
||||
tags: config
|
||||
|
||||
- name: "docker-compose: Teardown existing Traefik service (only removes the containers)"
|
||||
docker_compose:
|
||||
project_src: "/home/{{ docker_user }}/traefik/"
|
||||
state: absent
|
||||
tags: ['never', 'teardown']
|
||||
|
||||
- name: "docker-compose: Start Traefik service"
|
||||
docker_compose:
|
||||
project_src: "/home/{{ docker_user }}/traefik/"
|
||||
register: output
|
||||
tags: service_start
|
||||
|
||||
- debug:
|
||||
var: output
|
||||
|
||||
- name: "Waiting for Traefik service (443/TLS) to become available"
|
||||
become: false
|
||||
wait_for:
|
||||
host: "{{ ansible_ssh_host }}"
|
||||
port: 443
|
||||
delegate_to: localhost
|
38
templates/docker-compose.traefik.yml.j2
Normal file
38
templates/docker-compose.traefik.yml.j2
Normal file
|
@ -0,0 +1,38 @@
|
|||
---
|
||||
version: '3'
|
||||
|
||||
networks:
|
||||
traefik:
|
||||
driver: bridge
|
||||
|
||||
services:
|
||||
# Load Balancer / SSL / Web Server
|
||||
traefik:
|
||||
image: traefik:v2.1
|
||||
restart: always
|
||||
networks:
|
||||
- traefik
|
||||
ports:
|
||||
{% if traefik.expose_internally | default(False) %}
|
||||
- "8181:8080"
|
||||
{% endif %}
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
{% if traefik.additional_env_vars | default(False) %}
|
||||
environment:
|
||||
{% for item in traefik.additional_env_vars | dict2items %}
|
||||
- {{item.key}}={{item.value}}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- /home/{{ docker_user }}/traefik/traefik.toml:/traefik.toml
|
||||
- /home/{{ docker_user }}/traefik/acme.json:/acme.json
|
||||
{% if traefik.expose_externally | default(False) %}
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.docker.network=traefik"
|
||||
- "traefik.http.frontend.rule=Host:traefik.{{ traefik_virtual_host }}"
|
||||
- "traefik.http.protocol=http"
|
||||
- "traefik.http.port=8080"
|
||||
{% endif %}
|
48
templates/traefik.toml.j2
Normal file
48
templates/traefik.toml.j2
Normal file
|
@ -0,0 +1,48 @@
|
|||
defaultEntryPoints = ["web", "websecure"]
|
||||
|
||||
[log]
|
||||
level = "ERROR"
|
||||
|
||||
[entryPoints]
|
||||
[entryPoints.web]
|
||||
address = ":80"
|
||||
[entryPoints.websecure]
|
||||
address = ":443"
|
||||
|
||||
#[api]
|
||||
# dashboard = true
|
||||
# insecure = true
|
||||
|
||||
[file]
|
||||
watch = true
|
||||
|
||||
[providers.docker]
|
||||
endpoint = "unix:///var/run/docker.sock"
|
||||
exposedByDefault = false
|
||||
|
||||
[certificatesResolvers.defaultresolver.acme]
|
||||
{% if traefik.use_acme_staging %}
|
||||
caServer = "https://acme-staging-v02.api.letsencrypt.org/directory"
|
||||
{% endif %}
|
||||
email = "{{ letsencrypt_email }}"
|
||||
storage = "acme.json"
|
||||
[certificatesResolvers.defaultresolver.acme.httpChallenge]
|
||||
entryPoint = "web"
|
||||
|
||||
{% if traefik.extra_mapping | default(False) %}
|
||||
### NOT WORKING YET!
|
||||
#[backends]
|
||||
{% for service_name in traefik.extra_mapping %}
|
||||
#[backends.{{ service_name }}_backend]
|
||||
# [backends.{{ service_name }}_backend.servers.server1]
|
||||
# url = "{{ traefik.extra_mapping[service_name] }}"
|
||||
{% endfor %}
|
||||
#
|
||||
#[frontends]
|
||||
{% for service_name in traefik.extra_mapping %}
|
||||
# [frontends.{{ service_name }}_frontend]
|
||||
# backend = "{{ service_name }}_backend"
|
||||
# [frontends.{{ service_name }}_frontend.routes.test_1]
|
||||
# rule = "Host: {{ service_name }}.{{ domain }}"
|
||||
{% endfor %}
|
||||
{% endif %}
|
2
tests/inventory
Normal file
2
tests/inventory
Normal file
|
@ -0,0 +1,2 @@
|
|||
localhost
|
||||
|
5
tests/test.yml
Normal file
5
tests/test.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
- hosts: localhost
|
||||
remote_user: root
|
||||
roles:
|
||||
- traefik
|
2
vars/main.yml
Normal file
2
vars/main.yml
Normal file
|
@ -0,0 +1,2 @@
|
|||
---
|
||||
# vars file for traefik
|
Loading…
Add table
Reference in a new issue