Добавить память подкачки с невозможным

Я работаю над проектом, где наличие своп-памяти на моих серверах необходимо, чтобы избежать длительных процессов python для выхода из памяти и впервые реализовано, что мои брандмауэры ubuntu и экземпляры AWS ubuntu не уже настроены.

В https://github.com/ansible/ansible/issues/5241 возможное встроенное решение обсуждалось, но никогда не было реализовано, поэтому я предполагаю, что это должна быть довольно распространенная задача для автоматизации.

Как бы вы настроили память подкачки на основе файлов с помощью идемпотентного способа? Какие модули или переменные могут быть полезными для помощи в этой настройке (например, переменная ansible_swaptotal_mb)?

Ответы

Ответ 1

Это мое текущее решение:

- name: Create swap file
  command: dd if=/dev/zero of={{ swap_file_path }} bs=1024 count={{ swap_file_size_kb }}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

Ответ 2

Я попытался ответить выше, но "Check swap file type" всегда возвращался как changed и, следовательно, не idempotent, который поощряется как наилучшая практика при написании задач Ansible.

Роль ниже была проверена на Ubuntu 14.04 Trusty и не требует включения gather_facts.

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

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

Ответ 3

Вот загрузочная книжка с аналогами, которую я использую для установки 4 ГБ (или что бы я ни настраивал group_vars для dd_bs_size_mb * swap_count) пространства подкачки на новых серверах:

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

Я также добавил функцию в свой ~/.bash_profile, чтобы помочь с задачей:

# 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"
}

Просто убедитесь, что вы сначала добавили свой HOST в свой доступный инвентарь.

Тогда это просто install-swap HOST.