--- - 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