用于 Linux 系统自动化的 10 个 Ansible 模块
这些方便的模块可以自动执行许多日常任务,从而节省时间和麻烦,并且只需几个命令即可轻松实现。
Ansible 是适用于您的 IT 环境的完整自动化解决方案。您可以使用 Ansible 自动化 Linux 和 Windows 服务器配置、编排服务配置、部署云环境,甚至配置网络设备。
Ansible 模块抽象了系统上的操作,因此您无需担心实现细节。您只需描述所需的状态,Ansible 就会确保目标系统与其匹配。
此模块可用性是 Ansible 的主要优势之一,通常被称为“包含电池”的 Ansible。事实上,您可以找到用于大量任务的模块,虽然这很棒,但我经常听到初学者说他们不知道从哪里开始。
尽管您对模块的选择完全取决于您的要求以及您尝试使用 Ansible 实现自动化的内容,但以下是开始使用 Ansible 实现 Linux 系统自动化所需的十大模块。
1. 复制
复制模块允许您将文件从 Ansible 控制节点复制到目标主机。除了复制文件之外,它还允许您设置目标文件的所有权、权限和 SELinux 标签。以下是使用复制模块将“每日消息”配置文件复制到目标主机的示例:
- name: Ensure MOTD file is in place
copy:
src: files/motd
dest: /etc/motd
owner: root
group: root
mode: 0644
对于不太复杂的内容,您可以将内容直接复制到目标文件,而无需本地文件,如下所示:
- name: Ensure MOTD file is in place
copy:
content: "Welcome to this system."
dest: /etc/motd
owner: root
group: root
mode: 0644
该模块以幂等方式工作,这意味着只有在相同文件尚未具有相同内容和权限的情况下,它才会复制该文件。
复制模块是复制少量具有静态内容的文件的绝佳选择。如果您需要复制大量文件,请查看同步模块。要复制具有动态内容的文件,请查看接下来的 template
模块。
2. 模板
模板模块的工作方式与 copy
模块类似,但它在将内容复制到目标主机之前使用 Jinja2 模板语言动态处理内容。
例如,定义一个显示目标系统名称的“每日消息”模板,如下所示:
$ vi templates/motd.j2
Welcome to {{ inventory_hostname }}.
然后,使用 template
模块实例化该模板,如下所示:
- name: Ensure MOTD file is in place
template:
src: templates/motd.j2
dest: /etc/motd
owner: root
group: root
mode: 0644
在复制文件之前,Ansible 会处理模板并插入变量,将其替换为目标主机系统名称。例如,如果目标系统名称为rh8-vm03
,则结果文件为:
Welcome to rh8-vm03.
虽然 copy
模块还可以在使用 content
参数时插入变量,但 template
模块通过创建模板文件提供了额外的灵活性,使您能够定义更复杂的内容,包括 for 循环、if 条件等等。如需完整参考,请查看 Jinja2 文档。
该模块也是幂等的,如果目标系统上的内容已经与模板的内容匹配,则它不会复制文件。
3. 用户
用户模块允许您在目标系统中创建和管理 Linux 用户。该模块有许多不同的参数,但在最基本的形式中,您可以使用它来创建新用户。
例如,要创建 UID 2001 的用户 ricardo
、组 users
和 wheel
的一部分以及密码 mypassword
>,使用以下参数应用 user
模块:
- name: Ensure user ricardo exists
user:
name: ricardo
group: users
groups: wheel
uid: 2001
password: "{{ 'mypassword' | password_hash('sha512') }}"
state: present
请注意,该模块尝试实现幂等,但它不能保证其所有选项都是幂等的。例如,如果您再次执行前面的模块示例,它会将密码重置为定义的值,从而在每次执行时更改系统中的用户。要使此示例具有幂等性,请使用参数 update_password: on_create
,确保 Ansible 仅在创建用户时设置密码,而不是在后续运行时设置密码。
您还可以使用此模块通过设置参数state:absent
来删除用户。
user
模块有许多选项供您管理多个用户方面。请务必查看模块文档以获取更多信息。
4. 包装
软件包模块允许您使用操作系统标准软件包管理器从目标系统安装、更新或删除软件包。
例如,要在 Red Hat Linux 计算机上安装 Apache Web 服务器,请应用如下模块:
- name: Ensure Apache package is installed
package:
name: httpd
state: present
该模块与发行版无关,它通过使用底层包管理器来工作,例如用于基于 Red Hat 的发行版的 yum/dnf 和用于 Debian 的 apt 。因此,它只执行基本任务,例如安装和删除包。如果您需要对包管理器选项进行更多控制,请使用目标发行版的特定模块。
另外,请记住,即使模块本身适用于不同的发行版,每个发行版的包名称也可能不同。例如,在基于 Red Hat 的发行版中,Apache Web 服务器包名称是 httpd
,而在 Debian 中,它是 apache2
。确保你的剧本能够解决这个问题。
该模块是幂等的,如果当前系统状态与所需状态匹配,则该模块不会执行操作。
[ 提升您的自动化专业知识。获取 Ansible 清单:迁移到 Red Hat Ansible 自动化平台 2 的 5 个理由]
5、服务
使用服务模块使用所需的init系统来管理目标系统服务;例如,systemd。
在最基本的形式中,您所要做的就是提供服务名称和所需的状态。例如,要启动 sshd 服务,请使用如下模块:
- name: Ensure SSHD is started
service:
name: sshd
state: started
您还可以通过提供参数 enabled: yes
确保服务在目标系统启动时自动启动。
与package
模块一样,service
模块非常灵活,可以跨不同的发行版工作。如果需要对特定目标init系统进行微调,请使用相应的模块;例如,模块systemd
。
与您到目前为止看到的其他模块类似,service
模块也是幂等的。
6. 防火墙
使用firewalld模块通过支持它的系统(例如基于Red Hat的发行版)上的firewalld
守护进程来控制系统防火墙。
例如,要在端口 80 上打开 HTTP 服务,请像这样使用:
- name: Ensure port 80 (http) is open
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
您还可以使用 port
参数指定自定义端口而不是服务名称。在这种情况下,请确保也指定协议。例如,要打开 TCP 端口 3000,请使用以下命令:
- name: Ensure port 3000/TCP is open
firewalld:
port: 3000/tcp
state: enabled
permanent: yes
immediate: yes
您还可以使用此模块来控制其他 firewalld
方面,例如区域或复杂规则。请务必检查模块的文档以获取完整的选项列表。
7. 文件
文件模块允许您控制文件和目录的状态 - 设置权限、所有权和 SELinux 标签。
例如,使用file
模块创建一个由用户ricardo
拥有的目录/app
,并具有读、写和执行权限所有者和组用户
:
- name: Ensure directory /app exists
file:
path: /app
state: directory
owner: ricardo
group: users
mode: 0770
您还可以使用此模块通过使用参数recurse: yes
递归地设置目录上的文件属性,或者使用参数state:absent
删除文件和目录。
该模块的大多数参数均具有幂等性,但其中一些参数可能会使其每次都更改目标路径。查看文档以获取更多详细信息。
8. 行文件
lineinfile 模块允许您管理现有文件上的单行。更新现有文件的目标配置而不更改文件的其余部分或复制整个配置文件非常有用。
例如,向您的主机文件添加一个新条目,如下所示:
- name: Ensure host rh8-vm03 in hosts file
lineinfile:
path: /etc/hosts
line: 192.168.122.236 rh8-vm03
state: present
您还可以使用此模块来更改现有行,方法是应用参数 regexp 来查找要替换的现有行。例如,通过将 PermitRootLogin yes
行修改为 PermitRootLogin no
来更新 sshd_config
文件以阻止 root 登录:
- name: Ensure root cannot login via ssh
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PermitRootLogin'
line: PermitRootLogin no
state: present
注意:使用服务模块重新启动 SSHD 服务以启用此更改。
该模块也是幂等的,但是,在行修改的情况下,请确保正则表达式与原始状态和更新后的状态匹配,以避免不必要的更改。
9. 取消存档
使用 unarchive 模块提取存档文件的内容,例如 tar
或 zip
文件。默认情况下,它会在解压之前将存档文件从控制节点复制到目标计算机。通过提供参数remote_src: yes
更改此行为。
例如,使用以下语法提取已下载到目标主机的 .tar.gz
文件的内容:
- name: Extract contents of app.tar.gz
unarchive:
src: /tmp/app.tar.gz
dest: /app
remote_src: yes
某些归档技术需要目标系统上有可用的附加软件包;例如,使用 unzip
包来提取 .zip
文件。
根据所使用的存档格式,该模块可能会或可能不会幂等地工作。为了防止不必要的更改,您可以使用参数creates
来指定该模块在提取存档内容时将创建的文件或目录。如果该文件或目录已存在,则模块不会再次提取内容。
10.命令
命令模块是一种灵活的模块,允许您在目标系统上执行任意命令。使用此模块,只要有命令,您就可以在目标系统上执行几乎任何操作。
尽管 command
模块灵活且功能强大,但仍应谨慎使用。如果有其他合适的模块可用,请避免使用命令模块来执行任务。例如,您可以通过使用command
模块执行useradd
命令来创建用户,但您应该使用相反,用户模块,因为它从您那里抽象出许多细节,处理极端情况并确保配置仅在必要时更改。
对于没有可用模块或运行自定义脚本或程序的情况,command
模块仍然是一个很好的资源。例如,使用此模块运行目标计算机中已存在的脚本:
- name: Run the app installer
command: "/app/install.sh"
默认情况下,该模块不是幂等的,因为 Ansible 每次都会执行该命令。要使 command
模块幂等,您可以使用 when
条件仅在适当的条件存在时才执行命令,或者使用 creates
参数,类似地取消归档模块示例。
下一步是什么?
使用这些模块,您可以通过复制、模板化或修改配置文件、创建用户、安装软件包、启动系统服务、更新防火墙等来配置整个 Linux 系统。
如果您是 Ansible 新手,请务必查看有关如何创建 playbook 来组合这些模块以实现系统自动化的文档。其中一些任务需要以提升的权限运行才能工作。有关更多详细信息,请查看权限升级文档。
从 Ansible 2.10 开始,模块以集合的形式组织。此列表中的大多数模块都是 ansible.builtin
集合的一部分,并且默认情况下可在 Ansible 中使用,但其中一些模块是其他集合的一部分。有关集合的列表,请查看 Ansible 文档。