使用基本模式和通配符模式选择主机
在本步骤中,你将学习 Ansible 自动化中定位特定主机的基础知识。其核心是 Ansible inventory 文件,它列出了你管理的服务器,以及 Playbook 中的 hosts
指令,该指令指定一组任务应在哪些服务器上运行。我们将从安装 Ansible、创建基本的 inventory 和 Playbook 开始,然后探索如何使用组名和通配符模式选择主机。
首先,让我们确保你的环境中已安装 Ansible。Ansible 默认未安装,因此你需要使用 DNF 包管理器进行安装。ansible-core
包提供了 Ansible 的核心命令行工具,包括 ansible-playbook
。运行以下命令:
sudo dnf install -y ansible-core
你应该会看到类似以下的输出:
...
Installed:
ansible-core-2.16.x-x.el9.x86_64
...
Complete!
接下来,让我们为本次练习创建一个专用目录,以保持文件整洁。本步骤中所有后续操作都将在该新目录中进行:
mkdir -p ~/project/ansible_patterns
cd ~/project/ansible_patterns
现在,创建一个 inventory 文件。Inventory 是一个文本文件,用于定义 Ansible 命令、模块和任务在其上运行的主机和主机组。我们将使用 INI 格式,因为它更简单。
使用 nano
编辑器创建一个名为 inventory
的文件:
nano inventory
向 inventory
文件添加以下内容。这定义了两个组:webservers
和 dbservers
,每个组包含两个主机:
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.lab.net
db2.lab.net
保存文件并退出 nano
,按 Ctrl+X
,然后按 Y
,最后按 Enter
。
Inventory 已准备就绪,现在让我们创建一个简单的 Playbook。此 Playbook 将使用 ansible.builtin.debug
模块打印一条消息,确认任务正在哪个主机上运行。这是测试主机模式而无需对系统进行任何实际更改的好方法。
创建一个名为 playbook.yml
的新文件:
nano playbook.yml
添加以下 YAML 内容。最初,它将目标设置为 webservers
组中的所有主机:
---
- name: Test Host Patterns
hosts: webservers
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
保存并退出编辑器。现在,使用 ansible-playbook
运行 Playbook。-i
标志用于指定我们的自定义 inventory 文件:
ansible-playbook playbook.yml -i inventory
输出应如下所示:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
PLAY RECAP *********************************************************************
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
如你所见,只有 webservers
组中的主机被定位。现在,让我们修改 Playbook 以使用通配符 (*
)。通配符允许更灵活的模式匹配。
编辑 playbook.yml
并将 hosts
行更改为 hosts: "*.lab.net"
。请记住将包含通配符的模式用引号括起来:
---
- name: Test Host Patterns
hosts: "*.lab.net"
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
再次运行 Playbook:
ansible-playbook playbook.yml -i inventory
你应该会看到类似以下的输出:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
这次,Play 只在以 .lab.net
结尾的主机上运行。最后,让我们使用特殊关键字 all
来定位 inventory 中定义的所有主机。
最后一次编辑 playbook.yml
并将 hosts
行更改为 hosts: all
:
---
- name: Test Host Patterns
hosts: all
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
运行 Playbook 以查看结果:
ansible-playbook playbook.yml -i inventory
输出将显示所有被定位的主机:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbook 现在将在你的 inventory 中的所有四个主机上运行,展示了 all
模式的强大功能。