From 2e2d4f8971ef0d156d55b685125dff14ea07edd3 Mon Sep 17 00:00:00 2001 From: Scarabyte Date: Sun, 21 Jan 2024 08:19:11 +0100 Subject: [PATCH 1/7] feat(role): LinuxGameServerManager --- roles/lgsm/defaults/main.yml | 130 +++++++++++++++++++++++++++++++++++ roles/lgsm/tasks/main.yml | 32 +++++++++ roles/lgsm/tasks/main2.yml | 24 +++++++ sandbox.yml | 1 + 4 files changed, 187 insertions(+) create mode 100644 roles/lgsm/defaults/main.yml create mode 100644 roles/lgsm/tasks/main.yml create mode 100644 roles/lgsm/tasks/main2.yml diff --git a/roles/lgsm/defaults/main.yml b/roles/lgsm/defaults/main.yml new file mode 100644 index 0000000000..262d1cf2e7 --- /dev/null +++ b/roles/lgsm/defaults/main.yml @@ -0,0 +1,130 @@ +######################################################################## +# Title: Sandbox: LGSM | Default Variables # +# Author(s): Scarabyte # +# URL: https://github.com/saltyorg/Sandbox # +# -- # +######################################################################## +# GNU General Public License v3.0 # +######################################################################## +--- +################################ +# Basics +################################ + +lgsm_instances: ["lgsm"] + +################################ +# Paths +################################ + +lgsm_paths_folder: "{{ lgsm_name }}" +lgsm_paths_location: "{{ server_appdata_path }}/{{ lgsm_paths_folder }}" +lgsm_paths_folders_list: + - "{{ lgsm_paths_location }}" + +################################ +# Web +################################ + +lgsm_web_subdomain: "{{ lgsm_name }}" +lgsm_web_domain: "{{ user.domain }}" + +################################ +# DNS +################################ + +lgsm_dns_record: "{{ lookup('vars', lgsm_name + '_web_subdomain', default=lgsm_web_subdomain) }}" +lgsm_dns_zone: "{{ lookup('vars', lgsm_name + '_web_domain', default=lgsm_web_domain) }}" +lgsm_dns_proxy: false + +################################ +# Docker +################################ + +# Container +lgsm_docker_container: "{{ lgsm_name }}" + +# Image +lgsm_docker_image_pull: true +lgsm_docker_image_repo: "gameservermanagers/gameserver" +lgsm_docker_image_tag: "{{ lgsm_name | replace('lgsm_','') }}" +lgsm_docker_image: "{{ lookup('vars', lgsm_name + '_docker_image_repo', default=lgsm_docker_image_repo) + + ':' + lookup('vars', lgsm_name + '_docker_image_tag', default=lgsm_docker_image_tag) }}" + +# Ports +lgsm_docker_ports_defaults: [] +lgsm_docker_ports_custom: [] +lgsm_docker_ports: "{{ lookup('vars', lgsm_name + '_docker_ports_defaults', default=lgsm_docker_ports_defaults) + + lookup('vars', lgsm_name + '_docker_ports_custom', default=lgsm_docker_ports_custom) }}" + +# Envs +lgsm_docker_envs_default: {} +lgsm_docker_envs_custom: {} +lgsm_docker_envs: "{{ lookup('vars', lgsm_name + '_docker_envs_default', default=lgsm_docker_envs_default) + | combine(lookup('vars', lgsm_name + '_docker_envs_custom', default=lgsm_docker_envs_custom)) }}" + +# Commands +lgsm_docker_commands_default: [] +lgsm_docker_commands_custom: [] +lgsm_docker_commands: "{{ lookup('vars', lgsm_name + '_docker_commands_default', default=lgsm_docker_commands_default) + + lookup('vars', lgsm_name + '_docker_commands_custom', default=lgsm_docker_commands_custom) }}" + +# Volumes +lgsm_docker_volumes_default: + - "{{ lgsm_paths_location }}:/data" +lgsm_docker_volumes_custom: [] +lgsm_docker_volumes: "{{ lookup('vars', lgsm_name + '_docker_volumes_default', default=lgsm_docker_volumes_default) + + lookup('vars', lgsm_name + '_docker_volumes_custom', default=lgsm_docker_volumes_custom) }}" + +# Devices +lgsm_docker_devices_default: [] +lgsm_docker_devices_custom: [] +lgsm_docker_devices: "{{ lookup('vars', lgsm_name + '_docker_devices_default', default=lgsm_docker_devices_default) + + lookup('vars', lgsm_name + '_docker_devices_custom', default=lgsm_docker_devices_custom) }}" + +# Hosts +lgsm_docker_hosts_default: [] +lgsm_docker_hosts_custom: [] +lgsm_docker_hosts: "{{ docker_hosts_common + | combine(lookup('vars', lgsm_name + '_docker_hosts_default', default=lgsm_docker_hosts_default)) + | combine(lookup('vars', lgsm_name + '_docker_hosts_custom', default=lgsm_docker_hosts_custom)) }}" + +# Labels +lgsm_docker_labels_default: {} +lgsm_docker_labels_custom: {} +lgsm_docker_labels: "{{ docker_labels_common + | combine(lookup('vars', lgsm_name + '_docker_labels_default', default=lgsm_docker_labels_default)) + | combine(lookup('vars', lgsm_name + '_docker_labels_custom', default=lgsm_docker_labels_custom)) }}" + +# Hostname +lgsm_docker_hostname: "{{ lgsm_name }}" + +# Network Mode +lgsm_docker_network_mode_default: "{{ docker_networks_name_common }}" +lgsm_docker_network_mode: "{{ lookup('vars', lgsm_name + '_docker_network_mode_default', default=lgsm_docker_network_mode_default) }}" + +# Networks +lgsm_docker_networks_alias: "{{ lgsm_name }}" +lgsm_docker_networks_default: [] +lgsm_docker_networks_custom: [] +lgsm_docker_networks: "{{ docker_networks_common + + lookup('vars', lgsm_name + '_docker_networks_default', default=lgsm_docker_networks_default) + + lookup('vars', lgsm_name + '_docker_networks_custom', default=lgsm_docker_networks_custom) }}" + +# Capabilities +lgsm_docker_capabilities_default: [] +lgsm_docker_capabilities_custom: [] +lgsm_docker_capabilities: "{{ lookup('vars', lgsm_name + '_docker_capabilities_default', default=lgsm_docker_capabilities_default) + + lookup('vars', lgsm_name + '_docker_capabilities_custom', default=lgsm_docker_capabilities_custom) }}" + +# Security Opts +lgsm_docker_security_opts_default: [] +lgsm_docker_security_opts_custom: [] +lgsm_docker_security_opts: "{{ lookup('vars', lgsm_name + '_docker_security_opts_default', default=lgsm_docker_security_opts_default) + + lookup('vars', lgsm_name + '_docker_security_opts_custom', default=lgsm_docker_security_opts_custom) }}" + +# Restart Policy +lgsm_docker_restart_policy: unless-stopped + +# State +lgsm_docker_state: started diff --git a/roles/lgsm/tasks/main.yml b/roles/lgsm/tasks/main.yml new file mode 100644 index 0000000000..b84091cf88 --- /dev/null +++ b/roles/lgsm/tasks/main.yml @@ -0,0 +1,32 @@ +######################################################################## +# Title: Sandbox: LGSM | Multi-instance Tasks # +# Author(s): scarabyte # +# URL: https://github.com/saltyorg/Sandbox # +# -- # +######################################################################## +# GNU General Public License v3.0 # +######################################################################## +--- +- name: Ensure we have instances for lgsm to install + ansible.builtin.assert: + that: + - lgsm_instances is defined + - lgsm_instances is not string + - lgsm_instances is not mapping + - lgsm_instances is iterable + - lgsm_instances | length > 1 + fail_msg: >- + LGSM was designed to use multi-instance configuration to install game servers properly. Check out https://docs.saltbox.dev/reference/multiple-instances/ + success_msg: >- + Detected multi-instance configuration. + +- name: "Execute lgsm roles" + ansible.builtin.include_tasks: main2.yml + vars: + lgsm_name: "{{ role }}" + with_items: "{{ lgsm_instances }}" + loop_control: + loop_var: role + when: + - role != "lgsm" + diff --git a/roles/lgsm/tasks/main2.yml b/roles/lgsm/tasks/main2.yml new file mode 100644 index 0000000000..13d45a0ac0 --- /dev/null +++ b/roles/lgsm/tasks/main2.yml @@ -0,0 +1,24 @@ +######################################################################## +# Title: Sandbox: LGSM | Deployment Tasks # +# Author(s): scarabyte # +# URL: https://github.com/saltyorg/Sandbox # +# -- # +######################################################################## +# GNU General Public License v3.0 # +######################################################################## +--- +- name: Add DNS record + ansible.builtin.include_tasks: "{{ resources_tasks_path }}/dns/tasker.yml" + vars: + dns_record: "{{ lookup('vars', role_name + '_dns_record') }}" + dns_zone: "{{ lookup('vars', role_name + '_dns_zone') }}" + dns_proxy: "{{ lookup('vars', role_name + '_dns_proxy') }}" + +- name: Remove existing Docker container + ansible.builtin.include_tasks: "{{ resources_tasks_path }}/docker/remove_docker_container.yml" + +- name: Create directories + ansible.builtin.include_tasks: "{{ resources_tasks_path }}/directories/create_directories.yml" + +- name: Create Docker container + ansible.builtin.include_tasks: "{{ resources_tasks_path }}/docker/create_docker_container.yml" diff --git a/sandbox.yml b/sandbox.yml index aaf608fc92..ae364c03cf 100644 --- a/sandbox.yml +++ b/sandbox.yml @@ -90,6 +90,7 @@ - { role: komga, tags: ['komga'] } - { role: krusader, tags: ['krusader'] } - { role: lazylibrarian, tags: ['lazylibrarian'] } + - { role: lgsm, tags: ['lgsm'] } - { role: linkding, tags: ['linkding'] } - { role: logarr, tags: ['logarr'] } - { role: lunasea, tags: ['lunasea'] } From 804e3d5dc96e6eccf76bef2a21deecf7a4aeea43 Mon Sep 17 00:00:00 2001 From: Scarabyte Date: Sun, 21 Jan 2024 23:15:30 +0100 Subject: [PATCH 2/7] Fix lint issues --- roles/lgsm/defaults/main.yml | 2 +- roles/lgsm/tasks/main.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/roles/lgsm/defaults/main.yml b/roles/lgsm/defaults/main.yml index 262d1cf2e7..48f0ea05b2 100644 --- a/roles/lgsm/defaults/main.yml +++ b/roles/lgsm/defaults/main.yml @@ -47,7 +47,7 @@ lgsm_docker_container: "{{ lgsm_name }}" # Image lgsm_docker_image_pull: true lgsm_docker_image_repo: "gameservermanagers/gameserver" -lgsm_docker_image_tag: "{{ lgsm_name | replace('lgsm_','') }}" +lgsm_docker_image_tag: "{{ lgsm_name | replace('lgsm_', '') }}" lgsm_docker_image: "{{ lookup('vars', lgsm_name + '_docker_image_repo', default=lgsm_docker_image_repo) + ':' + lookup('vars', lgsm_name + '_docker_image_tag', default=lgsm_docker_image_tag) }}" diff --git a/roles/lgsm/tasks/main.yml b/roles/lgsm/tasks/main.yml index b84091cf88..3a59dfd0f7 100644 --- a/roles/lgsm/tasks/main.yml +++ b/roles/lgsm/tasks/main.yml @@ -29,4 +29,3 @@ loop_var: role when: - role != "lgsm" - From 2bb8c9d3fa59ce56ae6a2841c639c40acc0a3615 Mon Sep 17 00:00:00 2001 From: Scarabyte Date: Tue, 23 Jan 2024 06:00:09 +0100 Subject: [PATCH 3/7] fix(role): Change requirements for assert fix(role): Change instance to be empty at start --- roles/lgsm/defaults/main.yml | 2 +- roles/lgsm/tasks/main.yml | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/roles/lgsm/defaults/main.yml b/roles/lgsm/defaults/main.yml index 48f0ea05b2..e6682ecf94 100644 --- a/roles/lgsm/defaults/main.yml +++ b/roles/lgsm/defaults/main.yml @@ -11,7 +11,7 @@ # Basics ################################ -lgsm_instances: ["lgsm"] +lgsm_instances: [] ################################ # Paths diff --git a/roles/lgsm/tasks/main.yml b/roles/lgsm/tasks/main.yml index 3a59dfd0f7..53e19ffc3b 100644 --- a/roles/lgsm/tasks/main.yml +++ b/roles/lgsm/tasks/main.yml @@ -10,11 +10,9 @@ - name: Ensure we have instances for lgsm to install ansible.builtin.assert: that: - - lgsm_instances is defined - - lgsm_instances is not string - lgsm_instances is not mapping - lgsm_instances is iterable - - lgsm_instances | length > 1 + - lgsm_instances | length > 0 fail_msg: >- LGSM was designed to use multi-instance configuration to install game servers properly. Check out https://docs.saltbox.dev/reference/multiple-instances/ success_msg: >- @@ -27,5 +25,3 @@ with_items: "{{ lgsm_instances }}" loop_control: loop_var: role - when: - - role != "lgsm" From 92e0aac2261e713a72683a28b6687fcb59e60b17 Mon Sep 17 00:00:00 2001 From: salty Date: Tue, 23 Jan 2024 06:04:32 +0100 Subject: [PATCH 4/7] lgsm: disable CI --- sandbox.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sandbox.yml b/sandbox.yml index ae364c03cf..73e2646807 100644 --- a/sandbox.yml +++ b/sandbox.yml @@ -90,7 +90,6 @@ - { role: komga, tags: ['komga'] } - { role: krusader, tags: ['krusader'] } - { role: lazylibrarian, tags: ['lazylibrarian'] } - - { role: lgsm, tags: ['lgsm'] } - { role: linkding, tags: ['linkding'] } - { role: logarr, tags: ['logarr'] } - { role: lunasea, tags: ['lunasea'] } @@ -186,3 +185,5 @@ - { role: your_spotify, tags: ['your-spotify'] } - { role: znc, tags: ['znc'] } # Apps End + # No CI + - { role: lgsm, tags: ['lgsm'] } From fee4e0b7ef5fd319d21005e5f6602ad5932149ed Mon Sep 17 00:00:00 2001 From: Scarabyte Date: Tue, 23 Jan 2024 06:04:50 +0100 Subject: [PATCH 5/7] fix(role): instances are list only --- roles/lgsm/tasks/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/roles/lgsm/tasks/main.yml b/roles/lgsm/tasks/main.yml index 53e19ffc3b..75a5c348d6 100644 --- a/roles/lgsm/tasks/main.yml +++ b/roles/lgsm/tasks/main.yml @@ -10,6 +10,7 @@ - name: Ensure we have instances for lgsm to install ansible.builtin.assert: that: + - lgsm_instances is not string - lgsm_instances is not mapping - lgsm_instances is iterable - lgsm_instances | length > 0 From e917595fcbcb8569a38fdef72035d23318719d2a Mon Sep 17 00:00:00 2001 From: salty Date: Tue, 23 Jan 2024 06:06:16 +0100 Subject: [PATCH 6/7] lgsm: add lgsm to check_missing_entries --- scripts/check_missing_entries.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/check_missing_entries.sh b/scripts/check_missing_entries.sh index db58553a95..574cc8088d 100755 --- a/scripts/check_missing_entries.sh +++ b/scripts/check_missing_entries.sh @@ -6,7 +6,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Assume sandbox.yml is in the project root, adjust if necessary PROJECT_ROOT="$SCRIPT_DIR/.." -app_list=$(awk '/# Apps Start/{flag=1;next}/# Apps End/{flag=0}flag' "$PROJECT_ROOT/sandbox.yml" | awk '!/#/' | awk -F',|:' '/role/ {print $2}' | tr -d ' ' | grep -v -E "(settings|sanity_check)" | sort -u | tr '\n' ',' | sed 's/,$//') +app_list=$(awk '/# Apps Start/{flag=1;next}/# Apps End/{flag=0}flag' "$PROJECT_ROOT/sandbox.yml" | awk '!/#/' | awk -F',|:' '/role/ {print $2}' | tr -d ' ' | grep -v -E "(settings|sanity_check|lgsm)" | sort -u | tr '\n' ',' | sed 's/,$//') folder_list=$(ls "$PROJECT_ROOT/roles" | grep -v -E "(settings|sanity_check)" | tr '\n' ',' | sed 's/,$//') missing_app=$(comm -23 <(echo $app_list | tr ',' '\n' | sort) <(echo $folder_list | tr ',' '\n' | sort)) missing_folder=$(comm -13 <(echo $app_list | tr ',' '\n' | sort) <(echo $folder_list | tr ',' '\n' | sort)) From cff89c53791bf44ef908d2b3c5fb704d7ef3f489 Mon Sep 17 00:00:00 2001 From: salty Date: Tue, 23 Jan 2024 06:07:20 +0100 Subject: [PATCH 7/7] lgsm: add lgsm to check_missing_entries v2 --- scripts/check_missing_entries.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/check_missing_entries.sh b/scripts/check_missing_entries.sh index 574cc8088d..d7916d8d98 100755 --- a/scripts/check_missing_entries.sh +++ b/scripts/check_missing_entries.sh @@ -7,7 +7,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$SCRIPT_DIR/.." app_list=$(awk '/# Apps Start/{flag=1;next}/# Apps End/{flag=0}flag' "$PROJECT_ROOT/sandbox.yml" | awk '!/#/' | awk -F',|:' '/role/ {print $2}' | tr -d ' ' | grep -v -E "(settings|sanity_check|lgsm)" | sort -u | tr '\n' ',' | sed 's/,$//') -folder_list=$(ls "$PROJECT_ROOT/roles" | grep -v -E "(settings|sanity_check)" | tr '\n' ',' | sed 's/,$//') +folder_list=$(ls "$PROJECT_ROOT/roles" | grep -v -E "(settings|sanity_check|lgsm)" | tr '\n' ',' | sed 's/,$//') missing_app=$(comm -23 <(echo $app_list | tr ',' '\n' | sort) <(echo $folder_list | tr ',' '\n' | sort)) missing_folder=$(comm -13 <(echo $app_list | tr ',' '\n' | sort) <(echo $folder_list | tr ',' '\n' | sort))