25、使用Ansible管理分区、LVM和存储配置

使用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 步骤概述

  1. 创建 exercise152.yaml 文件并编写剧本头。
  2. /dev/sdb 上创建GPT分区。
  3. 创建第二个分区作为LVM物理卷。
  4. 设置LVM卷组。
  5. 在卷组内创建逻辑卷。
  6. 在逻辑卷上创建XFS文件系统。
  7. 挂载文件系统。
  8. 条件配置交换空间。
  9. 确保 /dev/sdb 为空。
  10. 重启目标主机。
  11. 运行剧本。
  12. 再次运行剧本,注意逻辑卷创建任务的幂等性问题。

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剧本的稳定性和可靠性,更高效地完成存储配置管理任务。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值