はじめに
Amazon Lightsail 低スペックインスタンスのメモリ不足を解消するために Swap を作り、快適になりました♪ – oki2a24 の効果を実感しましたので、次からは自動で行えるようにするために Ansible のプレイブック化いたしました。
参考ページ
- 改めて swap とは => swapファイルの作り方
- swap 作りの土台としたプレイブック => EC2インスタンスにswapを作った話 | | ぬるエンジニアブログ
メモリの 2 倍を swap として作成してマウントする Ansible プレイブック
---
- set_fact:
swap_file_path: /swapfile
- name: zero padding
command: dd if=/dev/zero of={{ swap_file_path }} bs=1M count={{ ansible_memtotal_mb * 2 }}
args:
creates: '{{ swap_file_path }}'
- name: chmod swap file
file:
path: '{{ swap_file_path }}'
mode: '0600'
- name: set up a Linux swap area
command: mkswap {{ swap_file_path }}
when: ansible_swaptotal_mb == 0
- name: enable file for swapping
command: swapon {{ swap_file_path }}
when: ansible_swaptotal_mb == 0
- name: mount swap
mount:
name: swap
src: '{{ swap_file_path }}'
fstype: swap
opts: defaults
passno: '0'
dump: '0'
state: present
解説
set_fact
/swqpfile
を変数 swap_file_path 設定しています。 group_vars/all
などに記述すれば、不要となる部分です。
- set_fact:
swap_file_path: /swapfile
zero padding
スワップファイルを作成しています。
/dev/zero
という内容を (if) 、ファイル swap_file_path へ (of) 、 1 M を基準となるサイズに指定して (bs) 、 ansible_memtotal_mb * 2 回 (count) 繰り返して書き込むことでファイルを作成しています。
bs が大きすぎると、メモリを使い果たしてハングアウトしてしまう点に注意です。
ansible_memtotal_mb は、 Ansible のプロビジョニング対象のメモリを取得できます。
- Variables discovered from systems: Facts Using Variables — Ansible Documentation
ansible hostname -m setup
で ansible_memtotal_mb 含め利用できる変数の全てを調べられる。
すでに swap_file_path が存在する場合は、このタスクを実行して欲しくないので、 creates を指定しています。 create のファイルが存在する場合は、 command は実行されません。
- name: zero padding
command: dd if=/dev/zero of={{ swap_file_path }} bs=1M count={{ ansible_memtotal_mb * 2 }}
args:
creates: '{{ swap_file_path }}'
chmod swap file
swap ファイルのパーミッションを 600 に設定します。
- name: chmod swap file
file:
path: '{{ swap_file_path }}'
mode: '0600'
set up a Linux swap area
mkswap
でスワップ領域を作成します。
このタスクは、スワップ領域が存在しない場合のみ、実行されます。
ansible_swaptotal_mb で swap の総 MB を取得できますので、これが 0 であればスワップが存在しないと判断できます。
- name: set up a Linux swap area
command: mkswap {{ swap_file_path }}
when: ansible_swaptotal_mb == 0
enable file for swapping
swapon
でスワップ領域を有効にします。
このタスクも先ほどと同じやり方で、スワップ領域が存在しない場合のみ、実行されます。
- name: enable file for swapping
command: swapon {{ swap_file_path }}
when: ansible_swaptotal_mb == 0
mount swap
ブート時にスワップ領域が有効になるように、 /etc/fstab
に次の内容が追加されるようにします。すでに存在する場合は、何もしません。
/swapfile swap swap defaults 0 0
- name: mount swap
mount:
name: swap
src: '{{ swap_file_path }}'
fstype: swap
opts: defaults
passno: '0'
dump: '0'
state: present
おわりに
土台としたページに沿っていますけれども、もっと判定を簡単にできないかと調べ、改良いたしました。
冪等性も保つことができ、満足しております。
以上です。