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:
@@ -4,3 +4,4 @@
|
|||||||
ansible-core>=2.14
|
ansible-core>=2.14
|
||||||
ansible-lint
|
ansible-lint
|
||||||
keepassxc-proxy-client
|
keepassxc-proxy-client
|
||||||
|
passlib
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
---
|
---
|
||||||
collections:
|
collections:
|
||||||
- name: ansible.posix
|
- name: ansible.posix
|
||||||
|
- name: community.general
|
||||||
|
|||||||
5
roles/bluetooth_monitor/handlers/main.yml
Normal file
5
roles/bluetooth_monitor/handlers/main.yml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
- name: Restart my_btmonitor
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: my_btmonitor
|
||||||
|
state: restarted
|
||||||
@@ -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
|
||||||
|
|||||||
5
roles/pi_dhtsensor/handlers/main.yml
Normal file
5
roles/pi_dhtsensor/handlers/main.yml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
- name: Restart dht22_sensing
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: dht22_sensing
|
||||||
|
state: restarted
|
||||||
@@ -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
|
||||||
|
|||||||
5
roles/pi_irserver/handlers/main.yml
Normal file
5
roles/pi_irserver/handlers/main.yml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
- name: Restart irserver
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: irserver
|
||||||
|
state: restarted
|
||||||
@@ -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
|
||||||
|
|||||||
5
roles/pi_shairport/handlers/main.yml
Normal file
5
roles/pi_shairport/handlers/main.yml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
- name: Restart shairport-sync
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: shairport-sync
|
||||||
|
state: restarted
|
||||||
@@ -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
|
||||||
|
|||||||
5
roles/pi_squeezelite_custom/handlers/main.yml
Normal file
5
roles/pi_squeezelite_custom/handlers/main.yml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
- name: Restart squeezelite
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: squeezelite
|
||||||
|
state: restarted
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
5
roles/pi_sysdweb/handlers/main.yml
Normal file
5
roles/pi_sysdweb/handlers/main.yml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
- name: Restart sysdweb-system
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: sysdweb-system
|
||||||
|
state: restarted
|
||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user