使用Ansible管理分区、LVM和存储配置
1. 引言
在检测到需要使用的磁盘设备后,就可以开始创建分区和逻辑卷。下面将详细介绍如何使用Ansible的各个模块来完成这些操作,包括分区创建、LVM管理、文件系统创建与挂载以及交换空间配置。
2. 创建分区
若要管理分区,可使用Ansible的
parted
模块。该模块有一些选项不太直观,以下是相关介绍:
2.1
parted
模块选项概述
| 选项 | 说明 |
|---|---|
name
| 创建GPT分区时必须指定,MBR分区则不需要 |
label
| 用于设置分区表类型,而非文件系统标签 |
part_start
和
part_end
| 用于指定分区的起始和结束位置,若不指定,分区将占用整个磁盘空间 |
flags
| 设置分区类型,创建LVM分区时需要指定 |
2.2 创建分区示例
---
- name: create storage
hosts: ansible2
tasks:
- name: create new partition
parted:
name: files
label: gpt
device: /dev/sdb
number: 1
state: present
part_start: 1MiB
part_end: 2GiB
- name: create another new partition
parted:
name: swap
label: gpt
device: /dev/sdb
number: 2
state: present
part_start: 2GiB
part_end: 4GiB
flags: [ lvm ]
2.3 流程图
graph LR
A[开始] --> B[指定分区名称和标签]
B --> C[选择磁盘设备]
C --> D[设置分区编号和状态]
D --> E[指定分区起始和结束位置]
E --> F[设置分区类型(可选)]
F --> G[创建分区]
G --> H[结束]
3. 管理卷组和LVM逻辑卷
3.1 管理LVM卷组
使用
lvg
模块管理LVM卷组,创建卷组相对简单,只需使用
vg
参数设置卷组名称,
pvs
参数指定物理卷。示例如下:
- name: create a volume group
lvg:
vg: vgdata
pesize: "8"
pvs: /dev/sdb1
3.2 管理LVM逻辑卷
创建LVM逻辑卷使用
lvol
模块,有多种选项可供选择。示例如下:
- name: create a logical volume
lvol:
lv: lvdata
size: 100%FREE
vg: vgdata
3.3 表格:
lvol
常用选项
| 选项 | 说明 |
|---|---|
lv
| 逻辑卷名称 |
size
| 逻辑卷大小 |
vg
| 所属卷组 |
4. 创建和挂载文件系统
4.1 创建文件系统
使用
filesystem
模块创建文件系统,该模块支持创建和调整文件系统大小。示例如下:
- name: create an XFS filesystem
filesystem:
dev: /dev/vgdata/lvdata
fstype: xfs
4.2 挂载文件系统
使用
mount
模块挂载文件系统,示例如下:
- name: mount the filesystem
mount:
src: /dev/vgdata/lvdata
fstype: xfs
state: mounted
path: /mydir
4.3 表格:
filesystem
和
mount
模块常用选项
| 模块 | 选项 | 说明 |
|---|---|---|
filesystem
|
dev
| 设备名称 |
fstype
| 文件系统类型 | |
mount
|
src
| 源设备 |
fstype
| 文件系统类型 | |
state
| 挂载状态 | |
path
| 挂载路径 |
5. 配置交换空间
交换空间在内存不足的系统中很有用。配置交换空间的步骤如下:
5.1 格式化设备为交换空间
使用
filesystem
模块格式化设备为交换空间:
filesystem:
fstype: swap
dev: /dev/sdb1
5.2 激活交换空间
使用
command
模块运行
swapon
命令激活交换空间:
command: swapon /dev/sdb1
5.3 条件配置交换空间
可使用条件语句根据系统当前的交换空间大小来决定是否配置交换空间:
---
- name: configure swap storage
hosts: ansible2
tasks:
- name: setup swap
block:
- name: make the swap filesystem
filesystem:
fstype: swap
dev: /dev/sdb1
- name: activate swap space
command: swapon /dev/sdb1
when: ansible_swaptotal_mb < 256
6. 练习:设置存储
6.1 步骤概述
-
创建
exercise152.yaml文件并编写剧本头。 -
在
/dev/sdb上创建GPT分区。 - 创建第二个分区作为LVM物理卷。
- 设置LVM卷组。
- 在卷组内创建逻辑卷。
- 在逻辑卷上创建XFS文件系统。
- 挂载文件系统。
- 条件配置交换空间。
-
确保
/dev/sdb为空。 - 重启目标主机。
- 运行剧本。
- 再次运行剧本,注意逻辑卷创建任务的幂等性问题。
6.2 详细步骤
6.2.1 创建剧本头
---
- name: create storage
hosts: ansible2
tasks:
6.2.2 创建GPT分区
- name: create new partition
parted:
name: files
label: gpt
device: /dev/sdb
number: 1
state: present
part_start: 1MiB
part_end: 2GiB
6.2.3 创建LVM物理卷分区
- name: create another new partition
parted:
name: swap
label: gpt
device: /dev/sdb
number: 2
state: present
part_start: 2GiB
part_end: 4GiB
flags: [ lvm ]
6.2.4 设置LVM卷组
- name: create a volume group
lvg:
vg: vgdata
pesize: "8"
pvs: /dev/sdb2
6.2.5 创建逻辑卷
- name: create a logical volume
lvol:
lv: lvdata
size: 100%FREE
vg: vgdata
6.2.6 创建XFS文件系统
- name: create an XFS filesystem
filesystem:
dev: /dev/vgdata/lvdata
fstype: xfs
6.2.7 挂载文件系统
- name: mount the filesystem
mount:
src: /dev/vgdata/lvdata
fstype: xfs
state: mounted
path: /data
6.2.8 条件配置交换空间
- name: setup swap
block:
- name: make the swap filesystem
filesystem:
fstype: swap
dev: /dev/sdb1
- name: activate swap space
command: swapon /dev/sdb1
when: ansible_swaptotal_mb < 256
6.2.9 确保
/dev/sdb
为空
ansible ansible2 -a "dd if=/dev/zero of=/dev/sdb bs=1M count=10"
6.2.10 重启目标主机
ansible ansible2 -m reboot
6.2.11 运行剧本
ansible-playbook exercise152.yaml
6.2.12 再次运行剧本
再次运行剧本时,逻辑卷创建任务可能会出错,因为
size
指定为
100%FREE
,不是绝对数值,不具备幂等性。为确保剧本具有幂等性,应使用绝对数值。
7. 高级练习:设置高级存储解决方案
7.1 需求概述
-
剧本任务仅在存在
/dev/sdb设备的主机上执行。 -
若不存在
/dev/sdb设备,打印“device sdb not present”并停止执行任务。 - 配置设备,使其有一个包含所有可用磁盘空间的分区。
-
创建名为
vgfiles的LVM卷组。 -
若卷组大于5GB,创建名为
lvfiles、大小为6GB的LVM逻辑卷。 -
若卷组小于等于5GB,创建名为
lvfiles、大小为3GB的LVM逻辑卷。 - 使用XFS文件系统格式化卷。
-
将其挂载到
/files目录。
7.2 详细步骤
7.2.1 测试卷组大小
首先创建
exercise153-dev1.yaml
文件进行卷组大小测试:
---
- name: get vg sizes
hosts: all
tasks:
- name: find small vgroup sizes
debug:
msg: volume group smaller than or equal to 20G
when:
- ansible_facts['lvm']['vgs']['cl'] is defined
- ansible_facts['lvm']['vgs']['cl']['size_g'] <= 20.00
- name: find large vgroup size
debug:
msg: volume group larger than or equal to 19G
when:
- ansible_facts['lvm']['vgs']['cl'] is defined
- ansible_facts['lvm']['vgs']['cl']['size_g'] >= 19.00
运行该剧本会失败,原因是变量类型不兼容。
7.2.2 修正变量类型
创建
exercise153-dev2.yaml
文件,使用
int
过滤器强制变量类型为整数:
---
- name: get vg sizes
ignore_errors: yes
hosts: all
tasks:
- name: set vgroup sizes in variables
set_fact:
vgsize: "{{ ansible_facts['lvm']['vgs']['cl']['size_g'] | int }}"
- name: debug this
debug:
msg: the value of vgsize is {{ vgsize }}
- name: testing big vgsize value
debug:
msg: the value of vgsize is bigger than 5
when: vgsize | int > 5
- name: testing small vgsize value
debug:
msg: the value of vgsize is smaller than 5
when: vgsize | int <= 5
运行该剧本不会失败,可作为后续测试
vgfiles
卷组大小的示例。
7.2.3 编写完整剧本
创建
exercise153.yaml
文件,逐步完成存储解决方案的设置。
7.2.3.1 检查
/dev/sdb
是否存在
---
- name: setup up hosts that have an sdb device
hosts: all
tasks:
- name: getting out with a nice failure message if there is no second disk
fail:
msg: there is no second disk
when: ansible_facts['devices']['sdb'] is not defined
7.2.3.2 创建分区和卷组
- name: create a partition
parted:
device: /dev/sdb
number: 1
state: present
- name: create a volume group
lvg:
pvs: /dev/sdb1
vg: vgfiles
7.2.3.3 保存卷组大小到变量
- name: get vg size and convert to integer in new variable
set_fact:
vgsize: "{{ ansible_facts['lvm']['vgs']['vgfiles']['size_g'] | int }}"
- name: show vgsize value
debug:
var: "{{ vgsize }}"
7.2.3.4 运行测试
运行剧本前,确保
/dev/sdb
设备为空并重启主机。运行剧本时可能会出现错误,原因是变量未正确设置,需要在创建卷组后运行
setup
模块更新事实。
7.2.3.5 修正并继续
- name: create a volume group
lvg:
pvs: /dev/sdb1
vg: vgfiles
- name: run the setup module so that we can use updated facts
setup:
- name: get vg size and convert to integer in new variable
set_fact:
vgsize: "{{ ansible_facts['lvm']['vgs']['vgfiles']['size_g'] | int }}"
- name: show vgsize value
debug:
var: "{{ vgsize }}"
7.2.3.6 创建逻辑卷
- name: create an LVM on big volume groups
lvol:
vg: vgfiles
lv: lvfiles
size: 6g
when: vgsize | int > 5
- name: create an LVM on small volume groups
lvol:
vg: vgfiles
lv: lvfiles
size: 3g
when: vgsize | int <= 5
7.2.3.7 格式化文件系统并挂载
- name: formatting the XFS filesystem
filesystem:
dev: /dev/vgfiles/lvfiles
fstype: xfs
- name: mounting /dev/vgfile/lvfiles
mount:
src: /dev/vgfiles/lvfiles
fstype: xfs
state: mounted
path: /files
通过以上步骤,就可以使用Ansible完成分区、LVM和存储配置的管理,以及高级存储解决方案的设置。在实际操作中,要注意变量类型、幂等性等问题,确保剧本的正确性和稳定性。
7.2.4 流程图:高级存储解决方案设置流程
graph LR
A[开始] --> B[检查 /dev/sdb 是否存在]
B -- 存在 --> C[创建分区]
B -- 不存在 --> D[打印错误信息并停止]
C --> E[创建卷组]
E --> F[运行 setup 模块更新事实]
F --> G[保存卷组大小到变量]
G --> H{卷组大小 > 5GB?}
H -- 是 --> I[创建 6GB 逻辑卷]
H -- 否 --> J[创建 3GB 逻辑卷]
I --> K[格式化文件系统]
J --> K
K --> L[挂载文件系统]
L --> M[结束]
7.2.5 表格:高级存储解决方案步骤总结
| 步骤 | 操作 | 代码示例 |
|---|---|---|
| 1 |
检查
/dev/sdb
是否存在
|
yaml<br>- name: getting out with a nice failure message if there is no second disk<br> fail:<br> msg: there is no second disk<br> when: ansible_facts['devices']['sdb'] is not defined<br>
|
| 2 | 创建分区 |
yaml<br>- name: create a partition<br> parted:<br> device: /dev/sdb<br> number: 1<br> state: present<br>
|
| 3 | 创建卷组 |
yaml<br>- name: create a volume group<br> lvg:<br> pvs: /dev/sdb1<br> vg: vgfiles<br>
|
| 4 |
运行
setup
模块更新事实
|
yaml<br>- name: run the setup module so that we can use updated facts<br> setup:<br>
|
| 5 | 保存卷组大小到变量 |
yaml<br>- name: get vg size and convert to integer in new variable<br> set_fact:<br> vgsize: "{{ ansible_facts['lvm']['vgs']['vgfiles']['size_g'] | int }}"<br>- name: show vgsize value<br> debug:<br> var: "{{ vgsize }}"<br>
|
| 6 | 根据卷组大小创建逻辑卷 |
yaml<br>- name: create an LVM on big volume groups<br> lvol:<br> vg: vgfiles<br> lv: lvfiles<br> size: 6g<br> when: vgsize | int > 5<br>- name: create an LVM on small volume groups<br> lvol:<br> vg: vgfiles<br> lv: lvfiles<br> size: 3g<br> when: vgsize | int <= 5<br>
|
| 7 | 格式化文件系统 |
yaml<br>- name: formatting the XFS filesystem<br> filesystem:<br> dev: /dev/vgfiles/lvfiles<br> fstype: xfs<br>
|
| 8 | 挂载文件系统 |
yaml<br>- name: mounting /dev/vgfile/lvfiles<br> mount:<br> src: /dev/vgfiles/lvfiles<br> fstype: xfs<br> state: mounted<br> path: /files<br>
|
8. 总结与注意事项
8.1 总结
本文详细介绍了使用Ansible管理分区、LVM和存储配置的方法,包括创建分区、管理卷组和逻辑卷、创建和挂载文件系统、配置交换空间等操作。通过实际的代码示例和练习,展示了如何编写Ansible剧本完成这些任务。同时,还介绍了一个高级存储解决方案的设置流程,包括卷组大小的判断和逻辑卷的动态创建。
8.2 注意事项
-
变量类型
:在使用Ansible进行条件判断时,要注意变量类型的兼容性。如在比较卷组大小时,需要使用
int过滤器将变量类型转换为整数,避免出现“Unexpected templating error”。 -
幂等性
:编写Ansible剧本时,要确保任务具有幂等性。例如,在创建逻辑卷时,使用相对大小(如
100%FREE)可能会导致剧本在多次运行时出现错误,应使用绝对数值。 -
事实更新
:在使用Ansible事实时,要确保事实信息是最新的。如果在剧本执行过程中创建了新的卷组或逻辑卷,需要运行
setup模块更新事实,以便后续任务能够正确使用这些信息。
通过遵循这些注意事项,可以提高Ansible剧本的稳定性和可靠性,更高效地完成存储配置管理任务。
超级会员免费看

32

被折叠的 条评论
为什么被折叠?



