diff --git a/ansible/roles/semaphore/defaults/main.yml b/ansible/roles/semaphore/defaults/main.yml index 102b441..4dde162 100644 --- a/ansible/roles/semaphore/defaults/main.yml +++ b/ansible/roles/semaphore/defaults/main.yml @@ -1,5 +1,26 @@ --- -# file: roles/semaphore/defaults/main.yml +# Semaphore version +semaphore_version: "v2.10.3" -semaphore_compose_dir: /opt/docker/semaphore -semaphore_ssh_key_file: "~/.ssh/ansible" +# Service account +semaphore_user: cast +semaphore_group: cast + +# Container settings +semaphore_container_name: semaphore +semaphore_image: "semaphoreui/semaphore:{{ semaphore_version }}" + +# Paths +semaphore_data_dir: /var/lib/semaphore +semaphore_config_dir: /etc/semaphore + +# Port +semaphore_port: 3000 + +# Database +semaphore_db_type: bolt +semaphore_db_path: "{{ semaphore_data_dir }}/database.boltdb" + +# Vault variables (defined in group_vars/all/vault) +# vault_semaphore_admin_password +# vault_semaphore_access_key_encryption \ No newline at end of file diff --git a/ansible/roles/semaphore/handlers/main.yml b/ansible/roles/semaphore/handlers/main.yml index 7df1109..c2579d3 100644 --- a/ansible/roles/semaphore/handlers/main.yml +++ b/ansible/roles/semaphore/handlers/main.yml @@ -1,7 +1,4 @@ --- -# file: roles/semaphore/handlers/main.yml - -- name: Restart Semaphore - community.docker.docker_compose_v2: - project_src: "{{ semaphore_compose_dir }}" - state: restarted +- name: reload systemd + ansible.builtin.systemd: + daemon_reload: true \ No newline at end of file diff --git a/ansible/roles/semaphore/meta/main.yml b/ansible/roles/semaphore/meta/main.yml new file mode 100644 index 0000000..25b13ba --- /dev/null +++ b/ansible/roles/semaphore/meta/main.yml @@ -0,0 +1,4 @@ +--- +dependencies: + - role: podman + when: podman_install | default(true) \ No newline at end of file diff --git a/ansible/roles/semaphore/tasks/main.yml b/ansible/roles/semaphore/tasks/main.yml index 227f5ff..9dee3df 100644 --- a/ansible/roles/semaphore/tasks/main.yml +++ b/ansible/roles/semaphore/tasks/main.yml @@ -1,50 +1,48 @@ --- -# file: roles/semaphore/tasks/main.yml - -- name: Create Semaphore directory - ansible.builtin.file: - path: "{{ semaphore_compose_dir }}" - state: directory - owner: wed - group: docker - mode: '0755' - -- name: Copy Compose file from boilerplate - ansible.builtin.copy: - src: "{{ playbook_dir }}/../../boilerplates/semaphore/compose.yaml" - dest: "{{ semaphore_compose_dir }}/compose.yaml" - owner: wed - group: docker - mode: '0644' - -- name: Deploy Semaphore .env file - ansible.builtin.template: - src: env.j2 - dest: "{{ semaphore_compose_dir }}/.env" - owner: wed - group: docker - mode: '0600' - -- name: Copy SSH key for Ansible authentication - ansible.builtin.copy: - src: "{{ semaphore_ssh_key_file }}" - dest: "{{ semaphore_compose_dir }}/ansible_key" - owner: "1001" - group: "1001" - mode: '0600' - -- name: Start Semaphore containers - community.docker.docker_compose_v2: - project_src: "{{ semaphore_compose_dir }}" +- name: Ensure cast group exists + ansible.builtin.group: + name: "{{ semaphore_group }}" state: present - register: semaphore_compose + system: true -- name: Wait for Semaphore to be ready - ansible.builtin.uri: - url: "http://localhost:3000/api/ping" - method: GET - status_code: 200 - register: semaphore_health - retries: 48 - delay: 5 - until: semaphore_health.status == 200 +- name: Ensure cast user exists + ansible.builtin.user: + name: "{{ semaphore_user }}" + group: "{{ semaphore_group }}" + shell: /bin/bash + create_home: true + state: present + +- name: Create Semaphore data directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ semaphore_user }}" + group: "{{ semaphore_group }}" + mode: "0755" + loop: + - "{{ semaphore_data_dir }}" + - "{{ semaphore_config_dir }}" + +- name: Create Quadlet file for Semaphore + ansible.builtin.template: + src: semaphore.container.j2 + dest: "/etc/containers/systemd/{{ semaphore_container_name }}.container" + owner: root + group: root + mode: "0644" + notify: reload systemd + +- name: Ensure Semaphore container is started + ansible.builtin.systemd: + name: "{{ semaphore_container_name }}" + state: started + enabled: true + daemon_reload: true + +- name: Wait for Semaphore to become available + ansible.builtin.wait_for: + host: "127.0.0.1" + port: "{{ semaphore_port }}" + delay: 5 + timeout: 60 \ No newline at end of file diff --git a/ansible/roles/semaphore/templates/semaphore.container.j2 b/ansible/roles/semaphore/templates/semaphore.container.j2 new file mode 100644 index 0000000..b08afc3 --- /dev/null +++ b/ansible/roles/semaphore/templates/semaphore.container.j2 @@ -0,0 +1,25 @@ +[Unit] +Description=Semaphore UI +After=network-online.target +Wants=network-online.target + +[Container] +Image={{ semaphore_image }} +ContainerName={{ semaphore_container_name }} +PublishPort={{ semaphore_port }}:3000 +Volume={{ semaphore_data_dir }}:/var/lib/semaphore:Z +Volume={{ semaphore_config_dir }}:/etc/semaphore:Z +Environment=SEMAPHORE_DB_TYPE={{ semaphore_db_type }} +Environment=SEMAPHORE_DB_PATH={{ semaphore_db_path }} +Environment=SEMAPHORE_ADMIN=admin +Environment=SEMAPHORE_ADMIN_PASSWORD={{ vault_semaphore_admin_password }} +Environment=SEMAPHORE_ACCESS_KEY_ENCRYPTION={{ vault_semaphore_access_key_encryption }} +User={{ semaphore_user }} +Group={{ semaphore_group }} +Restart=always + +[Service] +Restart=always + +[Install] +WantedBy=multi-user.target