From bf6ac1188804142916b5a10ee64585032ae5f58f Mon Sep 17 00:00:00 2001 From: ytshih Date: Thu, 19 Dec 2024 10:25:37 +0800 Subject: [PATCH] Initial commit --- .gitea/workflows/lint.yml | 17 ++ .gitignore | 1 + README.md | 47 +++++ ansible.cfg | 4 + group_vars/cms/main.yml | 2 + hosts | 8 + playbooks/install.yml | 9 + roles/add_helper_scripts/files/import.bash | 12 ++ roles/add_helper_scripts/files/users.bash | 10 + roles/add_helper_scripts/tasks/main.yml | 15 ++ roles/cms_preparation/files/bash_profile | 1 + roles/cms_preparation/files/bashrc | 1 + roles/cms_preparation/files/profile | 4 + roles/cms_preparation/tasks/main.yml | 104 ++++++++++ roles/configure_cms/files/cms-log.service | 22 ++ roles/configure_cms/files/cms-rank.service | 22 ++ roles/configure_cms/files/cms@.service | 24 +++ roles/configure_cms/tasks/main.yml | 46 +++++ roles/configure_cms/templates/cms.conf.jinja | 193 ++++++++++++++++++ .../templates/cms.ranking.conf.jinja | 16 ++ roles/configure_haproxy/handlers/main.yml | 5 + roles/configure_haproxy/tasks/main.yml | 14 ++ .../templates/haproxy.cfg.jinja | 69 +++++++ roles/install_packages/handlers/main.yml | 4 + roles/install_packages/tasks/main.yml | 34 +++ roles/setup_cgroupsv1/handlers/main.yml | 3 + roles/setup_cgroupsv1/tasks/main.yml | 13 ++ roles/setup_database/tasks/main.yml | 42 ++++ 28 files changed, 742 insertions(+) create mode 100644 .gitea/workflows/lint.yml create mode 100644 .gitignore create mode 100644 README.md create mode 100644 ansible.cfg create mode 100644 group_vars/cms/main.yml create mode 100644 hosts create mode 100644 playbooks/install.yml create mode 100644 roles/add_helper_scripts/files/import.bash create mode 100644 roles/add_helper_scripts/files/users.bash create mode 100644 roles/add_helper_scripts/tasks/main.yml create mode 100644 roles/cms_preparation/files/bash_profile create mode 100644 roles/cms_preparation/files/bashrc create mode 100644 roles/cms_preparation/files/profile create mode 100644 roles/cms_preparation/tasks/main.yml create mode 100644 roles/configure_cms/files/cms-log.service create mode 100644 roles/configure_cms/files/cms-rank.service create mode 100644 roles/configure_cms/files/cms@.service create mode 100644 roles/configure_cms/tasks/main.yml create mode 100644 roles/configure_cms/templates/cms.conf.jinja create mode 100644 roles/configure_cms/templates/cms.ranking.conf.jinja create mode 100644 roles/configure_haproxy/handlers/main.yml create mode 100644 roles/configure_haproxy/tasks/main.yml create mode 100644 roles/configure_haproxy/templates/haproxy.cfg.jinja create mode 100644 roles/install_packages/handlers/main.yml create mode 100644 roles/install_packages/tasks/main.yml create mode 100644 roles/setup_cgroupsv1/handlers/main.yml create mode 100644 roles/setup_cgroupsv1/tasks/main.yml create mode 100644 roles/setup_database/tasks/main.yml diff --git a/.gitea/workflows/lint.yml b/.gitea/workflows/lint.yml new file mode 100644 index 0000000..b89fcbd --- /dev/null +++ b/.gitea/workflows/lint.yml @@ -0,0 +1,17 @@ +name: Ansible Playbook lint +on: [push] + +jobs: + ansible-lint: + runs-on: imgbuilder + container: + image: gitea.konchin.com/system/ansible-image + credentials: + username: ${{ secrets.REGISTRY_USERNAME }} + password: ${{ secrets.REGISTRY_PASSWORD }} + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Ansible Lint + run: | + ansible-lint roles/ playbooks/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c3d2f84 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +group_vars/*/secret.yml diff --git a/README.md b/README.md new file mode 100644 index 0000000..e10da8a --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# Ansible Playbook for CMS - Contest Management System + +## Installation + +- Works on ArchLinux with systemd-boot. +- Just run `ansible-playbook playbooks/install.yml`. + +## Configure CMS Contests + +- Run `sudo -iu cmsuser` to login cmsuser. +- Run `cmsAddAdmin kcw` to create admin user. +- Run `cmsAdminWebServer` to open a temporary admin webserver. + - which opens on port 8889 or `-admin.` on port 80. +- You can start / enable `cms@.service` after contest setup. + +## Configure group vars secret + +```yaml +# group_vars/cms/secret.yml +--- +username: cmsuser +password: example_p4ssword +dns_prefix: cms-test +dns_suffix: example.com +``` + +## Import Users + +- Create a username / password mapping in `/srv/cms/passwd`. + e.g. +``` +111550087 ThisIsARandomPassword +``` +- Run `./users.bash` to generate `contest.yaml`. +- Run `cmsImportUser -A -c .`. + +### Delete all users from contest + +Since you can't import users if they were already in the database. \ +You'll need to delete them manually before import. + +- Run `cut -d' ' -f1 passwd | xargs cmsRemoverUser` + +## Import Tasks + +- Put polygon zips in `/tmp/kcw*-.zip`. +- Run `./import.bash` and wait. diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..98ff67c --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,4 @@ +[defaults] +roles_path=./roles/ +inventory=./hosts +remote_user=root diff --git a/group_vars/cms/main.yml b/group_vars/cms/main.yml new file mode 100644 index 0000000..bebc832 --- /dev/null +++ b/group_vars/cms/main.yml @@ -0,0 +1,2 @@ +--- +setup_cgroupsv1_bootconf: /boot/loader/entries/arch.conf diff --git a/hosts b/hosts new file mode 100644 index 0000000..27ebdc1 --- /dev/null +++ b/hosts @@ -0,0 +1,8 @@ +[control] +localhost ansible_connection=local + +[cms] +test3.konchin.com + +[all:vars] +ansible_python_interpreter=/usr/bin/python diff --git a/playbooks/install.yml b/playbooks/install.yml new file mode 100644 index 0000000..2223264 --- /dev/null +++ b/playbooks/install.yml @@ -0,0 +1,9 @@ +--- +- name: Install cms + hosts: cms + roles: + - role: setup_cgroupsv1 + - role: install_packages + - role: cms_preparation + - role: setup_database + - role: configure_cms diff --git a/roles/add_helper_scripts/files/import.bash b/roles/add_helper_scripts/files/import.bash new file mode 100644 index 0000000..1a2958b --- /dev/null +++ b/roles/add_helper_scripts/files/import.bash @@ -0,0 +1,12 @@ +#!/usr/bin/env -S bash + +mapfile -t files <<< "$(ls -1 /tmp/kcw-*.zip)" + +for file in ${files[@]}; do + echo "target: $file" + dir=$(cut -d'$' -f1 <<< "$file") + if ! [[ -d "$dir" ]]; then + unzip -d "$dir" "$file" + fi + cmsImportTask "$dir" +done diff --git a/roles/add_helper_scripts/files/users.bash b/roles/add_helper_scripts/files/users.bash new file mode 100644 index 0000000..8ab2885 --- /dev/null +++ b/roles/add_helper_scripts/files/users.bash @@ -0,0 +1,10 @@ +#!/usr/bin/env -S bash +cat > contest.yaml <> contest.yaml + +less contest.yaml diff --git a/roles/add_helper_scripts/tasks/main.yml b/roles/add_helper_scripts/tasks/main.yml new file mode 100644 index 0000000..e7430ef --- /dev/null +++ b/roles/add_helper_scripts/tasks/main.yml @@ -0,0 +1,15 @@ +--- +- name: Copy users.bash + ansible.builtin.copy: + src: users.bash + dest: /srv/cms/users.bash + mode: '0755' + owner: cmsuser + group: cmsuser +- name: Copy import.bash + ansible.builtin.copy: + src: import.bash + dest: /srv/cms/import.bash + mode: '0755' + owner: cmsuser + group: cmsuser diff --git a/roles/cms_preparation/files/bash_profile b/roles/cms_preparation/files/bash_profile new file mode 100644 index 0000000..83882e8 --- /dev/null +++ b/roles/cms_preparation/files/bash_profile @@ -0,0 +1 @@ +source "$HOME/.bashrc" diff --git a/roles/cms_preparation/files/bashrc b/roles/cms_preparation/files/bashrc new file mode 100644 index 0000000..af4a10e --- /dev/null +++ b/roles/cms_preparation/files/bashrc @@ -0,0 +1 @@ +source "$HOME/.profile" diff --git a/roles/cms_preparation/files/profile b/roles/cms_preparation/files/profile new file mode 100644 index 0000000..12f82ae --- /dev/null +++ b/roles/cms_preparation/files/profile @@ -0,0 +1,4 @@ +export PYENV_ROOT="$HOME/.pyenv" +[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH" +eval "$(pyenv init -)" +source "$HOME/bin/activate" diff --git a/roles/cms_preparation/tasks/main.yml b/roles/cms_preparation/tasks/main.yml new file mode 100644 index 0000000..637aa4b --- /dev/null +++ b/roles/cms_preparation/tasks/main.yml @@ -0,0 +1,104 @@ +--- +- name: Clone repository + ansible.builtin.git: + repo: 'https://github.com/cms-dev/cms.git' + dest: /srv/cms + version: b77c87b4d60fbe7df60dc5e03d2be632a25992fe + single_branch: true + track_submodules: true + update: false +- name: Run prerequisites + ansible.builtin.command: | + python prerequisites.py -y --as-root install + args: + chdir: /srv/cms + register: ret + changed_when: ret.rc != 0 +- name: Modify cmsuser + ansible.builtin.user: + name: cmsuser + shell: /usr/bin/bash + home: /srv/cms + groups: wheel + append: true +- name: Allow wheel group to sudo + community.general.sudoers: + name: wheel + group: wheel + commands: ALL + runas: ALL + nopassword: true +- name: Chown cms directory + ansible.builtin.file: + path: /srv/cms/ + state: directory + owner: cmsuser + group: cmsuser + recurse: true +- name: Install pyenv + ansible.builtin.command: | + pyenv install 3.8.20 --skip-existing + args: + chdir: /srv/cms + become: true + become_user: cmsuser + register: ret + changed_when: ret.rc != 0 +- name: Setup pyenv + ansible.builtin.command: | + pyenv local 3.8.20 + args: + chdir: /srv/cms + become: true + become_user: cmsuser + register: ret + changed_when: ret.rc != 0 +- name: Setup .profile + ansible.builtin.copy: + src: profile + dest: /srv/cms/.profile + mode: '0644' + owner: cmsuser + group: cmsuser +- name: Setup .bashrc + ansible.builtin.copy: + src: bashrc + dest: /srv/cms/.bashrc + mode: '0644' + owner: cmsuser + group: cmsuser +- name: Setup .bash_profile + ansible.builtin.copy: + src: bash_profile + dest: /srv/cms/.bash_profile + mode: '0644' + owner: cmsuser + group: cmsuser +- name: Check python version + ansible.builtin.shell: | + sudo -iu cmsuser <