如何使用 Ansible 模块执行系统管理任务 - 第 6 部分
在 Ansible 系列的第 6 部分中,我们在过去的主题中介绍了一些 Ansible 模块,现在我们将更深入地了解有助于执行许多系统管理任务的其他模块。
您将了解每个模块的基本概念,并了解可用于完成某些任务的选项。
在本页面:
- 在 Ansible 中管理软件包和存储库
- 使用 Ansible 管理服务
- 使用 Ansible 管理防火墙
- 使用 Ansible 归档文件或文件夹
- 使用 Ansible 安排任务
- 使用 Ansible 管理用户和组
- 使用 Ansible 创建文件和目录
- 使用 Ansible 管理存储
- 使用 Ansible 管理文件系统
1. 在 Ansible 中管理软件包和存储库
在 Linux 系统上安装软件包时,不同的发行版具有不同的软件包管理器。对于 RedHat 发行版,我们有 yum 和 dnf,而对于 Debian 风格,我们有 apt。
Ansible 附带一个名为 package 的模块,它消除了为不同系统使用不同包管理器的需要。它自动使用主机系统相应的包管理器,从而使工作更加轻松。
安装软件包
例如,要在包含 Debian 和 RedHat 发行版的一组主机中安装 htop,请使用 package 模块作为如下面的 install_htop.yml 剧本所示。
---
- name: Install htop on Ubuntu and CentOS
hosts: all
tasks:
- package:
name: htop
state: installed
注意:软件包名称可能因操作系统而异。例如,Redhat 发行版中有 httpd,Debian/Ubuntu 系统有 Apache2,所有这些都表示 Apache网络服务器。因此,传递这些包裹时应格外小心。通常,最好使用变量或条件语句。
2. 使用 Ansible 管理服务
接下来,我们有一个 service 模块,用于管理 Linux 系统上的服务。它用于启动、停止或重新启动服务。您还可以使用它来启用服务,以便系统启动时自动启动该服务。
启动并启用服务
例如,要在 RHEL 8 上启动并启用 Apache Web 服务器,请使用如图所示的服务。
---
- name: Start and enable httpd service
hosts: webservers
tasks:
- service:
name: httpd
state: started
enabled: yes
停止服务
要停止 httpd 服务,请传递 stopped 属性。
---
- name: Stop httpd service
hosts: webservers
tasks:
- service:
name: httpd
state: stopped
重启服务
要重新启动 httpd 服务,请传递 restarted 属性。
---
- name: Restart httpd service
hosts: webservers
tasks:
- service:
name: httpd
state: restarted
3. 使用 Ansible 管理防火墙
系统管理员承担的另一项重要任务是防火墙的管理。在 Ansible playbook 中,使用 firewalld 和 ufw 模块使这变得更加容易。您可以将防火墙配置为允许或阻止端口或服务甚至源地址。
让我们来看几个例子:
在firewalld中打开/阻止端口80
---
- name: Allow port 80
hosts: webservers
tasks:
-firewalld:
port: 80/tcp
permanent: yes
state: enabled
在上面的剧本中,允许端口 80 穿过防火墙。
选项permanent: yes
强制执行防火墙规则并使其在重新启动后保持不变。然而,该规则并不立即适用。仅在重新启动后才生效。要立即强制执行规则,请使用选项immediate: yes
。
要指定允许的地址,请使用 source:0.0.0.0/0 语句。
- firewalld:
source: 192.168.0.0/24
zone: public
state: enabled
要指定允许使用 port 选项的端口范围,如下所示:
- firewalld:
port: 213-567/udp
permanent: yes
state: enabled
要阻止端口,请将状态选项更改为禁用,如下所示:
-firewalld:
port: 80/tcp
permanent: yes
state: disabled
在firewalld中添加/阻止服务
除了添加/阻止端口之外,您还可以将相同的规则应用于服务。这很简单。只需使用服务模块并附加要添加的服务,并确保状态选项设置为启用。
- firewalld:
service: https
permanent: true
state: enabled
要阻止该服务,请将状态选项设置为禁用。
- firewalld:
service: https
permanent: true
state: disabled
4. 使用 Ansible 归档文件或文件夹
归档是指将文件或文件夹压缩为易于移植且体积较小的格式。 Ansible 附带了一个名为 archive 的模块。压缩文件非常简单。所需要做的就是指定文件的源路径和压缩文件的目标。
压缩目录
考虑下面的剧本compress.yml。
---
- hosts: webservers
tasks:
• name: Compress a folder
archive:
path: /opt/data/web
dest: /tmp/web.gz
上面的 playbook 压缩 /opt/data/web 目录并将其保存到 /tmp/web.gz。
使用格式压缩目录
默认压缩格式是 .gz
,但是,可以使用 format 属性来指定。尝试下一本剧本。
---
- hosts: webservers
Tasks:
- name: Create a zip archive
archive:
path: /opt/data/web
dest: /tmp/web
format: zip
上面的 playbook 将 /opt/data/web 目录压缩到 /tmp/web.zip。
解压缩文件
您还可以使用unarchive属性解压缩压缩文件。考虑下面的剧本。
---
- hosts: webservers
tasks:
- name:Uncompress /tmp/web.gz to/opt directory on Ansible controller
unarchive:
src: /tmp/web.bz2
dest: /opt/
上面的 playbook 将文件 /opt/data/web.gz 解压缩到 Ansible 控制器上的 /opt。
在远程节点上解压缩文件
要指定远程源系统,请使用 remote_src=yes
选项。
---
- hosts: webservers
tasks:
- name:Uncompress /tmp/web.bz2 to/opt on remote host
unarchive:
src: /tmp/web.bz2
dest: /opt/
remote_src=yes
上面的 playbook 将远程节点上的文件 /tmp/web.bz2 解压缩到 /opt/ 目录。
5. 使用 Ansible 安排任务
cron 模块有助于在 Ansible Playbooks 中安排作业。
创建计划任务
考虑下面的剧本。
---
- hosts: webservers
tasks:
- name: Create a scheduled task
cron:
name: Run employee attendance
job: sh /opt/scripts/attendace.sh
month: 4
day: 5
hour: 17
minute: 00
该剧本运行 4 月 5 日下午 5:00 的出勤脚本。
在特定日期安排脚本
如果您希望安排此脚本仅在 4 月 5 日是星期一时运行,请使用 weekday: 1 属性。根据 cron 表示法,0 表示星期日,6 表示星期六。
month: 4
day: 5
hour: 17
minute: 00
weekday: 1
这些字段中的任何一个星号 (*) 都表示任何值。
在某个日期运行作业
要在 4 月 5 日下午 5:00 运行作业(无论工作日是哪一天),请使用所示的时间参数。
month: 4
day: 5
hour: 17
minute: 00
weekday: *
在每月的特定日期执行作业
要在每月第 5 天下午 5:00 执行 cron 作业,请使用以下设置。
month: *
day: 5
hour: 17
minute: 00
weekday: *
每天执行一项工作
要每天下午 5:00 执行 cron 作业,请设置时间设置,如下所示:
month: *
day: *
hour: 17
minute: 00
weekday: *
每 5 小时执行一次作业
要每 5 小时执行一次 cron 作业,请使用步骤值 */5
,如图所示。
month: *
day: *
hour: */5
minute: *
weekday: *
6. 使用 Ansible 管理用户和组
您还可以轻松管理 Ansible playbook 中的用户和组。
创建新用户
要创建新用户,请使用用户模块,如图所示。
---
- hosts: webservers
tasks:
- name: Create a new user
user:
name: Jack
您还可以添加其他选项,例如 UID、组。
- name: Create a new user
user:
name: Jack
comment: Jack Peters
uid: 1002
group: administrators
shell: /bin/bash
删除用户
要删除用户,请使用 remove: yes
语句。
- name: Remove the user 'Jack'
user:
name: Jack
state: absent
remove: yes
创建一个新组
要创建新组,请使用组模块。
- name: Create a group
group:
name: developers
7. 使用 Ansible 创建文件和目录
要创建目录文件,请使用file模块。
创建一个新目录
例如,创建一个新目录。
---
- hosts: webservers
tasks:
- name: Create a new directory
file:
path: /opt/app
state: directory
您可以添加其他属性,例如所有者、组和文件权限。
- hosts: webservers
tasks:
- name: Create a new directory
file:
path: /opt/web
state: directory
owner: www-data
group: www-data
mode: 0644
此外,您可以使用 recurse: yes 语句递归地创建目录。
---
- hosts: webservers
tasks:
- name: Create directories recursively
file:
path: /opt/web/app
state: directory
owner: www-data
group: www-data
mode: 0644
recurse: yes
创建文件
要创建文件,请使用 state: touch
选项。
---
- hosts: webservers
tasks:
- name: Create a new file
file:
path: /opt/web/index.html
state: touch
owner: www-data
group: www-data
mode: 0644
8. 使用 Ansible 管理存储
lvg 模块用于配置 LVM 卷和组。
创建LVM卷组
考虑下面的剧本:
---
- hosts: webservers
tasks:
• name: Create lVM volume group
lvg:
vg: vg1
pvs: /dev/sda1
pesize: 32
这将在 /dev/sda1
分区之上创建一个物理范围大小为 32 MB 的卷组。
创建后,使用lvol模块创建逻辑卷,如图所示
创建逻辑卷
---
- hosts: webservers
tasks:
- name: Create lVM volume
lvol:
vg: vg1
lv: lvol1
pvs: /dev/sda1
9. 使用 Ansible 管理文件系统
要在块设备上创建文件系统,请使用文件系统模块。
创建文件系统
下面的 playbook 在块卷上创建 xfs 的文件系统类型。
---
- hosts: webservers
tasks:
- name: Create a filesystem
filesystem:
fstype: xfs
dev: /dev/vg1/lvol1
挂载文件系统
接下来,您可以使用 mount 模块继续安装块存储卷,如下面的 playbook 所示:
---
- hosts: webservers
tasks:
- name: Mount a filesystem
mount:
fstype: xfs
src: /dev/vg1/lvol1
path: /opt/web
state: mounted
结论
主题到此结束。我们已经介绍了可以通过 Ansible Playbook 中的特定内置模块完成的各种系统管理任务。