Ansible 组 Inventory

AnsibleAnsibleBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何创建和配置 Ansible 的 inventory 文件。Ansible 使用 inventory 文件来定义和管理它所控制的主机。你将探索 inventory 文件的基本结构,创建组,建立组层次结构,并为组分配变量。这些技能对于使用 Ansible 有效管理你的基础设施至关重要。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/VersionControlandTextEditorsGroup(["Version Control and Text Editors"]) ansible(("Ansible")) -.-> ansible/AnsibleSetupandConfigurationGroup(["Ansible Setup and Configuration"]) ansible(("Ansible")) -.-> ansible/ModuleOperationsGroup(["Module Operations"]) ansible(("Ansible")) -.-> ansible/InventoryManagementGroup(["Inventory Management"]) linux(("Linux")) -.-> linux/RemoteAccessandNetworkingGroup(["Remote Access and Networking"]) ansible/AnsibleSetupandConfigurationGroup -.-> ansible/install("Ansible Setup") ansible/ModuleOperationsGroup -.-> ansible/ping("Network Test") ansible/InventoryManagementGroup -.-> ansible/groups_inventory("Define Inventory Groups") linux/RemoteAccessandNetworkingGroup -.-> linux/ssh("Secure Connecting") linux/VersionControlandTextEditorsGroup -.-> linux/vim("Text Editing") linux/VersionControlandTextEditorsGroup -.-> linux/nano("Simple Text Editing") subgraph Lab Skills ansible/install -.-> lab-290160{{"Ansible 组 Inventory"}} ansible/ping -.-> lab-290160{{"Ansible 组 Inventory"}} ansible/groups_inventory -.-> lab-290160{{"Ansible 组 Inventory"}} linux/ssh -.-> lab-290160{{"Ansible 组 Inventory"}} linux/vim -.-> lab-290160{{"Ansible 组 Inventory"}} linux/nano -.-> lab-290160{{"Ansible 组 Inventory"}} end

创建基础 Inventory

实验环境已预先配置好对本地机器的 SSH 访问权限。你可以将 localhost 作为本实验中所有 Ansible 操作的目标主机。

Ansible 的 inventory 文件定义了 playbook 中命令、模块和任务所操作的主机和主机组。让我们创建一个基础的 inventory 文件。

/home/labex/project 目录下创建一个名为 inventory 的新文件:

nano /home/labex/project/inventory

将以下内容添加到文件中:

localhost ansible_connection=local

让我们分解一下这段内容:

  • localhost:这是主机的名称。在本例中,它指的是本地机器。
  • ansible_connection=local:这是一个 Ansible 变量,告诉 Ansible 通过本地连接而不是 SSH 连接到该主机。这对于管理本地机器非常有用。

保存文件并退出编辑器(在 nano 中,按 Ctrl+X,然后按 Y,再按 Enter)。

现在,让我们使用 Ansible 的 ping 模块测试我们的 inventory。ping 模块实际上并不使用 ICMP ping 协议,而是验证 Ansible 是否可以连接到主机并执行 Python 代码。

运行以下命令:

ansible -i inventory -m ping all

让我们分解一下这个命令:

  • -i inventory:指定要使用的 inventory 文件。
  • -m ping:告诉 Ansible 使用 ping 模块。
  • all:目标是 inventory 中的所有主机。

你应该会看到表示连接成功的输出:

localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

如果你看到此输出,则表示 Ansible 成功连接到 localhost 并执行了 ping 模块。

主机分组

Ansible 允许你将主机组织成组。这对于同时应用配置或在多个主机上运行任务非常有用。让我们修改我们的 inventory 文件以包含一个组。

编辑 inventory 文件:

nano /home/labex/project/inventory

将内容更新为:

[webservers]
localhost ansible_connection=local

这定义了一个名为 webservers 的组,其中包含我们的 localhost。在 Ansible 中,组名用方括号 [] 定义。列在组名下的任何主机都属于该组。

保存并退出编辑器。

现在,让我们使用 ping 模块测试我们的组:

ansible -i inventory -m ping webservers

这个命令与之前的命令类似,但这次我们不是使用 all,而是针对 webservers 组。

你应该会看到与之前相同的成功输出,但现在我们明确地针对 webservers 组。虽然只有一个主机时这看起来可能没有必要,但随着你的 inventory 文件增长,分组对于针对特定主机集将变得越来越有用。

创建组层次结构

Ansible 支持嵌套组,允许你创建层次结构。这对于根据主机的角色或环境来组织主机非常有用。让我们添加另一个组并创建一个层次结构。

编辑 inventory 文件:

nano /home/labex/project/inventory

将内容更新为:

[webservers]
localhost ansible_connection=local

[production:children]
webservers

这将创建一个名为 production 的新组,其中包含 webservers 组中的所有主机。:children 后缀告诉 Ansible 这个组是一个组的集合,而不是主机的集合。

以下是这个层次结构的含义:

  • webservers 组中的任何主机也隐式地属于 production 组。
  • 你可以通过针对 production 组来对所有生产环境主机应用配置。
  • 如果需要,你仍然可以仅针对 webservers 组。

保存并退出编辑器。

测试新的组层次结构:

ansible -i inventory -m ping production

此命令应 ping production 组中的所有主机,其中包括 webservers 组中的所有主机。在我们的例子中,仍然只有 localhost,但在实际场景中,这种结构可以实现强大而灵活的主机管理。

为组分配变量

Ansible 允许你在 inventory 文件中为组分配变量。这些变量可以在 playbook 和模板中使用,从而使你的 Ansible 代码更加灵活和可重用。

编辑 inventory 文件:

nano /home/labex/project/inventory

将内容更新为:

[webservers]
localhost ansible_connection=local

[production:children]
webservers

[webservers:vars]
http_port=80

这将为 webservers 组中的所有主机分配变量 http_port,其值为 80。:vars 后缀用于为组定义变量。

保存并退出编辑器。

现在,让我们创建一个简单的 playbook 来显示此变量。Playbook 是一个 YAML 文件,定义了要在主机上执行的一组任务。创建一个名为 show_http_port.yml 的新文件:

nano /home/labex/project/show_http_port.yml

添加以下内容:

---
- name: Show HTTP Port
  hosts: webservers
  tasks:
    - name: Display HTTP Port
      debug:
        msg: "The HTTP port is {{ http_port }}"

这个 playbook:

  • 针对 webservers
  • 包含一个使用 debug 模块显示消息的任务
  • 使用 {{ http_port }} 语法引用我们在 inventory 中定义的变量

保存并退出编辑器。

运行 playbook:

ansible-playbook -i inventory show_http_port.yml

你应该会看到显示 HTTP 端口值的输出:

PLAY [Show HTTP Port] ********************************************************

TASK [Gathering Facts] ********************************************************
ok: [localhost]

TASK [Display HTTP Port] ******************************************************
ok: [localhost] => {
    "msg": "The HTTP port is 80"
}

PLAY RECAP ********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

这表明我们在 inventory 中定义的变量可以在 playbook 中访问。

总结

在本实验中,你学习了 Ansible inventory 管理的基础知识。你创建了一个基础的 inventory 文件,并学习了如何使用 Ansible 的 ping 模块来验证连接性。你探索了如何对主机进行分组并创建组层次结构,这对于组织和管理更大的基础设施至关重要。最后,你学习了如何为组分配变量并在简单的 playbook 中使用它们。

这些技能构成了使用 Ansible 的基础,并且在你处理更复杂的自动化任务时将非常宝贵。请记住,有效的 inventory 管理是可扩展和可维护的 Ansible 项目的关键。随着你继续学习 Ansible,可以考虑探索更高级的 inventory 功能,例如动态 inventory 和 inventory 插件。

实践是掌握这些概念的关键。尝试创建更复杂的 inventory,实验不同的组结构,并在更高级的 playbook 中使用变量。你使用 Ansible 越多,就会越熟悉其强大的自动化功能。