If we maintain a Linux machine with a low memory capacity while we are required to run an application with high memory consumption, enabling swap memory is an option. Ansible can be utilized as a helper tool to automate the creation of swap memory. A swap file can be allocated in the available storage of the machine. The swap file then can be assigned as a swap memory.
Firstly, we should prepare the inventory file. The following snippet is an example, you must provide your own configuration.
[server]
192.168.1.2
[server:vars]
ansible_user=root
ansible_ssh_private_key_file=~/.ssh/id_rsa
Secondly, we need to prepare the task file that contains not only the tasks but also some variables and connection information. For instance, we set /swapfile
as the name of our swap file. We also set the swap memory size to 2GB and the swappiness level to 60.
- hosts: server
become: true
vars:
swap_vars:
size: 2G
swappiness: 60
For simplicity, we only check the existence of /swapfile
for continuing the swap memory creation. The steps are as follows:
- Verify that
/swapfile
doesn't exist - Fail the process if
/swapfile
exists - Allocate
/swapfile
as a swap file - Change the permission of
/swapfile
into 600 - Create a swap area on the swap file
- Activate the swap file as a swap memory
- Make the activation permanent
- Set the swappiness level of the swap memory
- Make the swappiness level permanent
tasks:
- name: Check whether "/swapfile" exists
register: idCheckSwap
stat:
path: /swapfile
- name: Fail it if "/swapfile" exists
fail:
msg: Swap file exists
when: idCheckSwap.stat.exists == true
- name: Allocate the swap file
shell: fallocate -l {{ swap_vars.size }} /swapfile
- name: Change permission of the swap file
file:
path: /swapfile
mode: 600
- name: Create a swap area on the swap file
shell: mkswap /swapfile
- name: Activate the swap file as a swap memory
shell: swapon /swapfile
- name: Append configuration in /etc/fstab
shell: echo "\n/swapfile swap swap defaults 0 0\n" >> /etc/fstab
- name: Set swappiness level
shell: sysctl vm.swappiness={{ swap_vars.swappiness }}
- name: Append configuration in /etc/sysctl.conf
shell: echo "\nvm.swappiness={{ swap_vars.swappiness }}\n" >> /etc/sysctl.conf
Very useful article. Tested in Ansible and works like a charm. Thanks for saving me time!
ReplyDeleteThanks for this! I made a slightly upgraded version that also allows changing swap when needed, it requires two variables (swap.size_gb and swap.swappiness):
ReplyDelete---
- name: Get current swap
shell: free -g --si | grep Swap | awk '{print $2}'
register: current_swap_gb
changed_when: false
- name: Get current swappiness
shell: cat /proc/sys/vm/swappiness
register: current_swappiness
changed_when: false
- name: Exiting play early because no changes are required
meta: end_play
when: current_swap_gb.stdout|int == swap.size_gb|int and current_swappiness.stdout|int == swap.swappiness|int
- name: Disable existing swap
become: true
command: swapoff -a
ignore_errors: yes
- name: Remove old swap file
become: true
file:
path: /swapfile
state: absent
ignore_errors: yes
- name: Allocate the swap file
become: true
shell: fallocate -l {{ swap.size_gb }}G /swapfile
- name: Change permission of the swap file
become: true
file:
path: /swapfile
mode: 600
- name: Create a swap area on the swap file
become: true
shell: mkswap /swapfile
- name: Activate the swap file as a swap memory
become: true
shell: swapon /swapfile
- name: Append configuration in /etc/fstab
become: true
shell: echo "\n/swapfile swap swap defaults 0 0\n" >> /etc/fstab
- name: Set swappiness level
become: true
shell: sysctl vm.swappiness={{ swap.swappiness }}
- name: Append configuration in /etc/sysctl.conf
become: true
shell: echo "\nvm.swappiness={{ swap.swappiness }}\n" >> /etc/sysctl.conf
Or this might actually be better if you're using a role:
ReplyDelete```
---
- name: Get current swap
shell: set -o pipefail && free -g --si | grep Swap | awk '{print $2}'
args:
executable: /bin/bash
register: current_swap_gb
changed_when: false
- name: Get current swappiness
command: cat /proc/sys/vm/swappiness
register: current_swappiness
changed_when: false
- name: Set should_continue
set_fact:
should_continue: "{{ current_swap_gb.stdout|int != swap.size_gb|int or current_swappiness.stdout|int != swap.swappiness|int }}"
- name: Disable existing swap
become: true
command: swapoff -a
when: should_continue
- name: Remove old swap file
become: true
file:
path: /swapfile
state: absent
register: result
when: should_continue
- name: Allocate the swap file
become: true
command: fallocate -l {{ swap.size_gb }}G /swapfile
when: should_continue
- name: Change permission of the swap file
become: true
file:
path: /swapfile
mode: "0600"
when: should_continue
- name: Create a swap area on the swap file
become: true
command: mkswap /swapfile
when: should_continue
- name: Activate the swap file as a swap memory
become: true
command: swapon /swapfile
when: should_continue
- name: Append configuration in /etc/fstab
become: true
shell: echo "\n/swapfile swap swap defaults 0 0\n" >> /etc/fstab
when: should_continue
- name: Set swappiness level
become: true
command: sysctl vm.swappiness={{ swap.swappiness }}
when: should_continue
- name: Append configuration in /etc/sysctl.conf
become: true
shell: echo "\nvm.swappiness={{ swap.swappiness }}\n" >> /etc/sysctl.conf
when: should_continue
```