Add basic ansible stuff for management
acme-dns is fully handled by ansible already. All services should be created by ansible in the end.
This commit is contained in:
		
							parent
							
								
									607ad23697
								
							
						
					
					
						commit
						7ff7dfe807
					
				
					 16 changed files with 162 additions and 3 deletions
				
			
		
							
								
								
									
										2
									
								
								_ansible/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								_ansible/.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
.vault_pass
 | 
			
		||||
inventory/group_vars/all/vault.yml
 | 
			
		||||
							
								
								
									
										4
									
								
								_ansible/ansible.cfg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								_ansible/ansible.cfg
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
[defaults]
 | 
			
		||||
inventory = ./inventory
 | 
			
		||||
interpreter_python = auto_silent
 | 
			
		||||
vault_password_file = ./.vault_pass
 | 
			
		||||
							
								
								
									
										14
									
								
								_ansible/inventory/group_vars/all/compose_defaults.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								_ansible/inventory/group_vars/all/compose_defaults.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
compose_default_file:
 | 
			
		||||
  services:
 | 
			
		||||
    app:
 | 
			
		||||
      image: "{{ compose.image }}"
 | 
			
		||||
      restart: always
 | 
			
		||||
      labels:
 | 
			
		||||
        com.centurylinklabs.watchtower.enable: "{{ compose.watchtower | default(false) }}"
 | 
			
		||||
      networks:
 | 
			
		||||
        apps:
 | 
			
		||||
          aliases:
 | 
			
		||||
            - "{{ service.name }}"
 | 
			
		||||
  networks:
 | 
			
		||||
    apps:
 | 
			
		||||
      external: true
 | 
			
		||||
							
								
								
									
										8
									
								
								_ansible/inventory/group_vars/all/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								_ansible/inventory/group_vars/all/main.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
admin_email: tobias@msrg.cc
 | 
			
		||||
 | 
			
		||||
postgres:
 | 
			
		||||
  host: db.serguzim.me
 | 
			
		||||
  port: 5432
 | 
			
		||||
 | 
			
		||||
services_path: /opt/services/
 | 
			
		||||
caddy_config_path: "{{ (services_path, 'caddy', 'config', 'conf.d') | path_join }}"
 | 
			
		||||
							
								
								
									
										1
									
								
								_ansible/inventory/host_vars/node002/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								_ansible/inventory/host_vars/node002/main.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
services_path: /opt/services/
 | 
			
		||||
							
								
								
									
										6
									
								
								_ansible/inventory/serguzim.net.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								_ansible/inventory/serguzim.net.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
all:
 | 
			
		||||
  hosts:
 | 
			
		||||
    local-dev:
 | 
			
		||||
      ansible_connection: local
 | 
			
		||||
    node002:
 | 
			
		||||
      ansible_connection: local
 | 
			
		||||
							
								
								
									
										10
									
								
								_ansible/local-dev.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								_ansible/local-dev.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Run roles for local-dev
 | 
			
		||||
  vars:
 | 
			
		||||
    # Remove _ansible and inventory
 | 
			
		||||
    services_path: "{{ inventory_dir.split('/')[0:-2] | join('/') }}"
 | 
			
		||||
    caddy_config_path: "{{ (services_path, 'caddy', 'config', 'conf.d') | path_join }}"
 | 
			
		||||
 | 
			
		||||
  hosts: local-dev
 | 
			
		||||
  roles:
 | 
			
		||||
    - acme-dns
 | 
			
		||||
							
								
								
									
										0
									
								
								_ansible/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								_ansible/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
								
								
									
										5
									
								
								_ansible/node002.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								_ansible/node002.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Run roles for node002
 | 
			
		||||
  hosts: node002
 | 
			
		||||
  roles:
 | 
			
		||||
    - acme-dns
 | 
			
		||||
							
								
								
									
										32
									
								
								_ansible/roles/acme-dns/tasks/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								_ansible/roles/acme-dns/tasks/main.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Deploy acme-dns
 | 
			
		||||
  tags: acme-dns
 | 
			
		||||
  vars:
 | 
			
		||||
    service_path: "{{ (services_path, 'acme-dns') | path_join }}"
 | 
			
		||||
    config_path: "{{ (service_path, 'config') | path_join }}"
 | 
			
		||||
  block:
 | 
			
		||||
    - name: Create a service directory
 | 
			
		||||
      ansible.builtin.file:
 | 
			
		||||
        path: "{{ service_path }}"
 | 
			
		||||
        state: directory
 | 
			
		||||
        mode: "0755"
 | 
			
		||||
    - name: Create a service-config directory
 | 
			
		||||
      ansible.builtin.file:
 | 
			
		||||
        path: "{{ config_path }}"
 | 
			
		||||
        state: directory
 | 
			
		||||
        mode: "0755"
 | 
			
		||||
 | 
			
		||||
    - name: Template acme-dns docker-compose
 | 
			
		||||
      ansible.builtin.template:
 | 
			
		||||
        src: docker-compose.yml.j2
 | 
			
		||||
        dest: "{{ (service_path, 'docker-compose.yml') | path_join }}"
 | 
			
		||||
 | 
			
		||||
    - name: Template acme-dns config
 | 
			
		||||
      ansible.builtin.template:
 | 
			
		||||
        src: config.cfg.j2
 | 
			
		||||
        dest: "{{ (config_path, 'config.cfg') | path_join }}"
 | 
			
		||||
 | 
			
		||||
    - name: Template acme-dns caddy config
 | 
			
		||||
      ansible.builtin.template:
 | 
			
		||||
        src: caddy_site.conf.j2
 | 
			
		||||
        dest: "{{ (caddy_config_path, service.domain + '.conf') | path_join }}"
 | 
			
		||||
							
								
								
									
										31
									
								
								_ansible/roles/acme-dns/templates/config.cfg.j2
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								_ansible/roles/acme-dns/templates/config.cfg.j2
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
[general]
 | 
			
		||||
listen = "0.0.0.0:53"
 | 
			
		||||
protocol = "both"
 | 
			
		||||
domain = "{{ acme_dns.domain }}"
 | 
			
		||||
nsname = "{{ acme_dns.domain }}"
 | 
			
		||||
nsadmin = "{{ acme_dns.nsadmin }}"
 | 
			
		||||
records = [
 | 
			
		||||
    "{{ acme_dns.domain }}. A {{ acme_dns.records.a }}",
 | 
			
		||||
    "{{ acme_dns.domain }}. NS {{ acme_dns.domain }}.",
 | 
			
		||||
]
 | 
			
		||||
debug = false
 | 
			
		||||
 | 
			
		||||
[database]
 | 
			
		||||
engine = "postgres"
 | 
			
		||||
connection = "postgres://{{ acme_dns.db.user }}:{{ acme_dns.db.pass }}@{{ acme_dns.db.host }}/{{ acme_dns.db.db }}"
 | 
			
		||||
 | 
			
		||||
[api]
 | 
			
		||||
ip = "0.0.0.0"
 | 
			
		||||
disable_registration = false
 | 
			
		||||
port = "80"
 | 
			
		||||
tls = "none"
 | 
			
		||||
corsorigins = [
 | 
			
		||||
    "*"
 | 
			
		||||
]
 | 
			
		||||
use_header = true
 | 
			
		||||
header_name = "X-Forwarded-For"
 | 
			
		||||
 | 
			
		||||
[logconfig]
 | 
			
		||||
loglevel = "info"
 | 
			
		||||
logtype = "stdout"
 | 
			
		||||
logformat = "text"
 | 
			
		||||
							
								
								
									
										31
									
								
								_ansible/roles/acme-dns/vars/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								_ansible/roles/acme-dns/vars/main.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
acme_dns:
 | 
			
		||||
  nsadmin: "{{ admin_email | regex_replace('@', '.') }}"
 | 
			
		||||
  domain: "acme.serguzim.me"
 | 
			
		||||
  records:
 | 
			
		||||
    a: "{{ ansible_facts.default_ipv4.address }}"
 | 
			
		||||
  db:
 | 
			
		||||
    host: "{{ postgres.host }}"
 | 
			
		||||
    port: "{{ postgres.port }}"
 | 
			
		||||
    user: "{{ vault_acmedns.db.user }}"
 | 
			
		||||
    pass: "{{ vault_acmedns.db.pass }}"
 | 
			
		||||
    db: acme_dns
 | 
			
		||||
  api:
 | 
			
		||||
    port: 80
 | 
			
		||||
 | 
			
		||||
service:
 | 
			
		||||
  domain: "{{ acme_dns.domain }}"
 | 
			
		||||
  name: acme-dns
 | 
			
		||||
  port: "{{ acme_dns.api.port }}"
 | 
			
		||||
 | 
			
		||||
compose:
 | 
			
		||||
  watchtower: true
 | 
			
		||||
  image: joohoi/acme-dns
 | 
			
		||||
 | 
			
		||||
compose_file:
 | 
			
		||||
  services:
 | 
			
		||||
    app:
 | 
			
		||||
      ports:
 | 
			
		||||
        - "53:53"
 | 
			
		||||
        - "53:53/udp"
 | 
			
		||||
      volumes:
 | 
			
		||||
        - ./config:/etc/acme-dns:ro
 | 
			
		||||
							
								
								
									
										4
									
								
								_ansible/templates/caddy_site.conf.j2
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								_ansible/templates/caddy_site.conf.j2
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
{{ service.domain }} {
 | 
			
		||||
	import default
 | 
			
		||||
	reverse_proxy {{ service.name }}:{{ service.port }}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								_ansible/templates/docker-compose.yml.j2
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								_ansible/templates/docker-compose.yml.j2
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
{{ compose_default_file | combine(compose_file, recursive=True) | to_nice_yaml }}
 | 
			
		||||
							
								
								
									
										10
									
								
								_ansible/test.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								_ansible/test.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Test
 | 
			
		||||
  hosts: all
 | 
			
		||||
  tasks:
 | 
			
		||||
    #- name: Include acme-dns role vars
 | 
			
		||||
    #  ansible.builtin.include_vars:
 | 
			
		||||
    #    dir: roles/acme-dns/vars
 | 
			
		||||
    - name: Debug all variables
 | 
			
		||||
      ansible.builtin.debug:
 | 
			
		||||
        var: hostvars[inventory_hostname]
 | 
			
		||||
| 
						 | 
				
			
			@ -66,7 +66,7 @@ services:
 | 
			
		|||
	networks:
 | 
			
		||||
	  apps:
 | 
			
		||||
		aliases:
 | 
			
		||||
		  - ${SERVICE_NAME}
 | 
			
		||||
		  - ${NAME}
 | 
			
		||||
networks:
 | 
			
		||||
  apps:
 | 
			
		||||
	external: true
 | 
			
		||||
| 
						 | 
				
			
			@ -78,10 +78,10 @@ if [ ! -d "${caddy_path}" ]; then
 | 
			
		|||
	caddy_path="caddy/config/conf.d"
 | 
			
		||||
fi
 | 
			
		||||
if [ -d "${caddy_path}" ]; then
 | 
			
		||||
cat <<EOF > "$caddy_path/${DOMAIN}.config"
 | 
			
		||||
cat <<EOF > "$caddy_path/${DOMAIN}.conf"
 | 
			
		||||
${DOMAIN} {
 | 
			
		||||
  import default
 | 
			
		||||
  reverse_proxy ${SERVICE_NAME}:${PORT}
 | 
			
		||||
  reverse_proxy ${NAME}:${PORT}
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue