@@ -25,12 +25,30 @@ |
| 25 | 25 | unless the shithubd-runner systemd unit's ReadWritePaths= hardening is |
| 26 | 26 | updated with the matching path. |
| 27 | 27 | |
| 28 | +- name: Runner Docker bridge name fits Linux interface limit |
| 29 | + assert: |
| 30 | + that: |
| 31 | + - (shithub_runner_network_bridge | string | length) <= 15 |
| 32 | + fail_msg: >- |
| 33 | + shithub_runner_network_bridge must be 15 characters or fewer because |
| 34 | + Linux interface names are capped by IFNAMSIZ. |
| 35 | + |
| 28 | 36 | - name: Docker group exists |
| 29 | 37 | getent: |
| 30 | 38 | database: group |
| 31 | 39 | key: docker |
| 32 | 40 | when: shithub_runner_engine == "docker" |
| 33 | 41 | |
| 42 | +- name: Runner network firewall packages |
| 43 | + apt: |
| 44 | + name: |
| 45 | + - dnsmasq |
| 46 | + - ipset |
| 47 | + - iptables |
| 48 | + state: present |
| 49 | + update_cache: yes |
| 50 | + when: shithub_runner_engine == "docker" |
| 51 | + |
| 34 | 52 | - name: Runner group |
| 35 | 53 | group: |
| 36 | 54 | name: shithub-runner |
@@ -60,6 +78,50 @@ |
| 60 | 78 | - { path: "{{ shithub_runner_workspace_root }}", owner: shithub-runner, group: shithub-runner, mode: "0750" } |
| 61 | 79 | - { path: /var/lib/shithubd-runner/binaries, owner: shithub-runner, group: shithub-runner, mode: "0750" } |
| 62 | 80 | |
| 81 | +- name: Inspect Actions Docker network |
| 82 | + command: "{{ shithub_runner_engine }} network inspect {{ shithub_runner_network }}" |
| 83 | + register: shithub_runner_network_inspect |
| 84 | + failed_when: shithub_runner_network_inspect.rc not in [0, 1] |
| 85 | + changed_when: false |
| 86 | + when: shithub_runner_engine == "docker" and not ansible_check_mode |
| 87 | + |
| 88 | +- name: Create Actions Docker network |
| 89 | + command: >- |
| 90 | + {{ shithub_runner_engine }} network create |
| 91 | + --driver bridge |
| 92 | + --subnet {{ shithub_runner_network_subnet }} |
| 93 | + --gateway {{ shithub_runner_network_gateway }} |
| 94 | + --opt com.docker.network.bridge.name={{ shithub_runner_network_bridge }} |
| 95 | + {{ shithub_runner_network }} |
| 96 | + when: |
| 97 | + - shithub_runner_engine == "docker" |
| 98 | + - not ansible_check_mode |
| 99 | + - shithub_runner_network_inspect.rc == 1 |
| 100 | + |
| 101 | +- name: Inspect Actions Docker network after converge |
| 102 | + command: "{{ shithub_runner_engine }} network inspect {{ shithub_runner_network }}" |
| 103 | + register: shithub_runner_network_final |
| 104 | + changed_when: false |
| 105 | + when: shithub_runner_engine == "docker" and not ansible_check_mode |
| 106 | + |
| 107 | +- name: Record Actions Docker network facts |
| 108 | + set_fact: |
| 109 | + shithub_runner_network_info: "{{ (shithub_runner_network_final.stdout | from_json)[0] }}" |
| 110 | + when: shithub_runner_engine == "docker" and not ansible_check_mode |
| 111 | + |
| 112 | +- name: Actions Docker network matches runner firewall config |
| 113 | + assert: |
| 114 | + that: |
| 115 | + - shithub_runner_network_info.Driver == "bridge" |
| 116 | + - shithub_runner_network_info.Options["com.docker.network.bridge.name"] == shithub_runner_network_bridge |
| 117 | + - shithub_runner_network_info.IPAM.Config[0].Subnet == shithub_runner_network_subnet |
| 118 | + - shithub_runner_network_info.IPAM.Config[0].Gateway == shithub_runner_network_gateway |
| 119 | + fail_msg: >- |
| 120 | + Existing Docker network {{ shithub_runner_network }} does not match the |
| 121 | + configured Actions subnet/gateway/bridge. Remove or rename the network |
| 122 | + before re-running the role so firewall rules target the correct bridge. |
| 123 | + when: shithub_runner_engine == "docker" and not ansible_check_mode |
| 124 | + |
| 63 | 125 | - name: Upload shithubd-runner binary (built by `make build` locally) |
| 64 | 126 | copy: |
| 65 | 127 | src: "{{ playbook_dir }}/../../bin/shithubd-runner" |
@@ -107,8 +169,35 @@ |
| 107 | 169 | src: "{{ playbook_dir }}/../runner-config/dnsmasq.conf.j2" |
| 108 | 170 | dest: "{{ shithub_runner_dnsmasq_config }}" |
| 109 | 171 | owner: root |
| 110 | | - group: shithub-runner |
| 111 | | - mode: "0640" |
| 172 | + group: root |
| 173 | + mode: "0644" |
| 174 | + notify: restart dnsmasq |
| 175 | + |
| 176 | +- name: Runner firewall script |
| 177 | + template: |
| 178 | + src: "{{ playbook_dir }}/../runner-config/firewall.sh.j2" |
| 179 | + dest: "{{ shithub_runner_firewall_script }}" |
| 180 | + owner: root |
| 181 | + group: root |
| 182 | + mode: "0755" |
| 183 | + notify: restart shithub-runner-firewall |
| 184 | + |
| 185 | +- name: Runner firewall systemd unit |
| 186 | + copy: |
| 187 | + src: "{{ playbook_dir }}/../systemd/shithub-runner-firewall.service" |
| 188 | + dest: /etc/systemd/system/shithub-runner-firewall.service |
| 189 | + mode: "0644" |
| 190 | + notify: [daemon-reload, restart shithub-runner-firewall] |
| 191 | + |
| 192 | +- name: Enable + start runner firewall |
| 193 | + systemd: |
| 194 | + name: shithub-runner-firewall |
| 195 | + state: started |
| 196 | + enabled: yes |
| 197 | + daemon_reload: yes |
| 198 | + |
| 199 | +- name: Enable + start runner dnsmasq |
| 200 | + systemd: { name: dnsmasq, state: started, enabled: yes } |
| 112 | 201 | |
| 113 | 202 | - name: Runner systemd unit |
| 114 | 203 | copy: |