This commit is contained in:
9
.drone.yml
Normal file
9
.drone.yml
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
kind: pipeline
|
||||
name: default
|
||||
steps:
|
||||
- name: lint
|
||||
image: python:3.7.8-buster
|
||||
commands:
|
||||
- pip install tox
|
||||
- tox -e ci
|
||||
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
roles-dependencies/
|
||||
tests/report.xml
|
||||
*.pyc
|
||||
.cache
|
||||
.molecule
|
||||
report.xml
|
||||
*.retry
|
||||
.vscode
|
||||
.tox
|
||||
15
.yamllint
Executable file
15
.yamllint
Executable file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
extends: default
|
||||
ignore: |
|
||||
.tox
|
||||
roles-dependencies
|
||||
|
||||
rules:
|
||||
braces:
|
||||
max-spaces-inside: 1
|
||||
level: error
|
||||
brackets:
|
||||
max-spaces-inside: 1
|
||||
level: error
|
||||
line-length: disable
|
||||
truthy: disable
|
||||
6
ansible.cfg
Executable file
6
ansible.cfg
Executable file
@@ -0,0 +1,6 @@
|
||||
[defaults]
|
||||
roles_path=roles-dependencies:roles
|
||||
|
||||
[ssh_connection]
|
||||
pipelining = True
|
||||
control_path = /tmp/ansible-ssh-%%h-%%p-%%r
|
||||
1
inventories/molecule/group_vars/all.yml
Normal file
1
inventories/molecule/group_vars/all.yml
Normal file
@@ -0,0 +1 @@
|
||||
---
|
||||
4
inventories/molecule/group_vars/all/vars.yml
Normal file
4
inventories/molecule/group_vars/all/vars.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
# Traefik
|
||||
traefik_acme_enabled: false
|
||||
traefik_dashboard_enabled: true
|
||||
3
inventories/molecule/group_vars/all/vault.yml
Normal file
3
inventories/molecule/group_vars/all/vault.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
---
|
||||
vault_drone_gitea_client_id: test
|
||||
vault_drone_gitea_client_secret: secret
|
||||
3
inventories/vps/group_vars/all/vars.yml
Executable file
3
inventories/vps/group_vars/all/vars.yml
Executable file
@@ -0,0 +1,3 @@
|
||||
# group_vars/prd
|
||||
---
|
||||
traefik_docker_domain: ebesson.fr
|
||||
1
inventories/vps/group_vars/all/vault.yml
Normal file
1
inventories/vps/group_vars/all/vault.yml
Normal file
@@ -0,0 +1 @@
|
||||
---
|
||||
10
inventories/vps/hosts
Executable file
10
inventories/vps/hosts
Executable file
@@ -0,0 +1,10 @@
|
||||
# inventories/middleware
|
||||
[middleware]
|
||||
|
||||
[gitea]
|
||||
|
||||
|
||||
[vps:children]
|
||||
middleware
|
||||
gitea
|
||||
|
||||
44
molecule/default/molecule.yml
Normal file
44
molecule/default/molecule.yml
Normal file
@@ -0,0 +1,44 @@
|
||||
---
|
||||
driver:
|
||||
name: vagrant
|
||||
provider:
|
||||
name: virtualbox
|
||||
lint: |
|
||||
yamllint --config-file .yamllint .
|
||||
ansible-lint .
|
||||
platforms:
|
||||
- name: buster
|
||||
box: debian/buster64
|
||||
interfaces:
|
||||
- auto_config: true
|
||||
network_name: private_network
|
||||
ip: "192.168.50.4"
|
||||
instance_raw_config_args:
|
||||
- "vm.network 'forwarded_port', guest: 8080, host: 8080"
|
||||
- "vm.network 'forwarded_port', guest: 8000, host: 80"
|
||||
- "vm.network 'forwarded_port', guest: 8443, host: 443"
|
||||
- "vm.network 'forwarded_port', guest: 3000, host: 3000"
|
||||
- "vm.network 'forwarded_port', guest: 9091, host: 9091"
|
||||
groups:
|
||||
- all
|
||||
- molecule
|
||||
- middleware
|
||||
- gitea
|
||||
provisioner:
|
||||
name: ansible
|
||||
lint: ansible-lint
|
||||
env:
|
||||
ANSIBLE_ROLES_PATH: ${PWD}/roles:${PWD}/roles-dependencies
|
||||
playbooks:
|
||||
converge: ../../site.yml
|
||||
inventory:
|
||||
links:
|
||||
group_vars: ../../inventories/molecule/group_vars
|
||||
scenario:
|
||||
name: default
|
||||
verifier:
|
||||
name: testinfra
|
||||
options:
|
||||
junit-xml: report.xml
|
||||
o: "junit_family=legacy"
|
||||
|
||||
41
molecule/default/prepare.yml
Normal file
41
molecule/default/prepare.yml
Normal file
@@ -0,0 +1,41 @@
|
||||
---
|
||||
- name: Prepare
|
||||
hosts: all
|
||||
become: true
|
||||
gather_facts: false
|
||||
tasks:
|
||||
- name: Install Python3 for Ansible
|
||||
raw: test -e /usr/bin/python3 || (apt -y update && apt install -y python3-minimal sudo)
|
||||
changed_when: false
|
||||
|
||||
- name: Install Mkcert
|
||||
hosts: all
|
||||
become: true
|
||||
gather_facts: false
|
||||
tasks:
|
||||
- name: install curl
|
||||
apt:
|
||||
name: curl
|
||||
state: present
|
||||
update_cache: yes
|
||||
- name: install libnss3-tools
|
||||
apt:
|
||||
name: libnss3-tools
|
||||
state: present
|
||||
update_cache: yes
|
||||
- name: download and install mkcert
|
||||
get_url:
|
||||
url: https://github.com/FiloSottile/mkcert/releases/download/v1.4.1/mkcert-v1.4.1-linux-amd64
|
||||
dest: /usr/local/bin/mkcert
|
||||
mode: 0755
|
||||
- name: install the local CA in the system trust store
|
||||
shell: mkcert -install
|
||||
- name: create certs directory
|
||||
file:
|
||||
path: /certs
|
||||
state: directory
|
||||
mode: 0755
|
||||
- name: generate certificates
|
||||
shell: mkcert -cert-file local-cert.pem -key-file local-key.pem "docker.localhost" "*.docker.localhost" "*.192.168.50.4"
|
||||
args:
|
||||
chdir: /certs
|
||||
16
molecule/default/tests/test_docker.py
Executable file
16
molecule/default/tests/test_docker.py
Executable file
@@ -0,0 +1,16 @@
|
||||
import os
|
||||
|
||||
import testinfra.utils.ansible_runner
|
||||
|
||||
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
|
||||
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('middleware')
|
||||
|
||||
|
||||
def test_docker_package(host):
|
||||
|
||||
assert host.package("docker-ce").is_installed
|
||||
|
||||
|
||||
def test_docker_service(host):
|
||||
assert host.service('docker').is_running
|
||||
assert host.service('docker').is_enabled
|
||||
23
molecule/default/tests/test_gitea.py
Normal file
23
molecule/default/tests/test_gitea.py
Normal file
@@ -0,0 +1,23 @@
|
||||
import os
|
||||
|
||||
import testinfra.utils.ansible_runner
|
||||
|
||||
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
|
||||
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('gitea')
|
||||
|
||||
|
||||
def test_gitea_service(host):
|
||||
assert host.service('gitea').is_running
|
||||
assert host.service('gitea').is_enabled
|
||||
|
||||
|
||||
def test_gitea_with_https(host):
|
||||
cmd = host.run("curl -I -k -H Host:git.localhost https://127.0.0.1")
|
||||
assert cmd.rc == 0
|
||||
assert "HTTP/2 200" in cmd.stdout
|
||||
|
||||
|
||||
def test_gitea_redirection_with_http(host):
|
||||
cmd = host.run("curl -I -H Host:git.localhost http://127.0.0.1")
|
||||
assert cmd.rc == 0
|
||||
assert "HTTP/1.1 307 Temporary Redirect" in cmd.stdout
|
||||
11
molecule/default/tests/test_traefik.py
Executable file
11
molecule/default/tests/test_traefik.py
Executable file
@@ -0,0 +1,11 @@
|
||||
import os
|
||||
|
||||
import testinfra.utils.ansible_runner
|
||||
|
||||
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
|
||||
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('middleware')
|
||||
|
||||
|
||||
def test_traefik_service(host):
|
||||
assert host.service('traefik').is_running
|
||||
assert host.service('traefik').is_enabled
|
||||
3
requirements.yml
Normal file
3
requirements.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
---
|
||||
- src: geerlingguy.docker
|
||||
version: 3.0.0
|
||||
5
roles/gitea/defaults/main.yml
Normal file
5
roles/gitea/defaults/main.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
gitea_state: present
|
||||
gitea_version: 1.13.1
|
||||
gitea_docker_compose_directory: /opt/gitea
|
||||
gitea_url: git.localhost
|
||||
7
roles/gitea/handlers/main.yml
Normal file
7
roles/gitea/handlers/main.yml
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
- name: restart gitea
|
||||
service:
|
||||
name: gitea
|
||||
state: restarted
|
||||
daemon_reload: True
|
||||
enabled: True
|
||||
14
roles/gitea/tasks/configure.yml
Normal file
14
roles/gitea/tasks/configure.yml
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
- name: configure | deploy systemd configuration
|
||||
template:
|
||||
src: etc/systemd/system/gitea.service.j2
|
||||
dest: /etc/systemd/system/gitea.service
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0644
|
||||
notify: "restart gitea"
|
||||
|
||||
- name: ensure that service is started
|
||||
service:
|
||||
name: "gitea"
|
||||
state: started
|
||||
12
roles/gitea/tasks/install.yml
Normal file
12
roles/gitea/tasks/install.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
---
|
||||
- name: install | create directory {{ gitea_docker_compose_directory }}
|
||||
file:
|
||||
path: "{{ gitea_docker_compose_directory }}"
|
||||
state: directory
|
||||
mode: 0755
|
||||
|
||||
- name: install | set compose file
|
||||
template:
|
||||
src: opt/gitea/docker-compose.yml.j2
|
||||
dest: "{{ gitea_docker_compose_directory }}/docker-compose.yml"
|
||||
notify: 'restart gitea'
|
||||
2
roles/gitea/tasks/main.yml
Normal file
2
roles/gitea/tasks/main.yml
Normal file
@@ -0,0 +1,2 @@
|
||||
---
|
||||
- include_tasks: "{{ gitea_state }}.yml"
|
||||
4
roles/gitea/tasks/present.yml
Normal file
4
roles/gitea/tasks/present.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
- include_tasks: "install.yml"
|
||||
- include_tasks: "configure.yml"
|
||||
- include_tasks: "start.yml"
|
||||
14
roles/gitea/tasks/start.yml
Normal file
14
roles/gitea/tasks/start.yml
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
- name: start | ensure gitea is up and running
|
||||
service:
|
||||
name: gitea
|
||||
state: started
|
||||
|
||||
- name: start | wait for gitea up and running
|
||||
command: "docker ps"
|
||||
register: result
|
||||
retries: 60
|
||||
changed_when: no
|
||||
until: "'gitea/gitea:{{ gitea_version}}' in result.stdout"
|
||||
tags:
|
||||
- skip_ansible_lint
|
||||
5
roles/gitea/tasks/stop.yml
Normal file
5
roles/gitea/tasks/stop.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
- name: stop | ensure gitea is up and running
|
||||
service:
|
||||
name: gitea
|
||||
state: stopped
|
||||
11
roles/gitea/templates/etc/systemd/system/gitea.service.j2
Normal file
11
roles/gitea/templates/etc/systemd/system/gitea.service.j2
Normal file
@@ -0,0 +1,11 @@
|
||||
# {{ ansible_managed }}
|
||||
[Unit]
|
||||
Description=gitea
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
ExecStart=/usr/local/bin/docker-compose -f "{{ gitea_docker_compose_directory }}/docker-compose.yml" up
|
||||
ExecStop=/usr/local/bin/docker-compose -f "{{ gitea_docker_compose_directory }}/docker-compose.yml" stop
|
||||
|
||||
[Install]
|
||||
WantedBy=local.target
|
||||
29
roles/gitea/templates/opt/gitea/docker-compose.yml.j2
Normal file
29
roles/gitea/templates/opt/gitea/docker-compose.yml.j2
Normal file
@@ -0,0 +1,29 @@
|
||||
# {{ ansible_managed }}
|
||||
|
||||
version: '3.2'
|
||||
services:
|
||||
gitea:
|
||||
image: gitea/gitea:{{ gitea_version }}
|
||||
environment:
|
||||
- ROOT_URL="http://{{ gitea_url }}"
|
||||
- DISABLE_SSH=true
|
||||
- DISABLE_REGISTRATION=true
|
||||
- REQUIRE_SIGNIN_VIEW=true
|
||||
restart: always
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.docker.network=traefik_network
|
||||
- traefik.backend=gitea
|
||||
- traefik.port=3000
|
||||
- traefik.frontend.rule=Host:{{ gitea_url }}
|
||||
networks:
|
||||
- traefik_network
|
||||
volumes:
|
||||
- gitea:/data
|
||||
volumes:
|
||||
gitea:
|
||||
driver: local
|
||||
|
||||
networks:
|
||||
traefik_network:
|
||||
external: true
|
||||
9
roles/traefik/defaults/main.yml
Normal file
9
roles/traefik/defaults/main.yml
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
traefik_state: present
|
||||
traefik_version: v1.7.28
|
||||
traefik_docker_compose_directory: /opt/traefik
|
||||
traefik_use_configuration_file: false
|
||||
traefik_docker_domain: docker.localhost
|
||||
traefik_docker_log_level: ERROR
|
||||
traefik_acme_enabled: true
|
||||
traefik_dashboard_enabled: false
|
||||
7
roles/traefik/handlers/main.yml
Normal file
7
roles/traefik/handlers/main.yml
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
- name: restart traefik
|
||||
service:
|
||||
name: traefik
|
||||
state: restarted
|
||||
daemon_reload: True
|
||||
enabled: True
|
||||
35
roles/traefik/tasks/configure.yml
Normal file
35
roles/traefik/tasks/configure.yml
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
- name: configure | deploy systemd configuration
|
||||
template:
|
||||
src: etc/systemd/system/traefik.service.j2
|
||||
dest: /etc/systemd/system/traefik.service
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0644
|
||||
notify: "restart traefik"
|
||||
|
||||
- name: configure | deploy traefik configuration
|
||||
template:
|
||||
src: opt/traefik/traefik.toml.j2
|
||||
dest: "{{ traefik_docker_compose_directory }}/traefik.toml"
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0644
|
||||
notify: "restart traefik"
|
||||
|
||||
- name: configure | create acme.json
|
||||
file:
|
||||
path: "{{ traefik_docker_compose_directory }}/acme.json"
|
||||
owner: root
|
||||
group: root
|
||||
state: touch
|
||||
mode: 0600
|
||||
changed_when: no
|
||||
|
||||
- name: configure | create network traefik_network
|
||||
command: docker network create traefik_network
|
||||
ignore_errors: yes
|
||||
changed_when: no
|
||||
|
||||
- name: configure | flush handlers
|
||||
meta: flush_handlers
|
||||
12
roles/traefik/tasks/install.yml
Normal file
12
roles/traefik/tasks/install.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
---
|
||||
- name: install | create directory {{ traefik_docker_compose_directory }}
|
||||
file:
|
||||
path: "{{ traefik_docker_compose_directory }}"
|
||||
state: directory
|
||||
mode: 0755
|
||||
|
||||
- name: install | set compose file
|
||||
template:
|
||||
src: opt/traefik/docker-compose.yml.j2
|
||||
dest: "{{ traefik_docker_compose_directory }}/docker-compose.yml"
|
||||
notify: 'restart traefik'
|
||||
2
roles/traefik/tasks/main.yml
Normal file
2
roles/traefik/tasks/main.yml
Normal file
@@ -0,0 +1,2 @@
|
||||
---
|
||||
- include_tasks: "{{ traefik_state }}.yml"
|
||||
4
roles/traefik/tasks/present.yml
Normal file
4
roles/traefik/tasks/present.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
- include_tasks: "install.yml"
|
||||
- include_tasks: "configure.yml"
|
||||
- include_tasks: "start.yml"
|
||||
10
roles/traefik/tasks/start.yml
Normal file
10
roles/traefik/tasks/start.yml
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
- name: start | ensure traefik is up and running
|
||||
service:
|
||||
name: traefik
|
||||
state: started
|
||||
|
||||
- name: start | wait for traefik up and running
|
||||
wait_for:
|
||||
port: 443
|
||||
delay: 10
|
||||
5
roles/traefik/tasks/stop.yml
Normal file
5
roles/traefik/tasks/stop.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
- name: stop | ensure traefik is up and running
|
||||
service:
|
||||
name: traefik
|
||||
state: stopped
|
||||
@@ -0,0 +1,13 @@
|
||||
# {{ ansible_managed }}
|
||||
[Unit]
|
||||
Description=Traefik
|
||||
Wants=docker.service
|
||||
After=docker.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
ExecStart=/usr/local/bin/docker-compose -f "{{ traefik_docker_compose_directory }}/docker-compose.yml" up
|
||||
ExecStop=/usr/local/bin/docker-compose -f "{{ traefik_docker_compose_directory }}/docker-compose.yml" down
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
27
roles/traefik/templates/opt/traefik/docker-compose.yml.j2
Normal file
27
roles/traefik/templates/opt/traefik/docker-compose.yml.j2
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
# {{ ansible_managed }}
|
||||
version: '3.2'
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:{{ traefik_version }}
|
||||
restart: always
|
||||
command: --api --docker # Enables the web UI and tells Traefik to listen to docker
|
||||
ports:
|
||||
- "80:80" # The HTTP port
|
||||
- "443:443" # The HTTPS ports
|
||||
{% if traefik_dashboard_enabled %}
|
||||
- "8080:8080" # Dashboard port
|
||||
{% endif %}
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events
|
||||
- {{ traefik_docker_compose_directory }}/traefik.toml:/traefik.toml
|
||||
- {{ traefik_docker_compose_directory }}/acme.json:/acme.json
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.docker.network=traefik_network
|
||||
networks:
|
||||
- traefik_network
|
||||
|
||||
networks:
|
||||
traefik_network:
|
||||
external: true
|
||||
43
roles/traefik/templates/opt/traefik/traefik.toml.j2
Executable file
43
roles/traefik/templates/opt/traefik/traefik.toml.j2
Executable file
@@ -0,0 +1,43 @@
|
||||
# {{ ansible_managed }}
|
||||
###Traefik.toml###
|
||||
|
||||
logLevel = "{{ traefik_docker_log_level }}"
|
||||
defaultEntryPoints = ["http","https"]
|
||||
|
||||
[entryPoints]
|
||||
[entryPoints.http]
|
||||
address = ":80"
|
||||
[entryPoints.http.redirect]
|
||||
entryPoint = "https"
|
||||
[entryPoints.https]
|
||||
address = ":443"
|
||||
[entryPoints.https.tls]
|
||||
{% if not traefik_acme_enabled %}
|
||||
[[entryPoints.https.tls.certificate]]
|
||||
certFile = "/certs/local-cert.pem"
|
||||
keyFile = "/certs/local-key.pem"
|
||||
{% endif %}
|
||||
|
||||
{% if traefik_dashboard_enabled %}
|
||||
[api]
|
||||
# With this you enable the web UI
|
||||
insecure = true
|
||||
dashboard = true
|
||||
{% endif %}
|
||||
|
||||
{% if traefik_acme_enabled %}
|
||||
[acme]
|
||||
email = "etienne.besson@gmail.com"
|
||||
storage = "acme.json"
|
||||
onHostRule = true
|
||||
entryPoint = "https"
|
||||
[acme.tlsChallenge]
|
||||
{% endif %}
|
||||
|
||||
# Enable Docker configuration backend
|
||||
[docker]
|
||||
endpoint = "unix:///var/run/docker.sock"
|
||||
domain = "{{ traefik_docker_domain }}"
|
||||
watch = true
|
||||
exposedByDefault = false
|
||||
|
||||
23
site.yml
Executable file
23
site.yml
Executable file
@@ -0,0 +1,23 @@
|
||||
---
|
||||
- hosts: all
|
||||
gather_facts: False
|
||||
tasks:
|
||||
- name: Install python for Ansible
|
||||
raw: test -e /usr/bin/python || (apt -y update && apt install -y python2.7 python-minimal sudo)
|
||||
changed_when: False
|
||||
|
||||
|
||||
- hosts: middleware
|
||||
become: True
|
||||
roles:
|
||||
- geerlingguy.docker
|
||||
- traefik
|
||||
tags:
|
||||
- traefik
|
||||
|
||||
- hosts: gitea
|
||||
become: True
|
||||
roles:
|
||||
- gitea
|
||||
tags:
|
||||
- gitea
|
||||
20
tox.ini
Normal file
20
tox.ini
Normal file
@@ -0,0 +1,20 @@
|
||||
[tox]
|
||||
recreate = true
|
||||
skipsdist = true
|
||||
envlist = py{3}-ansible
|
||||
|
||||
[testenv]
|
||||
passenv = *
|
||||
deps =
|
||||
ansible==2.9.*
|
||||
pytest-testinfra==6.0.*
|
||||
molecule==3.2.*
|
||||
molecule-vagrant==0.6.*
|
||||
python-vagrant==0.5.*
|
||||
paramiko==2.6.0
|
||||
ansible-lint==4.3.*
|
||||
|
||||
[testenv:ci]
|
||||
passenv = *
|
||||
ansible-galaxy install -r requirements.yml --ignore-errors -p roles-dependencies --force
|
||||
molecule lint
|
||||
Reference in New Issue
Block a user