在本章中,我将为您介绍 Ansible 事实和魔法变量是什么,为什么需要它们,它们的不同类型,以及如何在日常工作中编辑和使用它们。
Ansible 事实
- 事实与远程主机相关 与远程系统相关的变量称为事实。通过事实,您可以将一个系统的行为或状态用作其他系统的配置。它们非常强大,因为您可以获得当前主机的全面视图,包括操作系统、发行版、IP 地址、网络配置、存储配置等。
列出主机的所有事实(即时命令)
$ ansible -m setup hostname
执行结果示例:
{
"ansible_all_ipv4_addresses": ["REDACTED IP ADDRESS"],
"ansible_all_ipv6_addresses": ["REDACTED IPV6 ADDRESS"],
"ansible_apparmor": {"status": "disabled"},
"ansible_architecture": "x86_64",
"ansible_bios_date": "11/28/2013",
"ansible_bios_version": "4.1.5",
"ansible_cmdline": {
"BOOT_IMAGE": "/boot/vmlinuz-3.10.0-862.14.4.el7.x86_64",
"console": "ttyS0,115200",
"no_timer_check": true,
"nofb": true,
"nomodeset": true,
"ro": true,
"root": "LABEL=cloudimg-rootfs",
"vga": "normal"
},
"ansible_date_time": {
"date": "2018-10-25",
"day": "25",
"epoch": "1540469324",
"hour": "12",
"iso8601": "2018-10-25T12:08:44Z",
"minute": "08",
"month": "10",
"second": "44",
"time": "12:08:44",
"tz": "UTC",
"tz_offset": "+0000",
"weekday": "Thursday",
"weekday_number": "4",
"weeknumber": "43",
"year": "2018"
},
"ansible_default_ipv4": {
"address": "REDACTED",
"alias": "eth0",
[...]
}
通过简单的即时命令列出 Ansible 事实,您会惊讶于从主机中获取的信息量。例如,当前硬件配置:架构、处理器、内存、可用内存、存储配置等,以及软件配置:操作系统、发行版、IP 地址、网络配置等。
列出主机的所有事实(Playbook)
文件名:facts_printall.yml
---
- name: facts_printall
hosts: all
tasks:
- name: Print all facts
ansible.builtin.debug:
var: ansible_facts
您也可以通过 Ansible Playbook 访问相同的数据。在此示例中,您将列出清单中所有主机的所有 Ansible 事实,结果与之前的即时命令执行相同。
执行示例
$ ansible-playbook -i inventory facts_printall.yml
执行结果示例:
{
"ansible_facts": {
"architecture": "x86_64",
"bios_date": "10/12/2020",
"bios_version": "N22ET66W (1.43 )",
"br_4332d8483447": {
"active": false,
"device": "br-4332d8483447",
"features": {
"esp_hw_offload": "off [fixed]",
"esp_tx_csum_hw_offload": "off [fixed]",
"fcoe_mtu": "off [fixed]",
[...]
这是 “facts_printall.yml” 的执行输出,针对 host1.example.com 节点执行。输出非常长,包含 Ansible 在 “Gathering Facts” 任务中自动获取的所有事实。我建议您运行此代码,熟悉 Ansible 事实。
引用单个事实
文件名:facts_printone.yml
---
- name: facts_printone
hosts: all
tasks:
- name: Print a fact
ansible.builtin.debug:
msg: "Architecture: {{ ansible_facts['ansible_architecture'] }}"
您可以通过指定事实名称轻松与事实交互。在此示例中,我们列出所有受管节点的架构。您可以根据需要自定义代码,以引用更适合您的需求的 Ansible 事实。
魔法变量
- 魔法变量与 Ansible 相关 与远程系统相关的变量称为事实,而与 Ansible 相关的变量称为魔法变量。您可以使用魔法变量来获取系统的状态或行为,并将其用作其他系统的配置。
常见的魔法变量
hostvars:访问 Play 中任何主机的变量。当您需要从另一个主机访问某个主机的属性时非常有用。可以与 Ansible 事实结合使用,以访问其他主机的属性。groups:列出清单中的所有组。可以与hostvars结合使用,以列出某个组中所有主机的 IP 地址。group_names:当前主机所属的组列表。inventory_hostname:清单中配置的主机名称。ansible_version:Ansible 的版本信息。
总结
Ansible 事实和魔法变量在您的 Ansible Playbook 中非常有用,尤其是在需要对清单中的所有主机执行某些操作时。例如,您可以生成一个自定义的 /etc/hosts 文件,适用于清单中涉及的所有主机。您可以使用循环或其他语句(您将在后续课程中探索)来实现这一点。