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