From d27ba46d5b0cf448a03fa4be7ab1c548c0890a8c Mon Sep 17 00:00:00 2001 From: Sergey Malyuk Date: Thu, 18 Dec 2025 10:54:07 +0300 Subject: [PATCH 1/3] add swapfile role --- roles/swapfile/README.md | 39 ++++++++++++++++ roles/swapfile/defaults/main.yml | 8 ++++ roles/swapfile/handlers/main.yml | 1 + roles/swapfile/meta/main.yml | 17 +++++++ roles/swapfile/molecule/default/converge.yml | 19 ++++++++ roles/swapfile/molecule/default/molecule.yml | 29 ++++++++++++ roles/swapfile/molecule/default/verify.yml | 26 +++++++++++ roles/swapfile/tasks/disable.yml | 11 +++++ roles/swapfile/tasks/enable.yml | 47 ++++++++++++++++++++ roles/swapfile/tasks/main.yml | 18 ++++++++ roles/swapfile/vars/main.yml | 1 + 11 files changed, 216 insertions(+) create mode 100644 roles/swapfile/README.md create mode 100644 roles/swapfile/defaults/main.yml create mode 100644 roles/swapfile/handlers/main.yml create mode 100644 roles/swapfile/meta/main.yml create mode 100644 roles/swapfile/molecule/default/converge.yml create mode 100644 roles/swapfile/molecule/default/molecule.yml create mode 100644 roles/swapfile/molecule/default/verify.yml create mode 100644 roles/swapfile/tasks/disable.yml create mode 100644 roles/swapfile/tasks/enable.yml create mode 100644 roles/swapfile/tasks/main.yml create mode 100644 roles/swapfile/vars/main.yml diff --git a/roles/swapfile/README.md b/roles/swapfile/README.md new file mode 100644 index 0000000..019f927 --- /dev/null +++ b/roles/swapfile/README.md @@ -0,0 +1,39 @@ +ansible-swapfile +========= + +Create/destroy a swapfile and run swapon/-off on it. + +Massively borrowing from https://github.com/geerlingguy/ansible-role-swap. + +Requirements +------------ + +None + +Role Variables +-------------- + +None + +Dependencies +------------ + +None + +Example Playbook +---------------- + +```yaml +roles: + - role: genlab.swapfile +``` + +License +------- + +BSD + +Author Information +------------------ + +corvus-migratorius@proton.me diff --git a/roles/swapfile/defaults/main.yml b/roles/swapfile/defaults/main.yml new file mode 100644 index 0000000..b76651e --- /dev/null +++ b/roles/swapfile/defaults/main.yml @@ -0,0 +1,8 @@ +--- +swap_file_path: /swapfile +swap_file_size_mb: '512' +swap_swappiness: '60' +swap_file_state: present +swap_file_create_command: "dd if=/dev/zero of={{ swap_file_path }} bs=1M count={{ swap_file_size_mb }}" + +swap_test_mode: false diff --git a/roles/swapfile/handlers/main.yml b/roles/swapfile/handlers/main.yml new file mode 100644 index 0000000..ed97d53 --- /dev/null +++ b/roles/swapfile/handlers/main.yml @@ -0,0 +1 @@ +--- diff --git a/roles/swapfile/meta/main.yml b/roles/swapfile/meta/main.yml new file mode 100644 index 0000000..00f0b94 --- /dev/null +++ b/roles/swapfile/meta/main.yml @@ -0,0 +1,17 @@ +--- +galaxy_info: + role_name: "swapfile" + namespace: genlab + author: "Alexander Gorelyshev" + company: "Genlab, LLC" + description: "" + license: "MIT" + min_ansible_version: "2.1" + + platforms: + - name: "Ubuntu" + versions: [ "focal", "jammy" ] + + galaxy_tags: [ ] + +dependencies: [] diff --git a/roles/swapfile/molecule/default/converge.yml b/roles/swapfile/molecule/default/converge.yml new file mode 100644 index 0000000..e702ede --- /dev/null +++ b/roles/swapfile/molecule/default/converge.yml @@ -0,0 +1,19 @@ +--- +- name: Converge + hosts: all + become: true + + pre_tasks: + - name: "Update apt cache" + when: ansible_os_family == 'Debian' + ansible.builtin.apt: + update_cache: true + cache_valid_time: 600 + + roles: + - role: genlab.swapfile + swap_file_path: /swapfile + swap_file_size_mb: 2000 + swap_swappiness: 30 + swap_file_state: present + swap_test_mode: true diff --git a/roles/swapfile/molecule/default/molecule.yml b/roles/swapfile/molecule/default/molecule.yml new file mode 100644 index 0000000..89df07d --- /dev/null +++ b/roles/swapfile/molecule/default/molecule.yml @@ -0,0 +1,29 @@ +--- +dependency: + name: galaxy + +driver: + name: docker + +platforms: + - name: ubuntu + image: geerlingguy/docker-${MOLECULE_DISTRO:-ubuntu2204}-ansible:latest + command: ${MOLECULE_DOCKER_COMMAND:-""} + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + cgroupns_mode: host + privileged: true + pre_build_image: true + +provisioner: + name: ansible + playbooks: + converge: ${MOLECULE_PLAYBOOK:-converge.yml} + +verifier: + name: ansible + +lint: | + set -e + yamllint . + ansible-lint . diff --git a/roles/swapfile/molecule/default/verify.yml b/roles/swapfile/molecule/default/verify.yml new file mode 100644 index 0000000..c54ab18 --- /dev/null +++ b/roles/swapfile/molecule/default/verify.yml @@ -0,0 +1,26 @@ +--- +- name: Verify + hosts: all + gather_facts: false + any_errors_fatal: true + vars: + swapfile_path: "/swapfile" + + pre_tasks: + - name: "Ensure 'file' exists" + ansible.builtin.package: + name: [file] + state: present + + tasks: + - name: "Check swapfile file type" + register: swapfile_info + changed_when: false + ansible.builtin.command: + cmd: "file {{ swapfile_path }}" + + - name: "Verify correct file type" + ansible.builtin.assert: + that: "'swap file' in swapfile_info.stdout" + success_msg: "{{ swapfile_path }}: Indeed, a Linux swap file" + fail_msg: "{{ swapfile_path }}: not a Linux swap file ('{{ swapfile_info.stdout }}')" diff --git a/roles/swapfile/tasks/disable.yml b/roles/swapfile/tasks/disable.yml new file mode 100644 index 0000000..302952b --- /dev/null +++ b/roles/swapfile/tasks/disable.yml @@ -0,0 +1,11 @@ +--- +- name: "Disable | disable swap" + changed_when: false + ansible.builtin.command: + cmd: swapoff -a + + +- name: "Disable | ensure swap file doesn't exist" + ansible.builtin.file: + path: "{{ swap_file_path }}" + state: absent diff --git a/roles/swapfile/tasks/enable.yml b/roles/swapfile/tasks/enable.yml new file mode 100644 index 0000000..e2170b8 --- /dev/null +++ b/roles/swapfile/tasks/enable.yml @@ -0,0 +1,47 @@ +--- +# https://justinmontgomery.com/speed-up-stat-command-in-ansible +- name: "Enable | create the swap file" + block: + - name: "Enable | stat the swap file" + register: this + failed_when: not this.stat.exists + ansible.builtin.stat: + path: "{{ swap_file_path }}" + get_checksum: false + get_mime: false + get_attributes: false + + rescue: + - name: "Enable | ensure swap file exists" + register: swap_file_create + ansible.builtin.command: + cmd: "{{ swap_file_create_command }}" + creates: "{{ swap_file_path }}" + + - name: "Enable | set permissions on swap file" + ansible.builtin.file: + path: "{{ swap_file_path }}" + owner: root + group: root + mode: "0600" + + - name: "Enable | make swap" # noqa: no-handler no-changed-when + register: mkswap_result + when: swap_file_create is changed + ansible.builtin.command: + cmd: mkswap {{ swap_file_path }} + + - name: "Enable | run swapon on the swap file => '{{ swap_file_path }}'" + when: + - mkswap_result is changed + - not swap_test_mode + changed_when: false + ansible.builtin.command: + cmd: swapon {{ swap_file_path }} + + +- name: "Set swappiness to '{{ swap_swappiness }}'" + ansible.posix.sysctl: + name: vm.swappiness + value: "{{ swap_swappiness }}" + state: present diff --git a/roles/swapfile/tasks/main.yml b/roles/swapfile/tasks/main.yml new file mode 100644 index 0000000..177dd24 --- /dev/null +++ b/roles/swapfile/tasks/main.yml @@ -0,0 +1,18 @@ +--- +- name: "Manage swap file entry in fstab" + ansible.posix.mount: + name: none + src: "{{ swap_file_path }}" + fstype: swap + opts: sw + state: "{{ swap_file_state }}" + + +- name: "Include disable swap tasks" + when: swap_file_state == 'absent' + ansible.builtin.include_tasks: disable.yml + + +- name: "Include enable swap tasks" + when: swap_file_state == 'present' + ansible.builtin.include_tasks: enable.yml diff --git a/roles/swapfile/vars/main.yml b/roles/swapfile/vars/main.yml new file mode 100644 index 0000000..ed97d53 --- /dev/null +++ b/roles/swapfile/vars/main.yml @@ -0,0 +1 @@ +--- From ef524d700627080a499f43aa889ee65de99f59fb Mon Sep 17 00:00:00 2001 From: Sergey Malyuk Date: Thu, 18 Dec 2025 11:29:03 +0300 Subject: [PATCH 2/3] fix ansible-lint errors --- roles/swapfile/defaults/main.yml | 12 ++++---- roles/swapfile/meta/main.yml | 4 +-- roles/swapfile/molecule/default/converge.yml | 12 ++++---- roles/swapfile/tasks/disable.yml | 2 +- roles/swapfile/tasks/enable.yml | 32 ++++++++++---------- roles/swapfile/tasks/main.yml | 8 ++--- 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/roles/swapfile/defaults/main.yml b/roles/swapfile/defaults/main.yml index b76651e..e5e29fe 100644 --- a/roles/swapfile/defaults/main.yml +++ b/roles/swapfile/defaults/main.yml @@ -1,8 +1,8 @@ --- -swap_file_path: /swapfile -swap_file_size_mb: '512' -swap_swappiness: '60' -swap_file_state: present -swap_file_create_command: "dd if=/dev/zero of={{ swap_file_path }} bs=1M count={{ swap_file_size_mb }}" +swapfile_path: /swapfile +swapfile_size_mb: '512' +swapfile_swappiness: '60' +swapfile_state: present +swapfile_create_command: "dd if=/dev/zero of={{ swapfile_path }} bs=1M count={{ swapfile_size_mb }}" -swap_test_mode: false +swapfile_test_mode: false diff --git a/roles/swapfile/meta/main.yml b/roles/swapfile/meta/main.yml index 00f0b94..fde50d8 100644 --- a/roles/swapfile/meta/main.yml +++ b/roles/swapfile/meta/main.yml @@ -10,8 +10,8 @@ galaxy_info: platforms: - name: "Ubuntu" - versions: [ "focal", "jammy" ] + versions: ["focal", "jammy"] - galaxy_tags: [ ] + galaxy_tags: [] dependencies: [] diff --git a/roles/swapfile/molecule/default/converge.yml b/roles/swapfile/molecule/default/converge.yml index e702ede..459c5ad 100644 --- a/roles/swapfile/molecule/default/converge.yml +++ b/roles/swapfile/molecule/default/converge.yml @@ -11,9 +11,9 @@ cache_valid_time: 600 roles: - - role: genlab.swapfile - swap_file_path: /swapfile - swap_file_size_mb: 2000 - swap_swappiness: 30 - swap_file_state: present - swap_test_mode: true + - role: genlab.common.swapfile + swapfile_path: /swapfile + swapfile_size_mb: 2000 + swapfile_swappiness: 30 + swapfile_state: present + swapfile_test_mode: true diff --git a/roles/swapfile/tasks/disable.yml b/roles/swapfile/tasks/disable.yml index 302952b..ba04c8a 100644 --- a/roles/swapfile/tasks/disable.yml +++ b/roles/swapfile/tasks/disable.yml @@ -7,5 +7,5 @@ - name: "Disable | ensure swap file doesn't exist" ansible.builtin.file: - path: "{{ swap_file_path }}" + path: "{{ swapfile_path }}" state: absent diff --git a/roles/swapfile/tasks/enable.yml b/roles/swapfile/tasks/enable.yml index e2170b8..e433f73 100644 --- a/roles/swapfile/tasks/enable.yml +++ b/roles/swapfile/tasks/enable.yml @@ -3,45 +3,45 @@ - name: "Enable | create the swap file" block: - name: "Enable | stat the swap file" - register: this - failed_when: not this.stat.exists + register: swapfile_this + failed_when: not swapfile_this.stat.exists ansible.builtin.stat: - path: "{{ swap_file_path }}" + path: "{{ swapfile_path }}" get_checksum: false get_mime: false get_attributes: false rescue: - name: "Enable | ensure swap file exists" - register: swap_file_create + register: swapfile_create ansible.builtin.command: - cmd: "{{ swap_file_create_command }}" - creates: "{{ swap_file_path }}" + cmd: "{{ swapfile_create_command }}" + creates: "{{ swapfile_path }}" - name: "Enable | set permissions on swap file" ansible.builtin.file: - path: "{{ swap_file_path }}" + path: "{{ swapfile_path }}" owner: root group: root mode: "0600" - name: "Enable | make swap" # noqa: no-handler no-changed-when - register: mkswap_result - when: swap_file_create is changed + register: swapfile_mkswap_result + when: swapfile_create is changed ansible.builtin.command: - cmd: mkswap {{ swap_file_path }} + cmd: mkswap {{ swapfile_path }} - - name: "Enable | run swapon on the swap file => '{{ swap_file_path }}'" + - name: "Enable | run swapon on the swap file => '{{ swapfile_path }}'" when: - - mkswap_result is changed - - not swap_test_mode + - swapfile_mkswap_result is changed + - not swapfile_test_mode changed_when: false ansible.builtin.command: - cmd: swapon {{ swap_file_path }} + cmd: swapon {{ swapfile_path }} -- name: "Set swappiness to '{{ swap_swappiness }}'" +- name: "Set swappiness to '{{ swapfile_swappiness }}'" ansible.posix.sysctl: name: vm.swappiness - value: "{{ swap_swappiness }}" + value: "{{ swapfile_swappiness }}" state: present diff --git a/roles/swapfile/tasks/main.yml b/roles/swapfile/tasks/main.yml index 177dd24..639505c 100644 --- a/roles/swapfile/tasks/main.yml +++ b/roles/swapfile/tasks/main.yml @@ -2,17 +2,17 @@ - name: "Manage swap file entry in fstab" ansible.posix.mount: name: none - src: "{{ swap_file_path }}" + src: "{{ swapfile_path }}" fstype: swap opts: sw - state: "{{ swap_file_state }}" + state: "{{ swapfile_state }}" - name: "Include disable swap tasks" - when: swap_file_state == 'absent' + when: swapfile_state == 'absent' ansible.builtin.include_tasks: disable.yml - name: "Include enable swap tasks" - when: swap_file_state == 'present' + when: swapfile_state == 'present' ansible.builtin.include_tasks: enable.yml From c1142c568951aafbcb0827a79f7805e526a17565 Mon Sep 17 00:00:00 2001 From: Sergey Malyuk Date: Thu, 18 Dec 2025 11:30:15 +0300 Subject: [PATCH 3/3] udpate meta --- README.md | 1 + galaxy.yml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e0e7812..bd37b07 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ - [rustdesk](roles/rustdesk/README.md) - [sftp_share](roles/sftp_share/README.md) - [smartctl_exporter](roles/smartctl_exporter/README.md) +- [swapfile](roles/swapfile/README.md) - [ufw](roles/ufw/README.md) - [wg_hub](roles/wg_hub/README.md) - [wg_spoke](roles/wg_spoke/README.md) \ No newline at end of file diff --git a/galaxy.yml b/galaxy.yml index ce5ff52..c26b9f9 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -1,7 +1,7 @@ --- namespace: genlab name: common -version: 0.21.0 +version: 0.22.0 readme: README.md authors: - Alexander Gorelyshev (corvus-migratorius@proton.me)