什么是 Ansible 模块

2024 年 9 月 19 日 | 阅读 10 分钟

引言

Ansible 是一个流行的开源自动化工具。它允许系统管理员和 DevOps 团队自动化各种 IT 任务,例如配置管理、应用程序部署和基础设施配置。Ansible 的一个关键特性是其丰富的模块集合,这些模块是执行特定任务的小型、独立的代码单元。在本文中,我们将探讨 Ansible 模块是什么以及它们如何工作,提供示例,讨论它们的优缺点,并强调它们的常见用例。

什么是 Ansible 模块?

在 Ansible 中,模块本质上是用 Python 或任何其他编程语言编写的插件。它用于定义系统的期望状态。这些模块可用于配置、管理和控制远程系统,并提供声明式语言来定义系统的期望状态。Ansible 模块可以执行广泛的任务,例如安装软件包、管理文件、操作配置文件、启动或停止服务、管理用户和组,以及与云平台进行交互等等。

Ansible 模块如何工作?

Ansible 模块由 Ansible 控制节点在远程系统上执行。当执行 Ansible playbook 或 ad-hoc 命令后,控制节点会将模块代码和任何必需的参数发送到目标主机。在这里,模块在单独的进程中执行。然后,模块执行指定的任务并将结果返回给控制节点。Ansible 模块遵循“幂等性”方法。这里的幂等性方法意味着它们可以安全地运行多次,而不会在系统已经处于期望状态的情况下更改系统状态。这使得 Ansible 模块在自动化任务中可靠且适用。

使用 Ansible 模块的示例

让我们以使用 "yum" 模块为例,该模块是 Ansible 中用于管理基于 Red Hat 的 Linux 系统的软件包的常用模块。以下 Ansible playbook 在远程系统上安装 "httpd" 软件包

代码

输出

What is the Ansible Module

说明

在上面的代码中,使用 debug 模块添加了一个名为“打印输出”的新任务。此任务将使用 ansible_facts 变量在 "webserver" 主机上打印已安装的 httpd 软件包的版本,该变量包含 Ansible 在执行期间收集的关于远程系统的 facts。var 参数指定要打印的变量。在这种情况下,参数是 whichansible_facts.packages['httpd'].version。

输出显示 httpd 软件包已成功安装在 "webserver" 主机上,这由 "changed" 状态指示。然后,“打印输出”任务使用 ansible_facts.packages['httpd'].version 变量显示已安装的 httpd 软件包的版本,在本例中为 "2.4.41-1ubuntu1.7"。

有用且常见的 Ansible 模块

在本节中,我们将了解 Ansible 中使用最多和最有用的模块。此列表中的模块是根据它们在 Ansible 社区中的受欢迎程度以及它们执行日常自动化任务的功能来选择的。

1. 包管理器模块 yum 和 apt

它用于调试 Debian/Ubuntu Linux 发行版的 apt 包。下面是更新存储库缓存并更新到最新版本的 Nginx 包的示例。

代码

输出

What is the Ansible Module

说明

在上面的代码中,我们通过将 <target_hosts> 替换为适当的主机或组来指定将执行任务的目标主机。Playbook 中有两种任务。

  • 第一个任务使用 update_cache: yes 参数更新存储库缓存,这确保包管理器拥有存储库的最新包信息。
  • 第二个任务使用 name: nginx 参数指定包名,并使用 state: latest 参数将 "nginx" 包更新到最新版本,以确保包已更新到可用的最新版本。

2. Service 模块

借助此模块,我们可以控制远程主机上的服务,并可以利用不同的 init 系统,具体取决于它们在系统上的可用性。它提供了一个很好的抽象层。

代码

输出

What is the Ansible Module

说明

在上面的代码中,我们通过将 <target_hosts> 替换为适当的主机或组来指定将执行任务的目标主机。这里我们在 playbook 下定义了一个任务。

  • 该任务使用 Ansible.builtin.service 模块重新启动 Docker 服务。这里我们使用 name 参数为 "docker" 来指定要重新启动的服务,并使用 state 参数为 "restarted" 来确保服务已重新启动。

3. File 模块

它用于处理文件、符号链接和目录的操作。

代码

输出

What is the Ansible Module

说明

在上面的代码中,我们使用目标主机,通过将 <target_hosts> 替换为适当的主机或组来执行任务。然后,我们在 playbook 下定义了一个任务

  • 这里程序使用 Ansible.builtin.file 模块。此模块用于创建目录 "/etc/test",如果它不存在的话。然后程序员指定 path 参数为 "/etc/test" 来指定要创建的目录,state 参数为 "directory" 来指示我们要创建目录,mode 参数为 '0750' 来将目录的权限设置为 0750 (rwxr-x---)。

4. Copy 模块

copy 模块用于将文件复制到远程机器。此外,此模块用于处理远程系统内的文件传输或移动。

代码

输出

What is the Ansible Module

说明

在上面的代码中,可以通过将 <target_hosts> 替换为适当的主机或组来执行目标主机。然后,我们在 playbook 下定义了一个任务

  • 程序使用 Ansible.builtin.copy 模块,该模块用于将文件从源目录 "/example_directory/test" 复制到目标目录 "/target_directory/test"。
  • 程序员还必须指定 owner 参数为 "joe" 来将目标文件的所有者设置为 "joe",group 参数为 "admins" 来将目标文件的组所有权设置为 "admins",mode 参数为 '0755' 来将文件的权限设置为 0755 (-rwxr-xr-x)。

5. Template 模块

此模块用于协助模板,这些模板以 jinja2 模板语言为目标主机。

代码

输出

What is the Ansible Module

说明

在上面的代码中,目标主机将通过将 <target_hosts> 替换为适当的主机或组来执行任务。然后,我们在 playbook 下定义了一个任务

  • 这里程序使用 Ansible.builtin.template 模块,该模块用于将 Nginx 配置文件从 Jinja2 模板文件 "templates/nginx.conf.j2" 复制并模板化到目标文件 "/etc/nginx/sites-available/default"。

6. Lineinfile 和 Blockinfile 模块

lineinfile 模块用于添加、替换或确保文件路径中存在特定行。当需要更新配置文件中的单行时,使用此模块非常常见。

lineinfile 模块的代码

输出

What is the Ansible Module

说明

在上面的代码中,目标主机将通过将 <target_hosts> 替换为适当的主机或组来执行任务。然后,我们在 playbook 下定义了一个任务

  • 这里我们使用 Ansible.builtin.lineinfile 模块,该模块用于向文件 "/tmp/example_file" 添加一行(如果它尚不存在)。我们指定 path 参数为文件的路径,line 参数为要添加的行,state 参数为 "present" 来指示我们要确保该行存在于文件中。

blockinfile 模块用于从文件中插入、更新或删除一行文本块。它与前面的模块具有相同的功能,但用于需要操作多行文本块的情况。

blockinfile 模块的代码

输出

What is the Ansible Module

说明

在上面的代码中,目标主机将通过将 <target_hosts> 替换为适当的主机或组来执行任务。然后,我们在 playbook 下定义了一个任务

  • 该任务使用 Ansible.builtin.blockinfile 模块向文件 "/etc/example_dictory/example.conf" 的末尾添加一个配置选项块(如果它尚不存在)。我们指定 path 参数为文件的路径,block 参数为要添加的选项块,insertafter 参数为 "EOF" 来指示我们要将块插入到文件末尾。

7. Cron 模块

此模块用于管理远程主机上的环境变量和 crontab 条目。

代码

输出

无输出

注意:此任务没有输出要打印,因为它仅配置一个 cron 作业以在指定时间运行脚本。执行任务后,将设置 cron 作业,并根据指定的计划运行脚本。要检查 cron 作业是否正在运行,可以使用 crontab -l 命令列出 crontab 文件中的所有计划作业。

说明

此任务将确保 cron 作业配置为每天午夜运行 db_backup_script.sh 脚本,并将输出重定向到 /var/log/db_backup_script.sh.log。

8. Wait_for 模块

此模块帮助我们提供一种停止执行 play 并等待条件的方法。它还有助于控制进程完成、文件可用、经过的时间、文件中存在的字符串、端口打开等。

代码

输出

无输出

注意:除非字符串在超时期间未找到而导致任务失败,否则没有输出要打印。如果文件中的字符串被找到,任务将成功完成,并且 playbook 将继续执行下一任务。

说明

此任务将等待直到在文件 /tmp/example_file 中找到字符串 "String exists, continue"。如果字符串在默认的 300 秒超时期间内未找到,任务将失败。一旦找到字符串,任务将成功完成,并且 playbook 将继续执行下一任务。

Ansible 模块的用例

Ansible 模块可用于广泛的用例。它们如下。

  • 配置管理:Ansible 模块可用于自动化配置管理任务,例如管理系统配置、操作配置文件和管理服务。
  • 基础设施配置:Ansible 模块可用于在各种云平台上自动化基础设施资源的配置,例如虚拟机、容器和云实例。
  • 安全加固:Ansible 模块可用于自动化安全加固任务,例如管理用户和组、配置防火墙和应用安全策略。

Ansible 模块的优点

使用 Ansible 模块有一些优点。它们如下。

  • 可重用性:Ansible 模块是可重用的代码片段。它们可以轻松地在不同的 playbook 或角色之间共享和重用,从而节省编写重复性任务的时间和精力。
  • 声明式语法:Ansible 模块使用声明式语法。它还允许用户定义系统的期望状态,而无需指定实现该状态的步骤。这使得 Ansible playbook 易于阅读、理解和维护。
  • 大型模块集合:Ansible 拥有大量的内置模块,涵盖了广泛的任务,使其成为各种 IT 运营的全面自动化工具。
  • 可扩展性:Ansible 允许用户创建自定义模块以满足其特定需求。这使得自动化工作流程中的代码具有灵活性和可定制性。
  • 幂等性:Ansible 模块被设计为幂等的。这里的幂等性意味着它们可以安全地运行多次,而不会在系统已经处于期望状态的情况下更改系统状态。这确保了可靠且一致的自动化任务。

Ansible 模块的缺点

使用 Ansible 模块也有一些缺点。它们如下。

  • 功能有限:虽然 Ansible 拥有大量的内置模块,但某些任务或操作可能未包含在可用模块中。在这种情况下,用户可能需要创建自定义模块,这需要额外的时间和精力。
  • 依赖于远程执行:Ansible 模块在远程系统上执行,这意味着目标主机需要安装和配置 Ansible。这可能需要额外的设置和维护工作,尤其是在大规模环境中。
  • 特定于语言:Ansible 模块是用各种编程语言编写的,例如 Python、Perl 和 Ruby。这意味着用户需要了解这些编程语言才能创建或修改模块,这对于某些用户来说可能是一个限制。
  • 学习曲线:Ansible 模块有其自身的语法和用法模式,这可能需要用户学习和理解每个模块的工作原理。对于 Ansible 或自动化方面的新用户来说,这可能是一个挑战。

下一主题Ansible Register