Add swap memory with ansible

前端 未结 5 2052
醉酒成梦
醉酒成梦 2021-02-05 01:57

I\'m working on a project where having swap memory on my servers is a needed to avoid some python long running processes to go out of memory and realized for the first time that

相关标签:
5条回答
  • 2021-02-05 02:11

    Here is the ansible-swap playbook that I use to install 4GB (or whatever I configure group_vars for dd_bs_size_mb * swap_count) of swap space on new servers:

    https://github.com/tribou/ansible-swap

    I also added a function in my ~/.bash_profile to help with the task:

    # Path to where you clone the repo
    ANSIBLE_SWAP_PLAYBOOK=$HOME/dev/ansible-swap
    
    install-swap ()
    {
        usage='Usage: install-swap HOST';
        if [ $# -ne 1 ]; then
            echo "$usage";
            return 1;
        fi;
        ansible-playbook $ANSIBLE_SWAP_PLAYBOOK/ansible-swap/site.yml --extra-vars "target=$1"
    }
    

    Just make sure to add your HOST to your ansible inventory first.

    Then it's just install-swap HOST.

    0 讨论(0)
  • 2021-02-05 02:13

    I tried the answer above but "Check swap file type" always came back as changed and therefore isn't idempotent which is encouraged as a best practice when writing Ansible tasks.

    The role below has been tested on Ubuntu 14.04 Trusty and doesn't require gather_facts to be enabled.

    - name: Set swap_file variable
      set_fact:
        swap_file: "{{swap_file_path}}"
      tags:
        - swap.set.file.path
    
    - name: Check if swap file exists
      stat:
        path: "{{swap_file}}"
      register: swap_file_check
      tags:
        - swap.file.check
    
    - name: Create swap file
      command: fallocate -l {{swap_file_size}} {{swap_file}}
      when: not swap_file_check.stat.exists
      tags:
        - swap.file.create
    
    - name: Change swap file permissions
      file: path="{{swap_file}}"
            owner=root
            group=root
            mode=0600
      tags:
        - swap.file.permissions
    
    - name: Format swap file
      sudo: yes
      command: "mkswap {{swap_file}}"
      when: not swap_file_check.stat.exists
      tags:
        - swap.file.mkswap
    
    - name: Write swap entry in fstab
      mount: name=none
             src={{swap_file}}
             fstype=swap
             opts=sw
             passno=0
             dump=0
             state=present
      tags:
        - swap.fstab
    
    - name: Turn on swap
      sudo: yes
      command: swapon -a
      when: not swap_file_check.stat.exists
      tags:
        - swap.turn.on
    
    - name: Set swappiness
      sudo: yes
      sysctl:
        name: vm.swappiness
        value: "{{swappiness}}"
      tags:
        - swap.set.swappiness
    

    Vars required:

    swap_file_path: /swapfile
    # Use any of the following suffixes
    # c=1
    # w=2
    # b=512
    # kB=1000
    # K=1024
    # MB=1000*1000
    # M=1024*1024
    # xM=M
    # GB=1000*1000*1000
    # G=1024*1024*1024
    swap_file_size: 4G
    swappiness: 1
    
    0 讨论(0)
  • 2021-02-05 02:27

    This is my current solution:

    - name: Create swap file
      command: dd if=/dev/zero of={{ swap_file_path }} bs=1024 count={{ swap_file_size_mb }}k
               creates="{{ swap_file_path }}"
      tags:
        - swap.file.create
    
    
    - name: Change swap file permissions
      file: path="{{ swap_file_path }}"
            owner=root
            group=root
            mode=0600
      tags:
        - swap.file.permissions
    
    
    - name: "Check swap file type"
      command: file {{ swap_file_path }}
      register: swapfile
      tags:
        - swap.file.mkswap
    
    
    - name: Make swap file
      command: "sudo mkswap {{ swap_file_path }}"
      when: swapfile.stdout.find('swap file') == -1
      tags:
        - swap.file.mkswap
    
    
    - name: Write swap entry in fstab
      mount: name=none
             src={{ swap_file_path }}
             fstype=swap
             opts=sw
             passno=0
             dump=0
             state=present
      tags:
        - swap.fstab
    
    
    - name: Mount swap
      command: "swapon {{ swap_file_path }}"
      when: ansible_swaptotal_mb < 1
      tags:
        - swap.file.swapon
    
    0 讨论(0)
  • 2021-02-05 02:27

    What works for me is to add 4Gib swap through the playbook.

    Check this:

    this.

    0 讨论(0)
  • 2021-02-05 02:32

    I based my take on the great Ashley's answer (please upvote it!) and added the following extra features:

    • global flag to manage the swap or not,
    • allow changing the swap size,
    • allow disabling swap,

    ...plus these technical improvements:

    • full idempotency (only ok & skipping when nothing is changed, otherwise some changed),
    • use dd instead of fallocate for compatibility with XFS fs (see this answer for more info),

    Tested on Centos 7.7 with Ansible 2.9.10.

    Parameters:

    swap_configure: true # manage the swap or not 
    swap_enable: true
    swap_file_path: /swapfile
    swap_file_size_mb: 4096
    swappiness: 1
    

    The code:

    - name: Configure swap
      when: swap_configure | bool | default(false)
      block:
    
        - name: Check if swap file exists
          stat:
            path: "{{swap_file_path}}"
          register: swap_file_check
          changed_when: false
    
        - name: Check if swap is on
          shell: swapon --show | grep {{swap_file_path}}
          register: swap_enabled
          changed_when: false
          failed_when: false
    
        - name: Disable swap
          command: swapoff {{swap_file_path}}
          register: swap_disabled
          when: >
            swap_file_check.stat.exists
            and swap_enabled.rc == 0
            and (not swap_enable
                 or (swap_enable and swap_file_check.stat.size != (swap_file_size_mb * 1024 * 1024)))
    
        - name: Delete the swap file
          file:
            path: "{{swap_file_path}}"
            state: absent
          when: not swap_enable
    
        - name: Configure swap
          when: swap_enable|bool
          block:
    
            - name: Create or change the size of swap file
              command: dd if=/dev/zero of={{swap_file_path}} count={{swap_file_size_mb}} bs=1MiB
              register: swap_file_created
              when: >
                not swap_file_check.stat.exists
                or swap_file_check.stat.size != (swap_file_size_mb * 1024 * 1024)
    
            - name: Change swap file permissions
              file: path="{{swap_file_path}}"
                owner=root
                group=root
                mode=0600
    
            - name: Check if swap is formatted
              shell: file {{swap_file_path}} | grep 'swap file'
              register: swap_file_is_formatted
              changed_when: false
              failed_when: false
    
            - name: Format swap file if it's not formatted
              command: mkswap {{swap_file_path}}
              when: swap_file_is_formatted.rc > 0 or swap_file_created.changed
    
            - name: Add swap entry to fstab
              mount: name=none
                src={{swap_file_path}}
                fstype=swap
                opts=sw
                passno=0
                dump=0
                state=present
    
            - name: Turn on swap
              shell: swapon -a
              when: swap_enabled.rc == 0 and swap_disabled.changed
    
            - name: Configure swappiness
              sysctl:
                name: vm.swappiness
                value: "{{ swappiness }}"
                state: present
    
    0 讨论(0)
提交回复
热议问题