什么是 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 模块添加了一个名为“Print output”的新任务。此任务将使用 ansible_facts 变量在“webserver”主机上打印已安装的 httpd 软件包的版本,该变量包含 Ansible 在执行期间收集的关于远程系统的 facts。var 参数指定要打印的变量。在本例中,该参数是 whichansible_facts.packages['httpd'].version。

输出显示 httpd 软件包已在“webserver”主机上成功安装,如“changed”状态所示。然后,“Print output”任务使用 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 参数更新“nginx”包到最新版本,以指定包名,并使用 state: latest 参数确保包已更新到可用的最新版本。

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