Добавить память подкачки с невозможным
Я работаю над проектом, где наличие своп-памяти на моих серверах необходимо, чтобы избежать длительных процессов 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
.