/
/
/
Ansible role that deployes services on my runner machine
1---
2# Runner Services - LiveKit WebRTC Conferencing Stack
3# livekit-server (SFU) + LiveKit Meet (browser frontend + token generator)
4
5- name: Create LiveKit configuration directory structure
6 file:
7 path: "{{ item }}"
8 state: directory
9 owner: "{{ runner_user }}"
10 group: "{{ runner_group }}"
11 mode: '2775'
12 loop:
13 - "{{ livekit_config_dir }}"
14 - "{{ livekit_data_dir }}"
15
16- name: Create LiveKit server configuration
17 template:
18 src: livekit-config.yaml.j2
19 dest: "{{ livekit_config_dir }}/livekit.yaml"
20 owner: "{{ runner_user }}"
21 group: "{{ runner_group }}"
22 mode: '0640'
23 notify: restart livekit
24
25- name: Create LiveKit Meet environment file
26 template:
27 src: livekit.env.j2
28 dest: "{{ livekit_config_dir }}/.env"
29 owner: "{{ runner_user }}"
30 group: "{{ runner_group }}"
31 mode: '0640'
32 notify: restart livekit
33
34- name: Create LiveKit Meet Dockerfile
35 template:
36 src: livekit-meet-Dockerfile.j2
37 dest: "{{ livekit_config_dir }}/Dockerfile.meet"
38 owner: "{{ runner_user }}"
39 group: "{{ runner_group }}"
40 mode: '0664'
41 register: livekit_meet_dockerfile
42 notify: restart livekit
43
44- name: Create LiveKit Docker Compose file
45 template:
46 src: livekit-compose.yml.j2
47 dest: "{{ livekit_config_dir }}/docker-compose.yml"
48 owner: "{{ runner_user }}"
49 group: "{{ runner_group }}"
50 mode: '0664'
51 notify: restart livekit
52
53# The Meet image is built from source. Rebuild only when the Dockerfile
54# changes or the image is absent, so repeat runs stay idempotent.
55- name: Check if LiveKit Meet image exists
56 community.docker.docker_image_info:
57 name: "livekit-meet:{{ livekit_meet_repo_version }}"
58 register: livekit_meet_image_info
59 check_mode: no
60
61- name: Build LiveKit Meet image
62 community.docker.docker_compose_v2:
63 project_src: "{{ livekit_config_dir }}"
64 build: always
65 state: present
66 services:
67 - livekit-meet
68 when: >
69 livekit_meet_dockerfile is changed
70 or (livekit_meet_image_info.images | default([]) | length == 0)
71 check_mode: no
72
73- name: Start LiveKit stack
74 community.docker.docker_compose_v2:
75 project_src: "{{ livekit_config_dir }}"
76 state: present
77 register: livekit_start_result
78 check_mode: no
79
80- name: Wait for LiveKit server to be healthy
81 uri:
82 url: "http://localhost:{{ livekit_port }}/"
83 method: GET
84 status_code: [200, 404]
85 register: livekit_health
86 until: livekit_health.status in [200, 404]
87 retries: 20
88 delay: 5
89 when: livekit_start_result is changed
90 check_mode: no
91
92- name: Wait for LiveKit Meet to be healthy
93 uri:
94 url: "http://localhost:{{ livekit_meet_port }}/"
95 method: GET
96 status_code: [200, 302]
97 register: livekit_meet_health
98 until: livekit_meet_health.status in [200, 302]
99 retries: 30
100 delay: 10
101 when: livekit_start_result is changed
102 check_mode: no
103
104- name: Display LiveKit deployment summary
105 debug:
106 msg: |
107 LiveKit Conferencing Stack Deployment:
108 - Status: {{ 'Started' if livekit_start_result is changed else 'Already running' }}
109
110 LiveKit Server (SFU):
111 - Signaling / API: http://{{ ansible_default_ipv4.address }}:{{ livekit_port }}
112 - WebSocket URL: {{ livekit_public_ws_url }}
113 - WebRTC TCP: {{ livekit_tcp_port }}
114 - WebRTC UDP (mux): {{ livekit_udp_port }}
115 - Network mode: host (required for WebRTC ICE)
116 - Redis: not deployed (single-node, in-memory room state)
117
118 LiveKit Meet (Browser UI + Token Generator):
119 - Web UI: http://{{ ansible_default_ipv4.address }}:{{ livekit_meet_port }}
120 - Token endpoint: /api/connection-details
121 - Built from: {{ livekit_meet_repo_url }}@{{ livekit_meet_repo_version }}
122
123 Directories:
124 - Configuration: {{ livekit_config_dir }}
125 - Data: {{ livekit_data_dir }}
126
127 NOTE: Meet's token endpoint is unauthenticated by default. Anyone who can
128 reach {{ livekit_domain }}:{{ livekit_meet_port }} on the LAN can join or create any room.
129
130 Verify media flow: open the Web UI in two browser tabs, join the same
131 room, and confirm audio/video connect in both directions.
132