在本章中,我将为您介绍 Ansible 事实和魔法变量是什么,为什么需要它们,它们的不同类型,以及如何在日常工作中编辑和使用它们。

Ansible 事实

  1. 事实与远程主机相关 与远程系统相关的变量称为事实。通过事实,您可以将一个系统的行为或状态用作其他系统的配置。它们非常强大,因为您可以获得当前主机的全面视图,包括操作系统、发行版、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 事实。

魔法变量

  1. 魔法变量与 Ansible 相关 与远程系统相关的变量称为事实,而与 Ansible 相关的变量称为魔法变量。您可以使用魔法变量来获取系统的状态或行为,并将其用作其他系统的配置。

常见的魔法变量

  • hostvars:访问 Play 中任何主机的变量。当您需要从另一个主机访问某个主机的属性时非常有用。可以与 Ansible 事实结合使用,以访问其他主机的属性。
  • groups:列出清单中的所有组。可以与 hostvars 结合使用,以列出某个组中所有主机的 IP 地址。
  • group_names:当前主机所属的组列表。
  • inventory_hostname:清单中配置的主机名称。
  • ansible_version:Ansible 的版本信息。

总结

Ansible 事实和魔法变量在您的 Ansible Playbook 中非常有用,尤其是在需要对清单中的所有主机执行某些操作时。例如,您可以生成一个自定义的 /etc/hosts 文件,适用于清单中涉及的所有主机。您可以使用循环或其他语句(您将在后续课程中探索)来实现这一点。