一部のpython実行時間の長いプロセスがメモリ不足になり、ubuntu vagrantボックスが初めて認識されたことを実現するために、サーバーにスワップメモリが必要なプロジェクトに取り組んでいます。 AWS ubuntuインスタンスにはまだ設定されていません。
https://github.com/ansible/ansible/issues/5241 では、可能な組み込みソリューションが議論されましたが、実装されていなかったため、これは自動化するかなり一般的なタスクであると思います。
どのようにしてべき等の方法でファイルベースのスワップメモリを設定できますか? ansibleはどのモジュールまたは変数でこのセットアップを支援しますか(ansible_swaptotal_mb
変数など)?
これは私の現在の解決策です:
- 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
私は上の答えを試しましたが、"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
必要な変数:
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
新しいサーバーに4 GB(またはgroup_vars
* dd_bs_size_mb
用にswap_count
を構成したもの)のスワップ領域をインストールするために使用するansible-swapプレイブックは次のとおりです。
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
を最初にansibleインベントリに追加してください。
それはinstall-swap Host
だけです。