--- - name: 📂 Create runner instance {{ runner_instance }} directory file: path: "{{ RUNNER_INSTALL_DIR }}/{{ runner_instance }}" state: directory owner: "{{ RUNNER_USER }}" group: "{{ RUNNER_USER }}" mode: "0755" - name: 🔍 Check runner binary installed for instance {{ runner_instance }} ansible.builtin.stat: path: "{{ RUNNER_INSTALL_DIR }}/{{ runner_instance }}/run.sh" register: _runner_binary_stat - name: 📦 Extract runner archive for instance {{ runner_instance }} unarchive: # nocheck: stack-host-consumer (node-local runner: every node extracts its own run.sh) src: "{{ RUNNER_INSTALL_DIR }}/actions-runner.tar.gz" dest: "{{ RUNNER_INSTALL_DIR }}/{{ runner_instance }}" remote_src: true owner: "{{ RUNNER_USER }}" group: "{{ RUNNER_USER }}" when: not _runner_binary_stat.stat.exists - name: 🔍 Find runner configuration for instance {{ runner_instance }} ansible.builtin.find: paths: "{{ RUNNER_INSTALL_DIR }}/{{ runner_instance }}" patterns: ".*" hidden: true file_type: file depth: 1 register: _runner_config_files - name: 🗑️ Delete stale runner config files for instance {{ runner_instance }} ansible.builtin.file: path: "{{ item.path }}" state: absent loop: "{{ _runner_config_files.files }}" loop_control: label: "{{ item.path }}" when: item.path | basename not in ['.env'] - name: 📄 Write runner environment file for instance {{ runner_instance }} template: # nocheck: stack-host-template (node-local runner: each node registers its own instances) src: runner_instance_env.j2 dest: "{{ RUNNER_INSTALL_DIR }}/{{ runner_instance }}/.env" owner: "{{ RUNNER_USER }}" group: "{{ RUNNER_USER }}" mode: "0600"