/
/
/
Ansible role that deploys a supervised home assistant installation on my homeassistant device.
1---
2- name: Check if OS-Agent is already installed
3 ansible.builtin.command: /usr/bin/ha-os-agent --version
4 register: os_agent_version_check
5 failed_when: false
6 changed_when: false
7 check_mode: false
8
9- name: Get latest OS-Agent release information
10 ansible.builtin.uri:
11 url: "{{ homeassistant_os_agent_base_url }}/latest"
12 method: GET
13 return_content: true
14 follow_redirects: all
15 register: os_agent_latest_release
16 when:
17 - homeassistant_os_agent_version == "latest"
18 - os_agent_version_check.rc != 0
19 failed_when: false
20 check_mode: false
21
22- name: Set OS-Agent version
23 ansible.builtin.set_fact:
24 os_agent_version: >-
25 {{
26 homeassistant_os_agent_version if homeassistant_os_agent_version != "latest"
27 else (os_agent_latest_release.json.tag_name | default("1.7.2") | regex_replace('^v', ''))
28 }}
29
30- name: Set OS-Agent file extension
31 ansible.builtin.set_fact:
32 os_agent_file_extension: ".tar.gz"
33
34- name: Set OS-Agent download URL
35 ansible.builtin.set_fact:
36 os_agent_download_url: >-
37 {{
38 homeassistant_os_agent_base_url + '/download/' + os_agent_version +
39 '/os-agent_' + os_agent_version +
40 '_linux_' + homeassistant_os_agent_arch + os_agent_file_extension
41 }}
42
43- name: Determine if OS-Agent install is needed
44 ansible.builtin.set_fact:
45 os_agent_install_needed: >-
46 {{ os_agent_version_check.rc != 0 or os_agent_version not in (os_agent_version_check.stdout | default('')) }}
47
48- name: Install OS-Agent
49 block:
50 - name: Download OS-Agent package
51 ansible.builtin.get_url:
52 url: "{{ os_agent_download_url }}"
53 dest: "/tmp/os-agent_{{ os_agent_version }}_linux_{{ homeassistant_os_agent_arch }}{{ os_agent_file_extension }}"
54 mode: '0644'
55 timeout: 120
56 become: true
57
58 - name: Extract OS-Agent tar.gz
59 ansible.builtin.unarchive:
60 src: "/tmp/os-agent_{{ os_agent_version }}_linux_{{ homeassistant_os_agent_arch }}.tar.gz"
61 dest: /tmp
62 remote_src: yes
63 become: true
64
65 - name: Install OS-Agent binary
66 ansible.builtin.copy:
67 src: "/tmp/os-agent"
68 dest: "/usr/bin/ha-os-agent"
69 mode: '0755'
70 owner: root
71 group: root
72 remote_src: yes
73 become: true
74 notify: restart os-agent
75
76 - name: Create OS-Agent systemd service
77 ansible.builtin.copy:
78 content: |
79 [Unit]
80 Description=Home Assistant OS Agent
81 After=sysinit.target
82 Before=systemd-networkd.service
83 Wants=systemd-networkd.service
84
85 [Service]
86 Type=simple
87 ExecStart=/usr/bin/ha-os-agent
88 Restart=always
89 RestartSec=5
90
91 [Install]
92 WantedBy=multi-user.target
93 dest: /etc/systemd/system/os-agent.service
94 owner: root
95 group: root
96 mode: '0644'
97 become: true
98 notify: restart os-agent
99
100 - name: Enable OS-Agent service
101 ansible.builtin.systemd:
102 name: os-agent
103 enabled: true
104 daemon_reload: true
105 become: true
106
107 - name: Clean up OS-Agent download files
108 ansible.builtin.file:
109 path: "{{ item }}"
110 state: absent
111 become: true
112 loop:
113 - "/tmp/os-agent_{{ os_agent_version }}_linux_{{ homeassistant_os_agent_arch }}{{ os_agent_file_extension }}"
114 - "/tmp/os-agent"
115 when: homeassistant_cleanup_downloads | bool
116
117 when:
118 - os_agent_install_needed | bool
119 - not ansible_check_mode
120
121# D-Bus policy deployed outside the install block so it is always kept in sync
122- name: Deploy Home Assistant OS D-Bus policy
123 ansible.builtin.template:
124 src: io.hass.os.conf.j2
125 dest: /usr/share/dbus-1/system.d/io.hass.os.conf
126 owner: root
127 group: root
128 mode: '0644'
129 become: true
130
131# Dummy package to satisfy HA Supervisor dependencies (tar.gz installs only)
132- name: Create dummy os-agent package to satisfy Home Assistant dependencies
133 block:
134 - name: Check if os-agent package is already installed
135 ansible.builtin.command: dpkg -l os-agent
136 register: os_agent_package_check
137 failed_when: false
138 changed_when: false
139 check_mode: false
140
141 - name: Install equivs package for creating dummy packages
142 ansible.builtin.apt:
143 name: equivs
144 state: present
145 become: true
146 when: os_agent_package_check.rc != 0
147
148 - name: Create dummy os-agent package control file
149 ansible.builtin.copy:
150 content: |
151 Section: misc
152 Priority: optional
153 Package: os-agent
154 Version: {{ os_agent_version }}
155 Maintainer: Home Assistant <[email protected]>
156 Architecture: amd64
157 Description: Home Assistant OS Agent (manual installation)
158 This is a dummy package to satisfy dependencies.
159 The actual OS Agent was installed manually from tar.gz.
160 dest: /tmp/os-agent-dummy
161 owner: root
162 group: root
163 mode: '0644'
164 become: true
165 when: os_agent_package_check.rc != 0
166
167 - name: Build dummy os-agent package
168 ansible.builtin.command: equivs-build /tmp/os-agent-dummy
169 args:
170 chdir: /tmp
171 creates: /tmp/os-agent_{{ os_agent_version }}_amd64.deb
172 become: true
173 when: os_agent_package_check.rc != 0
174
175 - name: Install dummy os-agent package
176 ansible.builtin.apt:
177 deb: /tmp/os-agent_{{ os_agent_version }}_amd64.deb
178 state: present
179 become: true
180 when: os_agent_package_check.rc != 0
181
182 - name: Clean up dummy package files
183 ansible.builtin.file:
184 path: "{{ item }}"
185 state: absent
186 become: true
187 loop:
188 - /tmp/os-agent-dummy
189 - /tmp/os-agent_{{ os_agent_version }}_amd64.deb
190 when:
191 - os_agent_package_check.rc != 0
192 - homeassistant_cleanup_downloads | bool
193
194 when: not ansible_check_mode
195
196# Verify OS-Agent (read-only checks only)
197- name: Verify OS-Agent installation
198 block:
199 - name: Check OS-Agent service status
200 ansible.builtin.command: systemctl is-active os-agent
201 register: os_agent_active
202 changed_when: false
203 failed_when: false
204 check_mode: false
205
206 - name: Verify OS-Agent is running
207 ansible.builtin.assert:
208 that:
209 - os_agent_active.rc == 0
210 fail_msg: "OS-Agent service is not active"
211 success_msg: "OS-Agent service is running"
212
213 - name: Test OS-Agent functionality
214 ansible.builtin.command: /usr/bin/ha-os-agent --version
215 register: os_agent_test
216 changed_when: false
217 failed_when: os_agent_test.rc != 0 and 'Start OS-Agent' not in os_agent_test.stdout
218 check_mode: false
219
220 - name: Display OS-Agent version
221 ansible.builtin.debug:
222 msg: "OS-Agent installed: {{ os_agent_test.stdout }}"
223