Skip to main content

Configuring Swap Memory on Ubuntu Using Ansible

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:

  1. Verify that /swapfile doesn't exist
  2. Fail the process if /swapfile exists
  3. Allocate /swapfile as a swap file
  4. Change the permission of /swapfile into 600
  5. Create a swap area on the swap file
  6. Activate the swap file as a swap memory
  7. Make the activation permanent
  8. Set the swappiness level of the swap memory
  9. 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

Comments

  1. Very useful article. Tested in Ansible and works like a charm. Thanks for saving me time!

    ReplyDelete
  2. Thanks 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):

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

    ReplyDelete
  3. Or this might actually be better if you're using a role:

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

    ReplyDelete

Post a Comment