简介
在本实验中,你将学习如何创建和配置 Ansible 的 inventory 文件。Ansible 使用 inventory 文件来定义和管理它所控制的主机。你将探索 inventory 文件的基本结构,创建组,建立组层次结构,并为组分配变量。这些技能对于使用 Ansible 有效管理你的基础设施至关重要。
在本实验中,你将学习如何创建和配置 Ansible 的 inventory 文件。Ansible 使用 inventory 文件来定义和管理它所控制的主机。你将探索 inventory 文件的基本结构,创建组,建立组层次结构,并为组分配变量。这些技能对于使用 Ansible 有效管理你的基础设施至关重要。
实验环境已预先配置好对本地机器的 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 越多,就会越熟悉其强大的自动化功能。