Basic services
This commit is contained in:
commit
46f99a7fd4
2
.ansible-lint
Normal file
2
.ansible-lint
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
skip_list:
|
||||||
|
- '306'
|
10
.editorconfig
Normal file
10
.editorconfig
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
root=true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
[*.{yaml,yml}]
|
||||||
|
indent_size = 2
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/.vagrant/
|
11
.vscode/settings.json
vendored
Normal file
11
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"yaml.schemaStore.enable": false,
|
||||||
|
"yaml.schemas": {
|
||||||
|
"https://json.schemastore.org/ansible-playbook": [
|
||||||
|
"${workspaceFolder}/*.yaml",
|
||||||
|
],
|
||||||
|
"https://raw.githubusercontent.com/compose-spec/compose-spec/master/schema/compose-spec.json": [
|
||||||
|
"/services/*/stack.yml"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
12
Vagrantfile
vendored
Normal file
12
Vagrantfile
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# -*- mode: ruby -*-
|
||||||
|
# vi: set ft=ruby :
|
||||||
|
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.box = "generic/debian10"
|
||||||
|
|
||||||
|
config.vm.network "private_network", ip: "192.168.33.10"
|
||||||
|
|
||||||
|
config.vm.provider "virtualbox" do |vb|
|
||||||
|
vb.memory = 2048
|
||||||
|
end
|
||||||
|
end
|
35
init.yaml
Normal file
35
init.yaml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
- hosts: all
|
||||||
|
become: yes
|
||||||
|
|
||||||
|
vars_files:
|
||||||
|
- vars/services.yml
|
||||||
|
- vars/environment.yml
|
||||||
|
|
||||||
|
roles:
|
||||||
|
- geerlingguy.docker
|
||||||
|
- geerlingguy.pip
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: "Add '{{ ansible_user }}' to docker group"
|
||||||
|
user:
|
||||||
|
user: "{{ ansible_user }}"
|
||||||
|
groups: docker
|
||||||
|
append: yes
|
||||||
|
|
||||||
|
- name: Init a new swarm with default parameters
|
||||||
|
community.docker.docker_swarm:
|
||||||
|
state: present
|
||||||
|
advertise_addr: "{{ swarm_addr|default(omit) }}"
|
||||||
|
|
||||||
|
- name: Init docker network for ingress
|
||||||
|
community.docker.docker_network:
|
||||||
|
name: traefik
|
||||||
|
scope: swarm
|
||||||
|
driver: overlay
|
||||||
|
|
||||||
|
- name: Deploy services
|
||||||
|
include_tasks: tasks/deploy.yml
|
||||||
|
vars:
|
||||||
|
service: "{{ item }}"
|
||||||
|
loop: "{{ services }}"
|
7
inventory/vagrant.ini
Normal file
7
inventory/vagrant.ini
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[main]
|
||||||
|
192.168.33.10
|
||||||
|
|
||||||
|
[main:vars]
|
||||||
|
ansible_user=vagrant
|
||||||
|
ansible_ssh_private_key_file=./.vagrant/machines/default/virtualbox/private_key
|
||||||
|
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
|
14
services.yaml
Normal file
14
services.yaml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
- hosts: all
|
||||||
|
become: yes
|
||||||
|
|
||||||
|
vars_files:
|
||||||
|
- vars/environment.yml
|
||||||
|
- vars/services.yml
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Deploy services
|
||||||
|
include_tasks: tasks/deploy.yml
|
||||||
|
vars:
|
||||||
|
service: "{{ item }}"
|
||||||
|
loop: "{{ services }}"
|
13
services/helloworld/stack.yml
Normal file
13
services/helloworld/stack.yml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
version: "{{ compose_version }}"
|
||||||
|
|
||||||
|
services:
|
||||||
|
rest:
|
||||||
|
image: thomaspoignant/hello-world-rest-json
|
||||||
|
deploy:
|
||||||
|
labels:
|
||||||
|
- traefik.enable=true
|
||||||
|
- traefik.http.routers.{{ service }}.rule=Host(`kadet.local`) && PathPrefix(`/hello/`)
|
||||||
|
- traefik.http.services.{{ service }}.loadbalancer.server.port=8080
|
||||||
|
- traefik.http.routers.{{ service }}.middlewares={{ service }}-strip
|
||||||
|
- traefik.http.middlewares.{{ service }}-strip.stripprefix.prefixes=/hello/
|
||||||
|
networks: ['traefik']
|
2
services/helloworld/vars/main.yml
Normal file
2
services/helloworld/vars/main.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
service_port: 80
|
136
services/traefik/config/traefik.yaml
Normal file
136
services/traefik/config/traefik.yaml
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
################################################################
|
||||||
|
#
|
||||||
|
# Configuration sample for Traefik v2.
|
||||||
|
#
|
||||||
|
# For Traefik v1: https://github.com/traefik/traefik/blob/v1.7/traefik.sample.toml
|
||||||
|
#
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Global configuration
|
||||||
|
################################################################
|
||||||
|
global:
|
||||||
|
checkNewVersion: true
|
||||||
|
sendAnonymousUsage: true
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# EntryPoints configuration
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
# EntryPoints definition
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
#
|
||||||
|
entryPoints:
|
||||||
|
web:
|
||||||
|
address: :80
|
||||||
|
|
||||||
|
websecure:
|
||||||
|
address: :443
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Traefik logs configuration
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
# Traefik logs
|
||||||
|
# Enabled by default and log to stdout
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
#
|
||||||
|
#log:
|
||||||
|
# Log level
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: "ERROR"
|
||||||
|
#
|
||||||
|
# level: DEBUG
|
||||||
|
|
||||||
|
# Sets the filepath for the traefik log. If not specified, stdout will be used.
|
||||||
|
# Intermediate directories are created if necessary.
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: os.Stdout
|
||||||
|
#
|
||||||
|
# filePath: log/traefik.log
|
||||||
|
|
||||||
|
# Format is either "json" or "common".
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: "common"
|
||||||
|
#
|
||||||
|
# format: json
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Access logs configuration
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
# Enable access logs
|
||||||
|
# By default it will write to stdout and produce logs in the textual
|
||||||
|
# Common Log Format (CLF), extended with additional fields.
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
#
|
||||||
|
#accessLog:
|
||||||
|
# Sets the file path for the access log. If not specified, stdout will be used.
|
||||||
|
# Intermediate directories are created if necessary.
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: os.Stdout
|
||||||
|
#
|
||||||
|
# filePath: /path/to/log/log.txt
|
||||||
|
|
||||||
|
# Format is either "json" or "common".
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: "common"
|
||||||
|
#
|
||||||
|
# format: json
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# API and dashboard configuration
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
# Enable API and dashboard
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
#
|
||||||
|
#api:
|
||||||
|
# Enable the API in insecure mode
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: false
|
||||||
|
#
|
||||||
|
# insecure: true
|
||||||
|
|
||||||
|
# Enabled Dashboard
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: true
|
||||||
|
#
|
||||||
|
# dashboard: false
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Ping configuration
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
# Enable ping
|
||||||
|
#ping:
|
||||||
|
# Name of the related entry point
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: "traefik"
|
||||||
|
#
|
||||||
|
# entryPoint: traefik
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Docker configuration backend
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
providers:
|
||||||
|
file:
|
||||||
|
directory: "/etc/traefik/dynamic"
|
||||||
|
# Enable Docker configuration backend
|
||||||
|
docker:
|
||||||
|
endpoint: "unix:///var/run/docker.sock"
|
||||||
|
swarmMode: true
|
||||||
|
exposedByDefault: false
|
16
services/traefik/stack.yml
Normal file
16
services/traefik/stack.yml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
version: "{{ compose_version }}"
|
||||||
|
|
||||||
|
services:
|
||||||
|
traefik:
|
||||||
|
image: traefik:v2.4
|
||||||
|
ports:
|
||||||
|
- 80:80
|
||||||
|
- 443:443
|
||||||
|
volumes:
|
||||||
|
- ./config/traefik.yaml:/etc/traefik/traefik.yaml
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
deploy:
|
||||||
|
placement:
|
||||||
|
constraints:
|
||||||
|
- node.role == manager
|
||||||
|
networks: ['traefik']
|
43
tasks/deploy.yml
Normal file
43
tasks/deploy.yml
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
- name: 'Include vars for "{{ service }}" service'
|
||||||
|
include_vars: "{{ file }}"
|
||||||
|
with_fileglob: "{{ services_root }}/{{ service }}/vars/*"
|
||||||
|
loop_control:
|
||||||
|
loop_var: file
|
||||||
|
|
||||||
|
- name: 'Ensure "{{ service }}" service config directory exist'
|
||||||
|
file:
|
||||||
|
path: "{{ remote_services_root }}/{{ service }}"
|
||||||
|
state: directory
|
||||||
|
recurse: true
|
||||||
|
owner: "{{ ansible_user }}"
|
||||||
|
|
||||||
|
- name: 'Ensure "{{ service }}" service config directory exist'
|
||||||
|
file:
|
||||||
|
path: "{{ remote_services_root }}/{{ service }}/config"
|
||||||
|
state: directory
|
||||||
|
recurse: true
|
||||||
|
owner: "{{ ansible_user }}"
|
||||||
|
|
||||||
|
- name: 'Synchronise "{{ service }}" configuration'
|
||||||
|
template:
|
||||||
|
src: "{{ services_root }}/{{ service }}/stack.yml"
|
||||||
|
dest: "{{ remote_services_root }}/{{ service }}/stack.yml"
|
||||||
|
|
||||||
|
- name: 'Include vars for "{{ service }}" service'
|
||||||
|
copy:
|
||||||
|
src: "{{ file }}"
|
||||||
|
dest: "{{ remote_services_root }}/{{ file | replace(services_root, '') }}"
|
||||||
|
with_fileglob: "{{ services_root }}/{{ service }}/config/*"
|
||||||
|
loop_control:
|
||||||
|
loop_var: file
|
||||||
|
|
||||||
|
- name: 'Deploy "{{ service }}" docker stack'
|
||||||
|
community.docker.docker_stack:
|
||||||
|
name: "{{ service }}"
|
||||||
|
compose:
|
||||||
|
- "{{ remote_services_root }}/{{ service }}/stack.yml"
|
||||||
|
- version: "{{ compose_version }}"
|
||||||
|
networks:
|
||||||
|
traefik:
|
||||||
|
external: true
|
9
vars/environment.yml
Normal file
9
vars/environment.yml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
docker_install_compose: no
|
||||||
|
pip_install_packages:
|
||||||
|
- docker
|
||||||
|
- jsondiff
|
||||||
|
- pyyaml
|
||||||
|
ansible_python_interpreter: /usr/bin/python3
|
||||||
|
pip_package: python3-pip
|
||||||
|
pip_executable: pip3
|
6
vars/services.yml
Normal file
6
vars/services.yml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
services_root: "{{ './services' | realpath }}"
|
||||||
|
services: "{{ lookup('pipe', 'ls -1 ' + services_root).split('\n') | list }}"
|
||||||
|
remote_services_root: /var/services
|
||||||
|
|
||||||
|
compose_version: "3.7"
|
Loading…
Reference in New Issue
Block a user