feat: Add keycloak role that creates the initial setup

This commit is contained in:
2025-02-23 13:24:05 +01:00
parent c51e2a163a
commit b05211606c
25 changed files with 233 additions and 28 deletions
+10
View File
@@ -0,0 +1,10 @@
{
"folders": [
{
"path": ".."
}
],
"settings": {
"ansible.python.interpreterPath": "/opt/homebrew/bin/python3"
}
}
+3
View File
@@ -0,0 +1,3 @@
{
"ansible.python.interpreterPath": "/opt/homebrew/bin/python3"
}
+2
View File
@@ -0,0 +1,2 @@
[defaults]
roles_path = roles:playbooks/roles
@@ -0,0 +1,10 @@
$ANSIBLE_VAULT;1.1;AES256
37626238663938613666353334626433623434656638633063373634303135323834616436333434
3563376532353538336637326138666362393530386165310a373033373666393962393339386666
61323339623039383531613261656139326434393433356530393231386165366235633032353831
6662626130353736340a323963393235383461643137633739643065333536333131366634616233
39653037636536323834313164623631653831366334303235366239333262336237396466353532
38323461393261356337663461363732353631653164363131613032643539346665663637656365
66353139333432363335343632373731333138343735316336336531373431623534373338363366
66633731353331626166373265393963393936373863363538613831353636303631656564666566
6435
@@ -0,0 +1,3 @@
---
ssh_user: keywolke
domain: id.2martens.de
+3
View File
@@ -14,3 +14,6 @@ repo ansible_host=shaula.uberspace.de ansible_python_interpreter=/usr/bin/python
[applications] [applications]
api-server ansible_host=49.13.77.70 ansible_python_interpreter=/usr/bin/python3 api-server ansible_host=49.13.77.70 ansible_python_interpreter=/usr/bin/python3
[keycloak]
keycloak-server ansible_host=monoceres.uberspace.de ansible_python_interpreter=/usr/bin/python
@@ -52,3 +52,10 @@
tags: springBoot tags: springBoot
roles: roles:
- spring_boot - spring_boot
- name: Set up Keycloak
hosts: keycloak
gather_facts: false
remote_user: "{{ ssh_user }}"
tags: keycloak
roles:
- keycloak
+6 -2
View File
@@ -1,4 +1,8 @@
--- ---
collections: collections:
- community.docker - community.docker
- community.general - community.general
- community.mysql
- ansible.posix
- hetzner.hcloud
- middleware_automation.keycloak
+1 -1
View File
@@ -19,5 +19,5 @@
group: root group: root
mode: "644" mode: "644"
- name: Start drone docker container - name: Start drone docker container
community.docker.docker_compose: community.docker.docker_compose_v2:
project_src: /etc/drone project_src: /etc/drone
+1 -1
View File
@@ -20,5 +20,5 @@
state: present state: present
appends: true appends: true
- name: Start kafka docker container - name: Start kafka docker container
community.docker.docker_compose: community.docker.docker_compose_v2:
project_src: /opt/kafka project_src: /opt/kafka
@@ -0,0 +1,7 @@
---
keycloak_version: 26.1.0
# Database Configuration Defaults
keycloak_db_host: localhost
keycloak_db_port: 3306
keycloak_db_type: mariadb
+6
View File
@@ -0,0 +1,6 @@
---
- name: Print next steps
ansible.builtin.debug:
msg: "Login with the temp admin ({{ keycloak_temp_admin_user }}:{{ keycloak_temp_admin_password }}) and
create a proper admin user: https://{{ domain }}/admin/master/console"
when: bootstrap.changed
@@ -0,0 +1,20 @@
---
- name: Check if Keycloak is already downloaded
ansible.builtin.stat:
path: ~/keycloak-{{ keycloak_version }}
register: keycloak_dir
- name: Download Keycloak
ansible.builtin.unarchive:
src: https://github.com/keycloak/keycloak/releases/download/{{ keycloak_version }}/keycloak-{{ keycloak_version }}.tar.gz
dest: ~
remote_src: true
creates: ~/keycloak-{{ keycloak_version }}
when: not keycloak_dir.stat.exists
- name: Create symlink to current Keycloak version
ansible.builtin.file:
src: ~/keycloak-{{ keycloak_version }}
dest: ~/keycloak-current
state: link
when: not keycloak_dir.stat.exists
+11
View File
@@ -0,0 +1,11 @@
---
- name: Set up database
ansible.builtin.import_tasks: mysql.yaml
- name: Download archive
ansible.builtin.import_tasks: download.yaml
- name: Set up Keycloak
ansible.builtin.import_tasks: setup.yaml
- name: Set up service
ansible.builtin.import_tasks: service.yaml
- name: Print next steps
ansible.builtin.import_tasks: debug.yaml
+6
View File
@@ -0,0 +1,6 @@
---
- name: Create MySQL database
community.mysql.mysql_db:
name: "{{ ssh_user }}_keycloak"
state: present
register: database
+19
View File
@@ -0,0 +1,19 @@
---
- name: Create service directory
ansible.builtin.file:
state: directory
path: /home/{{ ssh_user }}/etc/services.d
owner: "{{ ssh_user }}"
group: "{{ ssh_user }}"
mode: "755"
- name: Create Keycloak service
ansible.builtin.template:
src: etc/services.d/keycloak.ini.j2
dest: /home/{{ ssh_user }}/etc/services.d/keycloak.ini
owner: "{{ ssh_user }}"
group: "{{ ssh_user }}"
mode: "644"
- name: Start Keycloak
community.general.supervisorctl:
state: started
name: keycloak
+88
View File
@@ -0,0 +1,88 @@
---
- name: Check if service exists
ansible.builtin.stat:
path: /home/{{ ssh_user }}/etc/services.d/keycloak.ini.j2
register: service
- name: Shutdown Keycloak
community.general.supervisorctl:
name: keycloak
state: stopped
when: service.stat.exists
- name: Update configuration
block:
- name: Set db type
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?db='
line: "db={{ keycloak_db_type }}"
- name: Set db username
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?db-username='
line: "db-username={{ ssh_user }}"
- name: Set db password
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?db-password='
line: "db-password={{ keycloak_db_password }}"
- name: Set db host
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?db-url-host='
line: "db-url-host={{ keycloak_db_host }}"
- name: Set db port
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?db-url-port='
line: "db-url-port={{ keycloak_db_port }}"
- name: Set db name
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?db-url-database='
line: "db-url-database={{ ssh_user }}_keycloak"
- name: Enable http
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?http-enabled='
line: "http-enabled=true"
- name: Set ssl certificate
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?https-certificate-file='
line: "https-certificate-file=/home/{{ ssh_user }}/etc/certificates/{{ domain }}.crt"
- name: Set ssl certificate key
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?https-certificate-key-file='
line: "https-certificate-key-file=/home/{{ ssh_user }}/etc/certificates/{{ domain }}.key"
- name: Set proxy mode to edge
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?proxy='
line: "proxy=edge"
- name: Set proxy headers to xforwarded
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?proxy-headers='
line: "proxy-headers=xforwarded"
- name: Set hostname
ansible.builtin.lineinfile:
path: ~/keycloak-current/conf/keycloak.conf
regex: '#?hostname='
line: "hostname={{ domain }}"
- name: Build application
ansible.builtin.command:
chdir: ~/keycloak-current/bin
cmd: ./kc.sh build
register: build
changed_when: true
- name: Create temp admin
ansible.builtin.command:
chdir: ~/keycloak-current/bin
cmd: ./kc.sh bootstrap-admin user --username:env KEYCLOAK_ADMIN_USER --password:env KEYCLOAK_ADMIN_USER_PASSWORD --optimized
environment:
KEYCLOAK_ADMIN_USER: keycloakbootstrap
KEYCLOAK_ADMIN_USER_PASSWORD: "{{ keycloak_temp_admin_password }}"
when: database.changed
register: bootstrap
changed_when: true
@@ -0,0 +1,8 @@
[program:keycloak]
command=%(ENV_HOME)s/keycloak-current/bin/kc.sh start --optimized
autostart=yes
autorestart=yes
[program:keycloak]
# `startsecs` is set by Uberspace monitoring team, to prevent a broken service from looping
startsecs=30
@@ -1,6 +1,6 @@
--- ---
basic_firewall: basic-firewall server_setup_basic_firewall: basic-firewall
server_image: ubuntu-22.04 server_setup_server_image: ubuntu-22.04
server_location: fsn1 server_setup_server_location: fsn1
server_placement_group: default server_setup_server_placement_group: default
server_type: cax11 server_setup_server_type: cax11
@@ -1,22 +1,22 @@
--- ---
- name: Create SSH key - name: Create SSH key
hetzner.hcloud.hcloud_ssh_key: hetzner.hcloud.ssh_key:
api_token: "{{ hcloud_api_token }}" api_token: "{{ server_setup_hcloud_api_token }}"
public_key: "{{ ssh_key_admin_user }}" public_key: "{{ server_setup_ssh_key_admin_user }}"
name: "{{ ssh_key_admin_user_name }}" name: "{{ server_setup_ssh_key_admin_user_name }}"
state: present state: present
- name: Create server via HCloud - name: Create server via HCloud
hetzner.hcloud.hcloud_server: hetzner.hcloud.server:
api_token: "{{ hcloud_api_token }}" api_token: "{{ server_setup_hcloud_api_token }}"
firewalls: firewalls:
- "{{ basic_firewall }}" - "{{ server_setup_basic_firewall }}"
image: "{{ server_image }}" image: "{{ server_setup_server_image }}"
location: "{{ server_location }}" location: "{{ server_setup_server_location }}"
name: "{{ server_name }}" name: "{{ server_setup_server_name }}"
placement_group: "{{ server_placement_group }}" placement_group: "{{ server_setup_server_placement_group }}"
server_type: "{{ server_type }}" server_type: "{{ server_setup_server_type }}"
ssh_keys: ssh_keys:
- "{{ ssh_key_admin_user_name }}" - "{{ server_setup_ssh_key_admin_user_name }}"
user_data: "{{ lookup('ansible.builtin.template', 'basic-ssh-hardening.yaml.j2', convert_data=false) }}" user_data: "{{ lookup('ansible.builtin.template', 'basic-ssh-hardening.yaml.j2', convert_data=false) }}"
state: present state: present
register: server register: server
+1 -1
View File
@@ -15,5 +15,5 @@
mode: "644" mode: "644"
lstrip_blocks: true lstrip_blocks: true
- name: Start application docker container - name: Start application docker container
community.docker.docker_compose: community.docker.docker_compose_v2:
project_src: /opt/{{ spring_docker_path }} project_src: /opt/{{ spring_docker_path }}
-2
View File
@@ -1,2 +0,0 @@
---
- include: setup.yaml
Binary file not shown.
+3 -3
View File
@@ -6,13 +6,13 @@ vault:
# creates each of the namespaces # creates each of the namespaces
applicationNamespaces: [] applicationNamespaces: []
ecr: ecr:
enabled: false
account: ""
accessKey: accessKey:
id: "" id: ""
secret: "" secret: ""
repository: "" account: ""
applicationNamespaces: [] applicationNamespaces: []
enabled: false
repository: ""
hcloud: hcloud:
enabled: false enabled: false
token: "" token: ""