カテゴリー
Linux

メモリの 2 倍の領域を持つ swap を作成してマウントする Ansible プレイブックを作りました

はじめに

Amazon Lightsail 低スペックインスタンスのメモリ不足を解消するために Swap を作り、快適になりました♪ – oki2a24 の効果を実感しましたので、次からは自動で行えるようにするために Ansible のプレイブック化いたしました。

参考ページ

メモリの 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 のプロビジョニング対象のメモリを取得できます。

すでに 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

おわりに

土台としたページに沿っていますけれども、もっと判定を簡単にできないかと調べ、改良いたしました。

冪等性も保つことができ、満足しております。

以上です。

コメントを残す