Fix tasks that always report changed regardless of actual state

Several roles reported "changed" on every playbook run even when
nothing on the target had drifted, making real config drift
indistinguishable from noise:

- 7 systemd tasks across 6 roles used state:restarted, which always
  issues a restart and always reports changed. Switched to
  state:started plus notify-driven handlers that only restart when
  the underlying unit file, script, or config actually changes.
- pi_standard_setup's boot mode, timezone, and locale tasks shelled
  out to raspi-config with changed_when:true hardcoded. Boot mode now
  checks systemctl get-default first; timezone/locale now use the
  natively idempotent community.general.timezone/locale_gen modules.
- The pi account password task computed password_hash('sha512')
  without a seed, generating a new random salt (and thus an
  apparently different hash) on every run. Added a stable seed so the
  hash only changes when the underlying secret does.

Also renamed a mislabeled task in pi_squeezelite_custom and fixed a
typo in pi_standard_setup while those files were already touched.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-08 21:28:36 +02:00
parent c49e4db304
commit 3d1675528b
16 changed files with 86 additions and 22 deletions

View File

@@ -4,3 +4,4 @@
ansible-core>=2.14 ansible-core>=2.14
ansible-lint ansible-lint
keepassxc-proxy-client keepassxc-proxy-client
passlib

View File

@@ -1,3 +1,4 @@
--- ---
collections: collections:
- name: ansible.posix - name: ansible.posix
- name: community.general

View File

@@ -0,0 +1,5 @@
---
- name: Restart my_btmonitor
ansible.builtin.service:
name: my_btmonitor
state: restarted

View File

@@ -16,15 +16,17 @@
dest: /usr/bin/my_btmonitor dest: /usr/bin/my_btmonitor
owner: root owner: root
mode: u+rwx mode: u+rwx
notify: Restart my_btmonitor
- name: Install systemd service file - name: Install systemd service file
ansible.builtin.copy: ansible.builtin.copy:
src: my_btmonitor.service src: my_btmonitor.service
dest: /etc/systemd/system/ dest: /etc/systemd/system/
mode: "0644" mode: "0644"
notify: Restart my_btmonitor
- name: Add script to autostart and start now - name: Add script to autostart and start now
ansible.builtin.systemd: ansible.builtin.systemd:
name: my_btmonitor name: my_btmonitor
state: restarted state: started
enabled: "yes" enabled: "yes"
daemon_reload: "yes" daemon_reload: "yes"
# - name: Add to sysdweb # - name: Add to sysdweb

View File

@@ -0,0 +1,5 @@
---
- name: Restart dht22_sensing
ansible.builtin.service:
name: dht22_sensing
state: restarted

View File

@@ -19,26 +19,30 @@
name: adafruit-dht name: adafruit-dht
executable: pip3 executable: pip3
extra_args: "--break-system-packages" extra_args: "--break-system-packages"
notify: Restart dht22_sensing
- name: Install script config - name: Install script config
ansible.builtin.template: ansible.builtin.template:
src: dht22_sensing.json src: dht22_sensing.json
dest: /etc/dht22_sensing.json dest: /etc/dht22_sensing.json
mode: "0644" mode: "0644"
notify: Restart dht22_sensing
- name: Install script - name: Install script
ansible.builtin.copy: ansible.builtin.copy:
src: dht22_sensing.py src: dht22_sensing.py
dest: /usr/bin/dht22_sensing dest: /usr/bin/dht22_sensing
owner: root owner: root
mode: u+rwx mode: u+rwx
notify: Restart dht22_sensing
- name: Install systemd service file - name: Install systemd service file
ansible.builtin.copy: ansible.builtin.copy:
src: dht22_sensing.service src: dht22_sensing.service
dest: /etc/systemd/system/ dest: /etc/systemd/system/
mode: "0644" mode: "0644"
notify: Restart dht22_sensing
- name: Add script to autostart and start now - name: Add script to autostart and start now
ansible.builtin.systemd: ansible.builtin.systemd:
name: dht22_sensing name: dht22_sensing
state: restarted state: started
enabled: "yes" enabled: "yes"
daemon_reload: "yes" daemon_reload: "yes"
- name: Add to sysdweb - name: Add to sysdweb

View File

@@ -0,0 +1,5 @@
---
- name: Restart irserver
ansible.builtin.service:
name: irserver
state: restarted

View File

@@ -4,6 +4,7 @@
src: irserver src: irserver
dest: /usr/bin/irserver dest: /usr/bin/irserver
mode: u+rx mode: u+rx
notify: Restart irserver
- name: Make config dir for remotes - name: Make config dir for remotes
ansible.builtin.file: ansible.builtin.file:
path: /usr/bin/remotes path: /usr/bin/remotes
@@ -14,15 +15,17 @@
src: hauppauge.rem src: hauppauge.rem
dest: /usr/bin/remotes/ dest: /usr/bin/remotes/
mode: "0644" mode: "0644"
notify: Restart irserver
- name: Copy irserver systemd file - name: Copy irserver systemd file
ansible.builtin.copy: ansible.builtin.copy:
src: irserver.service src: irserver.service
dest: /lib/systemd/system/ dest: /lib/systemd/system/
mode: "0644" mode: "0644"
notify: Restart irserver
- name: Enable irserver autostart - name: Enable irserver autostart
ansible.builtin.systemd: ansible.builtin.systemd:
name: irserver name: irserver
state: restarted state: started
enabled: "yes" enabled: "yes"
daemon_reload: "yes" daemon_reload: "yes"
- name: Add irserver to sysdweb - name: Add irserver to sysdweb

View File

@@ -0,0 +1,5 @@
---
- name: Restart shairport-sync
ansible.builtin.service:
name: shairport-sync
state: restarted

View File

@@ -21,20 +21,23 @@
ansible.builtin.script: "build-shairport-sync.sh ${shairport_sync_version}" ansible.builtin.script: "build-shairport-sync.sh ${shairport_sync_version}"
args: args:
creates: /usr/local/bin/shairport-sync creates: /usr/local/bin/shairport-sync
notify: Restart shairport-sync
- name: Copy config - name: Copy config
ansible.builtin.template: ansible.builtin.template:
src: shairport-sync.conf src: shairport-sync.conf
dest: /etc/shairport-sync.conf dest: /etc/shairport-sync.conf
mode: "0644" mode: "0644"
notify: Restart shairport-sync
- name: Modify service file to run as root - name: Modify service file to run as root
ansible.builtin.lineinfile: ansible.builtin.lineinfile:
path: /lib/systemd/system/shairport-sync.service path: /lib/systemd/system/shairport-sync.service
regexp: "^#?User=" regexp: "^#?User="
line: "User=root" line: "User=root"
- name: Restart shairport-sync notify: Restart shairport-sync
- name: Enable shairport-sync autostart
ansible.builtin.systemd: ansible.builtin.systemd:
name: shairport-sync name: shairport-sync
state: restarted state: started
enabled: "yes" enabled: "yes"
daemon_reload: "yes" daemon_reload: "yes"
- name: Add to sysdweb - name: Add to sysdweb

View File

@@ -0,0 +1,5 @@
---
- name: Restart squeezelite
ansible.builtin.service:
name: squeezelite
state: restarted

View File

@@ -23,15 +23,17 @@
src: squeezelite src: squeezelite
dest: /opt/squeezelite dest: /opt/squeezelite
mode: "700" mode: "700"
notify: Restart squeezelite
- name: Install systemd service file - name: Install systemd service file
ansible.builtin.template: ansible.builtin.template:
src: squeezelite.service src: squeezelite.service
dest: /lib/systemd/system/ dest: /lib/systemd/system/
mode: "0644" mode: "0644"
- name: Enable sysdweb autostart notify: Restart squeezelite
- name: Enable squeezelite autostart
ansible.builtin.systemd: ansible.builtin.systemd:
name: squeezelite name: squeezelite
state: restarted state: started
enabled: "yes" enabled: "yes"
daemon_reload: "yes" daemon_reload: "yes"
- name: Add to sysdweb - name: Add to sysdweb

View File

@@ -5,3 +5,7 @@
state: restarted state: restarted
- name: Reboot - name: Reboot
ansible.builtin.reboot: ansible.builtin.reboot:
- name: Restart raspi-leds-off
ansible.builtin.service:
name: raspi-leds-off
state: restarted

View File

@@ -38,7 +38,7 @@
changed_when: false changed_when: false
- name: Change hostname {{ pi_standard_setup_new_hostname }} - name: Change hostname {{ pi_standard_setup_new_hostname }}
ansible.builtin.command: "raspi-config nonint do_hostname {{ pi_standard_setup_new_hostname }}" ansible.builtin.command: "raspi-config nonint do_hostname {{ pi_standard_setup_new_hostname }}"
when: pi_standard_setup_new_hostname | bool and pi_standard_setup_pi_hostname.stdout != pi_standard_setup_new_hostname when: pi_standard_setup_new_hostname | length > 0 and pi_standard_setup_pi_hostname.stdout != pi_standard_setup_new_hostname
register: pi_standard_setup_set_hostname register: pi_standard_setup_set_hostname
changed_when: true changed_when: true
notify: Reboot notify: Reboot
@@ -46,21 +46,34 @@
ansible.builtin.command: "raspi-config nonint get_hostname" ansible.builtin.command: "raspi-config nonint get_hostname"
register: pi_standard_setup_pi_hostname register: pi_standard_setup_pi_hostname
changed_when: false changed_when: false
- name: Get current boot target
ansible.builtin.command: "systemctl get-default"
register: pi_standard_setup_boot_target
changed_when: false
- name: Set boot mode to CLI - name: Set boot mode to CLI
ansible.builtin.command: "raspi-config nonint do_boot_behaviour B1" ansible.builtin.command: "raspi-config nonint do_boot_behaviour B1"
when: pi_standard_setup_boot_target.stdout != "multi-user.target"
changed_when: true changed_when: true
# I2 Change Timezone # I2 Change Timezone
- name: Change timezone - name: Change timezone
ansible.builtin.command: "raspi-config nonint do_change_timezone {{ pi_standard_setup_timezone }}" community.general.timezone:
changed_when: true name: "{{ pi_standard_setup_timezone }}"
- name: Change locale - name: Generate locale
ansible.builtin.command: "raspi-config nonint do_change_locale en_US.UTF-8" community.general.locale_gen:
changed_when: true name: en_US.UTF-8
state: present
- name: Set default locale
ansible.builtin.lineinfile:
path: /etc/default/locale
regexp: "^LANG="
line: "LANG=en_US.UTF-8"
create: true
mode: "0644"
- name: Change password of default pi account - name: Change password of default pi account
ansible.builtin.user: ansible.builtin.user:
name: pi name: pi
update_password: always update_password: always
password: "{{ lookup('keepass', 'ansible://default_rpi_password') | password_hash('sha512') }}" password: "{{ lookup('keepass', 'ansible://default_rpi_password') | password_hash('sha512', 65534 | random(seed=inventory_hostname) | string) }}"
- name: Install Packages (vim, git, basic python stuff) - name: Install Packages (vim, git, basic python stuff)
ansible.builtin.apt: ansible.builtin.apt:
name: name:
@@ -83,11 +96,6 @@
dest: /root/.gitconfig dest: /root/.gitconfig
mode: "0644" mode: "0644"
# Wifi # Wifi
- name: Get WiFi country
ansible.builtin.command: "raspi-config nonint get_wifi_country"
register: pi_standard_setup_current_wifi_country
changed_when: false
ignore_errors: true # to avoid error when WiFi is not present
- name: Change WiFi country - name: Change WiFi country
ansible.builtin.command: "raspi-config nonint do_wifi_country {{ pi_standard_setup_wifi_country }}" ansible.builtin.command: "raspi-config nonint do_wifi_country {{ pi_standard_setup_wifi_country }}"
when: configure_wifi when: configure_wifi
@@ -130,14 +138,16 @@
src: raspi-leds-off.sh src: raspi-leds-off.sh
dest: /usr/sbin/raspi-leds-off.sh dest: /usr/sbin/raspi-leds-off.sh
mode: "u+rwx" mode: "u+rwx"
notify: Restart raspi-leds-off
- name: Copy led off service - name: Copy led off service
ansible.builtin.copy: ansible.builtin.copy:
src: raspi-leds-off.service src: raspi-leds-off.service
dest: /lib/systemd/system/ dest: /lib/systemd/system/
mode: "0644" mode: "0644"
- name: Activate led off servic notify: Restart raspi-leds-off
- name: Activate led off service
ansible.builtin.systemd: ansible.builtin.systemd:
name: raspi-leds-off name: raspi-leds-off
state: restarted state: started
enabled: "yes" enabled: "yes"
daemon_reload: "yes" daemon_reload: "yes"

View File

@@ -0,0 +1,5 @@
---
- name: Restart sysdweb-system
ansible.builtin.service:
name: sysdweb-system
state: restarted

View File

@@ -9,6 +9,7 @@
name: sysdweb name: sysdweb
executable: pip3 executable: pip3
extra_args: "--break-system-packages" extra_args: "--break-system-packages"
notify: Restart sysdweb-system
- name: Sysdweb user - name: Sysdweb user
ansible.builtin.user: ansible.builtin.user:
name: sysdweb name: sysdweb
@@ -24,6 +25,7 @@
block: | block: |
[DEFAULT] [DEFAULT]
users = sysdweb users = sysdweb
notify: Restart sysdweb-system
- name: Configure sysdweb - name: Configure sysdweb
ansible.builtin.blockinfile: ansible.builtin.blockinfile:
path: /etc/sysdweb.conf path: /etc/sysdweb.conf
@@ -34,14 +36,16 @@
[{{ pi_sysdweb_name }}] [{{ pi_sysdweb_name }}]
title = {{ pi_sysdweb_name }} title = {{ pi_sysdweb_name }}
unit = {{ pi_sysdweb_name }}.service unit = {{ pi_sysdweb_name }}.service
notify: Restart sysdweb-system
- name: Install systemd service file - name: Install systemd service file
ansible.builtin.copy: ansible.builtin.copy:
src: sysdweb-system.service src: sysdweb-system.service
dest: /etc/systemd/system/ dest: /etc/systemd/system/
mode: "0644" mode: "0644"
notify: Restart sysdweb-system
- name: Enable sysdweb autostart - name: Enable sysdweb autostart
ansible.builtin.systemd: ansible.builtin.systemd:
name: sysdweb-system name: sysdweb-system
state: restarted state: started
enabled: "yes" enabled: "yes"
daemon_reload: "yes" daemon_reload: "yes"