かなり雑だが ansible から LVM 設定を行うタスクファイルを書いた。
そのまま使われることを想定した作りではないので、もし流用するなら変数化するべきところを変数化して改変する形で利用して欲しい。
一応 MySQL の準同期レプリケーション + マルチスレッドレプリケーションを ansible で組む の流れをくむ関連記事として書いた。
roles/lvm/main.yml
# ボリュームグループ (vg) 及び論理ボリューム (lvg) は vagrant
# マウント先は /mnt/vagrant
# CentOS7 前提で書いてるためファイルシステムは xfs
---
# /dev/sda 以外のブロックデバイスを取得する
# /dev/sda 以外のブロックデバイスを全て LVM に入れること前提
- name: find all disk devices
find:
paths: /dev
file_type: any
patterns: "^sd[b-z]$"
use_regex: yes
register: found_devices
- name: create volume group
lvg:
vg: vagrant
pvs: "{{ found_devices.files|map(attribute='path')|join(',') }}"
become: yes
- name: create logical volume
lvol:
vg: vagrant
lv: vagrant
size: +100%FREE
shrink: no
become: yes
- name: make filesystem
filesystem:
fstype: xfs
dev: /dev/vagrant/vagrant
resizefs: yes
become: yes
- name: mount disk
mount:
path: /mnt/vagrant
src: /dev/vagrant/vagrant
fstype: xfs
state: mounted
become: yes
# ansible でのワークアラウンドをきかせるため LANG を en_US.UTF-8 で固定化
# (英語以外のロケールだと LVM のパーティション取得で失敗する)
# あと unit (単位) は "GB" ではなく "GiB" にする。でないと差分計算がずれる原因になる
- name: get each disk size
parted:
device: "{{ item.path }}"
unit: GiB
state: info
register: total_disk_size
with_items: "{{ found_devices.files }}"
environment:
LANG: en_US.UTF-8
become: yes
# /dev/sda 以外のディスクサイズの算出。表示のみ、何かしらで差分算出する場合に。
- name: get total disk size (GiB)
debug:
msg: "{{ item }}"
with_items: "{{ total_disk_size.results|map(attribute='disk')|map(attribute='size')|list|sum }}"
ちなみになぜ論理ボリュームとボリュームグループが vagrant なのかはお察しの通り vagrant でやったから。当初は Google Compute Engine 上でやるつもりだったが、複数ディスクをアタッチしてもひとつのブロックデバイスとして表示されてしまい今回の目的が達成できなかった。