Files
a13labs.infra/ansible/roles/auto_suspend/tasks/main.yml
T

175 lines
4.5 KiB
YAML
Raw Normal View History

---
- name: Install dependencies
become: true
ansible.builtin.package:
name: "{{ item }}"
state: present
loop:
- sysstat
- python3
- name: Enable sysstat service
become: true
ansible.builtin.systemd:
name: sysstat
enabled: true
state: started
- name: Read existing GRUB_CMDLINE_LINUX
ansible.builtin.shell: set -o pipefail && grep '^GRUB_CMDLINE_LINUX=' /etc/default/grub | cut -d= -f2- | tr -d '"'
register: grub_line
changed_when: false
failed_when: grub_line.stdout == ""
- name: Set fact for existing_cmdline
ansible.builtin.set_fact:
existing_cmdline: "{{ grub_line.stdout }}"
- name: Show current GRUB_CMDLINE_LINUX
ansible.builtin.debug:
msg: "Current GRUB_CMDLINE_LINUX: {{ existing_cmdline }}"
- name: Updated GRUB_CMDLINE_LINUX
ansible.builtin.debug:
msg: "Updated GRUB_CMDLINE_LINUX: {{ existing_cmdline | regex_replace(' *mem_sleep_default=\\S+', '') }} mem_sleep_default=deep"
- name: Ensure mem_sleep_default=deep is set in GRUB_CMDLINE_LINUX
become: true
vars:
grub_cmdline_linux_line: >-
GRUB_CMDLINE_LINUX="{{ existing_cmdline | regex_replace(' *mem_sleep_default=\\S+', '') }} mem_sleep_default=deep"
ansible.builtin.lineinfile:
path: /etc/default/grub
regexp: "^GRUB_CMDLINE_LINUX="
line: "{{ grub_cmdline_linux_line }}"
- name: Generate GRUB config
become: true
changed_when: false
ansible.builtin.command: grub2-mkconfig -o {{ auto_suspend_grub_config_path_bios }}
- name: Create state directory
become: true
ansible.builtin.file:
path: "{{ auto_suspend_state_dir }}"
state: directory
owner: root
group: root
mode: "0755"
- name: Create log file
become: true
ansible.builtin.file:
path: "{{ auto_suspend_log_file }}"
state: touch
owner: root
group: root
mode: "0644"
- name: Create auto-suspend Python script
become: true
ansible.builtin.copy:
src: auto_suspend.py
dest: /usr/local/bin/auto_suspend.py
mode: "0755"
owner: root
group: root
- name: Set SELinux file context on script
become: true
community.general.sefcontext:
path: /usr/local/bin/auto_suspend.py
setype: bin_t
state: present
failed_when: false
- name: Restore SELinux context on script
become: true
ansible.builtin.command: restorecon -v /usr/local/bin/auto_suspend.py
changed_when: true
failed_when: false
- name: Create systemd service for auto-suspend
become: true
ansible.builtin.copy:
dest: /etc/systemd/system/auto-suspend.service
content: |
[Unit]
Description=Check system idleness and suspend if idle
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/auto_suspend.py \
--alpha {{ auto_suspend_alpha }} \
--min-samples {{ auto_suspend_min_samples }} \
--idle-timeout-cycles {{ auto_suspend_idle_timeout_cycles }} \
--cpu-idle-threshold {{ auto_suspend_cpu_idle_threshold }} \
--gpu-util-threshold {{ auto_suspend_gpu_util_threshold }} \
--state-dir {{ auto_suspend_state_dir }} \
--log-file {{ auto_suspend_log_file }}
Restart=on-failure
RestartSec=30
[Install]
WantedBy=multi-user.target
owner: root
group: root
mode: "0644"
- name: Create sleep.conf.d folder if it doesn't exist
become: true
ansible.builtin.file:
path: /etc/systemd/sleep.conf.d
state: directory
owner: root
group: root
mode: "0755"
- name: Create sleep.conf.d for deep sleep
become: true
ansible.builtin.copy:
dest: /etc/systemd/sleep.conf.d/mem-deep.conf
content: |
[Sleep]
MemorySleepMode=deep
owner: root
group: root
mode: "0644"
- name: Create systemd timer for auto-suspend
become: true
ansible.builtin.copy:
dest: /etc/systemd/system/auto-suspend.timer
content: |
[Unit]
Description=Run idle suspend check every {{ auto_suspend_check_interval }}
[Timer]
OnBootSec={{ auto_suspend_check_interval }}
OnUnitActiveSec={{ auto_suspend_check_interval }}
Unit=auto-suspend.service
[Install]
WantedBy=timers.target
owner: root
group: root
mode: "0644"
- name: Reload systemd daemon
become: true
ansible.builtin.systemd:
daemon_reload: true
- name: Enable and start auto-suspend timer
become: true
ansible.builtin.systemd:
name: auto-suspend.timer
enabled: true
state: started
- name: Verify script is executable
become: true
ansible.builtin.command: /usr/local/bin/auto_suspend.py --dry-run
changed_when: false