24、Ansible任务管理与存储管理全解析

Ansible任务管理与存储管理全解析

1. 任务管理基础

在Ansible中,我们可以使用不同的模块来管理任务,如systemd、cron和at模块。以下是一个使用cron模块在系统重启时运行任务的示例:

- name: run a cron job on reboot
  cron:
    name: "run on reboot"
    state: present
    special_time: reboot
    job: "echo rebooted at $(date) >> /tmp/rebooted"

上述代码实现了在系统重启时,将重启的时间信息追加到 /tmp/rebooted 文件中。

除了cron任务,我们还可以使用reboot模块来重启受管主机。以下是具体的操作步骤:
1. 添加重启任务

- name: reboot managed host
  reboot:
    msg: reboot initiated by Ansible
    test_command: whoami

此任务会向受管主机发送重启指令,并在重启后执行 whoami 命令来检查主机是否恢复正常。
2. 显示重启成功信息

- name: show reboot success
  debug:
    msg: just rebooted successfully

当主机成功重启后,会显示“just rebooted successfully”的信息。

  1. 运行Playbook
    完成Playbook编写后,使用以下命令运行:
ansible-playbook exercise143.yaml

运行该命令后,需要等待一段时间,直到目标主机重启完成。当主机恢复后,使用以下命令查看重启信息:

ansible ansible2 -a “cat /tmp/rebooted”

执行该命令后,你会看到两条重启信息,且前后两条信息之间大约间隔30秒。

2. 关键概念定义

在学习过程中,我们需要明确一些关键术语的定义:
- anacron :用于在系统关机期间错过的定时任务在系统下次开机时执行。
- init system :是Linux系统启动时的第一个进程,负责启动和管理系统中的其他进程。

3. 复习问题

以下是一些复习问题,帮助你巩固所学知识:
1. 应该使用哪个Ansible模块来打印systemd服务的相关信息?
2. 若要编写一个通用的Playbook,在Ubuntu和Red Hat系统上启动vsftpd服务,应使用哪个Ansible模块?
3. 使用cron模块管理cron任务时,必须使用哪个参数?
4. 应使用哪个模块来设置系统启动时的默认systemd目标?
5. 使用cron模块时,哪个参数可用于安排任务在系统重启后立即执行?
6. 使用at模块时,哪些参数可用于指定从现在起的分钟数?
7. 使用reboot模块时,哪个参数可用于定义如何检查重启后的节点是否恢复正常?
8. 使用reboot模块时,哪个参数可用于指定Ansible在重启节点未返回时等待的最长时间,超过该时间将产生失败信息?
9. 使用at模块时,哪个参数可用于运行脚本文件?
10. 为什么不能在lineinfile模块中使用bash命令替换来处理命令的结果?

4. 实验任务

在实验中,我们需要编写一个Playbook,满足以下要求:
- 使用cron模块在每个工作日的凌晨2点重启受管服务器。
- 重启后,向syslog写入一条消息,内容为“CRON initiated reboot just completed”。
- 将默认systemd目标设置为multi - user.target。
- 最后一个任务使用服务信息来显示cron进程的当前版本。

5. 存储管理概述

在Ansible环境中进行存储管理时,我们需要了解受管节点上存在哪些存储设备。存储设备类型繁多,不同设备可能使用不同的名称。为确保Playbook能正确应用到目标设备,我们需要先发现可用的设备,再使用条件语句确保任务在正确的设备上执行。

6. 存储相关模块

以下是一些用于管理存储的Ansible模块:
| 模块用途 | 模块名称 |
| ---- | ---- |
| 以脚本方式管理分区 | parted |
| 管理LVM中使用的扩展大小 | lvg |
| 获取发现磁盘的信息 | ansible_devices |
| 根据发现的Ansible事实设置任务内的变量 | set_facts |

7. 存储相关事实的使用

存储相关的事实会在setup模块收集受管机器信息时自动收集,相关信息存储在不同的事实中。我们可以使用 ansible -m setup 命令并结合过滤器来请求特定信息。例如,使用以下命令获取存储设备的通用信息:

ansible ansible1 -m setup -a ’filter=ansible_devices’

执行该命令后,会输出类似以下的结果:

ansible1 | SUCCESS => {
    "ansible_facts": {
        "ansible_devices": {
            ...
            "sda": {
                "holders": [],
                "host": "SCSI storage controller: Broadcom / LSI 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)",
                "links": {
                    "ids": [],
                    "labels": [],
                    "masters": [],
                    "uuids": []
                },
                "model": "VMware Virtual S",
                "partitions": {
                    "sda1": {
                        "holders": [],
                        "links": {
                            "ids": [],
                            "labels": [],
                            "masters": [],
                            "uuids": [
                                "7acd65d6-115f-499f-a02f-90364a18b9fc"
                            ]
                        },
                        "sectors": "2097152",
                        "sectorsize": 512,
                        "size": "1.00 GB",
                        "start": "2048",
                        "uuid": "7acd65d6-115f-499f-a02f-90364a18b9fc"
                    },
                    "sda2": {
                        "holders": [
                            "cl-swap",
                            "cl-root"
                        ],
                        "links": {
                            "ids": [
                                "lvm-pv-uuid-vswoyx-HihU-cRqK-2tvx-aesr-SXAR-YY1lLL"
                            ],
                            "labels": [],
                            "masters": [
                                "dm-0",
                                "dm-1"
                            ],
                            "uuids": []
                        },
                        "sectors": "39843840",
                        "sectorsize": 512,
                        "size": "19.00 GB",
                        "start": "2099200",
                        "uuid": null
                    }
                },
                "removable": "0",
                "rotational": "1",
                "sas_address": null,
                "sas_device_handle": null,
                "scheduler_mode": "mq-deadline",
                "sectors": "41943040",
                "sectorsize": "512",
                "size": "20.00 GB",
                "support_discard": "0",
                "vendor": "VMware,",
                "virtual": 1
            },
            "sr0": {
                ...
            }
        },
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false
}
8. 存储相关事实在条件语句中的应用

在Ansible Playbook中处理存储设备时,仅收集事实是不够的,还需要将这些事实应用到条件语句中。我们可以使用assert模块或when语句来实现。

以下是使用assert模块的示例:

---
- name: search for /dev/sdb continue only if it is found
  hosts: all
  vars:
    disk_name: sdb
  tasks:
  - name: abort if second disk does not exist
    assert:
      that:
        - "ansible_facts['devices']['{{ disk_name }}'] is defined"
      fail_msg: second hard disk not found
  - debug:
      msg: "{{ disk_name }} was found, lets continue"

运行该Playbook后,若找不到指定的磁盘设备,会输出错误信息;若找到,则会继续执行后续任务。

9. 处理不同设备名称

为了确保分区操作能正确处理不同的设备名称,我们可以编写一个Playbook,先找出磁盘设备的名称并存储在变量中,以便后续使用。以下是具体步骤:
1. 创建Playbook文件

---
- name: define variable according to diskname detected
  hosts: all
  tasks:
  1. 设置变量
- ignore_errors: yes
  set_fact:
    disk2name: sdb
  when: ansible_facts['devices']['sdb']

此任务会检查是否存在 sdb 设备,若存在则将 disk2name 变量设置为 sdb
3. 处理其他可能的设备

- ignore_errors: yes
  set_fact:
    disk2name: nvme0n2
  when: ansible_facts['devices']['nvme0n2']

若存在 nvme0n2 设备,则将 disk2name 变量设置为 nvme0n2
4. 处理无第二块磁盘的情况

- name: getting out if there is no second disk
  fail:
    msg: there is no second disk
  when: disk2name is not defined

若未检测到第二块磁盘,Playbook将停止执行,并输出错误信息。
5. 显示检测结果

- name: showing this only for hosts with a second disk
  debug:
    msg: continuing with {{ disk2name }}

若检测到第二块磁盘,将显示该磁盘的名称。

10. 运行Playbook

在运行Playbook之前,建议添加一个具有非 /dev/sdb 第二块磁盘设备的节点。运行Playbook的命令如下:

ansible-playbook exercise151.yaml

运行后,根据不同的设备情况,Playbook会输出相应的信息。

Ansible任务管理与存储管理全解析

11. 存储管理操作流程总结

为了更清晰地展示存储管理的操作流程,我们可以用以下mermaid流程图来表示:

graph LR
    A[发现存储设备] --> B[收集存储相关事实]
    B --> C{是否找到目标设备}
    C -- 是 --> D[使用条件语句执行任务]
    C -- 否 --> E[停止执行并输出错误信息]
    D --> F[处理不同设备名称]
    F --> G[执行存储管理任务]

这个流程图展示了从发现存储设备到最终执行存储管理任务的整个过程。首先,我们需要发现受管节点上的存储设备,然后收集这些设备的相关事实。接着,判断是否找到了目标设备,如果找到了,就使用条件语句确保任务在正确的设备上执行;如果没找到,则停止执行并输出错误信息。之后,处理不同的设备名称,最后执行存储管理任务。

12. 存储管理模块详细解析

在前面我们介绍了一些存储管理模块,下面对这些模块进行更详细的解析:
- parted模块 :用于以脚本方式管理分区。当需要创建分区时,例如在一个已经有一个2GiB分区的磁盘上创建第二个2GiB分区,需要使用 part_start part_end 参数。如果第一个分区从磁盘起始位置开始,大小为2GiB,那么创建第二个分区时, part_start 应设置为2GiB, part_end 应设置为4GiB。示例代码如下:

- name: Create a second partition
  parted:
    device: /dev/sda
    number: 2
    part_start: 2GiB
    part_end: 4GiB
    state: present

另外,若要创建GPT分区,需要使用 label: gpt 参数:

- name: Create GPT partition
  parted:
    device: /dev/sda
    label: gpt
    state: present
  • lvg模块 :用于管理LVM中使用的扩展大小。在创建或管理逻辑卷组时,该模块非常有用。例如,创建一个名为 myvg 的逻辑卷组,使用 /dev/sdb 作为物理卷:
- name: Create a logical volume group
  lvg:
    vg: myvg
    pvs: /dev/sdb
    state: present
  • filesystem模块 :用于创建文件系统并设置文件系统标签。若要设置文件系统标签为 mylabel ,可以使用 fslabel 参数:
- name: Create filesystem with label
  filesystem:
    fstype: ext4
    dev: /dev/sda2
    fslabel: mylabel
    state: present
  • mount模块 :用于挂载文件系统并将其持久化到 /etc/fstab 。若要确保文件系统现在挂载并持久化,使用 state: mounted 参数:
- name: Mount and persist filesystem
  mount:
    path: /mnt/mydir
    src: /dev/sda2
    fstype: ext4
    state: mounted
13. 存储管理中的常见问题及解决方法

在存储管理过程中,可能会遇到一些常见问题,以下是一些问题及解决方法:
| 问题描述 | 解决方法 |
| ---- | ---- |
| 比较浮点数大小时出现问题 | 使用 int 过滤器将浮点数转换为整数后再进行比较。例如: {{ float_variable | int }} |
| 找不到指定的存储设备 | 检查设备名称是否正确,使用 ansible -m setup -a ’filter=ansible_devices’ 命令查看所有可用设备。 |
| Playbook执行时因设备不存在而失败 | 使用 ignore_errors: yes 参数忽略错误,或者使用 assert 模块在设备不存在时输出错误信息。 |

14. 存储管理的最佳实践

为了更好地进行存储管理,以下是一些最佳实践:
- 提前规划 :在进行存储管理操作之前,先规划好分区、逻辑卷组和文件系统的布局,避免后续出现问题。
- 使用变量 :将设备名称、分区大小等信息存储在变量中,提高Playbook的可维护性和灵活性。例如:

vars:
  disk_device: /dev/sda
  partition_size: 2GiB
tasks:
- name: Create partition
  parted:
    device: "{{ disk_device }}"
    number: 1
    part_end: "{{ partition_size }}"
    state: present
  • 进行测试 :在正式执行Playbook之前,先在测试环境中进行测试,确保操作的正确性。
15. 总结

通过以上内容,我们学习了Ansible中的任务管理和存储管理。在任务管理方面,我们掌握了如何使用cron模块设置定时任务,使用reboot模块重启受管主机,以及如何定义和管理关键概念。在存储管理方面,我们了解了如何发现存储设备、收集相关事实、使用条件语句处理不同设备名称,以及如何使用各种存储管理模块进行分区、逻辑卷组和文件系统的管理。同时,我们还介绍了存储管理中的常见问题及解决方法,以及一些最佳实践。希望这些知识能帮助你更好地使用Ansible进行系统管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值