详解Ansible事实变量:从收集到应用的全流程-LMLPHP

Ansible事实变量详解

在Ansible中,事实变量(facts)是由Ansible自动从受管主机收集的系统信息。这些事实变量包含了与主机相关的各类信息,并且可以在playbook中用于条件判断、循环等场景。了解如何收集、打印和使用这些事实变量对编写高效的Ansible playbook非常重要。以下内容详细介绍了Ansible事实变量的收集、打印、使用以及其在旧版和新版中的区别。

1. 收集Ansible事实变量

每次运行playbook中的每个play时,Ansible会自动运行一个名为setup的模块来收集受管主机的事实信息。这些信息包含如下内容:

  • 主机名称
  • 内核版本
  • 网络接口
  • IP地址
  • 操作系统版本
  • 各种环境变量
  • CPU数量
  • 提供的或可用的内存
  • 可用磁盘空间

例子:收集事实变量

在CentOS中,可以使用如下playbook收集并打印事实变量:

---
- name: 收集并打印事实变量
  hosts: web
  tasks:
    - name: 打印所有事实变量
      debug:
        var: ansible_facts

另一示例:

---
- name: 打印特定事实变量
  hosts: all
  tasks:
    - name: 显示主机名
      debug:
        msg: "主机名是:{{ ansible_facts.hostname }}"

2. 打印Ansible事实变量

可以通过playbook或ad-hoc命令来打印收集到的事实变量。

使用playbook打印事实变量

如下playbook展示了如何打印所有收集到的事实变量:

---
- name: 打印事实变量
  hosts: web
  tasks:
    - name: 打印facts
      debug:
        var: ansible_facts

使用ad-hoc命令打印事实变量

通过ad-hoc命令也可以打印出事实变量:

ansible web -m setup

执行上述命令后,会显示类似以下格式的输出:

{
  "ansible_facts": {
    "ansible_all_ipv4_addresses": [
      "192.168.122.1",
      "172.17.0.1",
      "172.16.227.140"
    ],
    "ansible_all_ipv6_addresses": [
      "fe80::240c:98ff:fe68:c45a",
      "fe80::42:8ff:feb7:fb6b"
    ],
    "ansible_architecture": "x86_64",
    "ansible_bios_date": "04/13/2018",
    "ansible_bios_version": "6.00",
    "ansible_cmdline": {
      "BOOT_IMAGE": "/vmlinuz-3.10.0-862.el7.x86_64"
    },
    ...
  }
}

3. 使用Ansible事实变量

在playbook中,可以通过双花括号{{ }}引用事实变量。例如,要引用默认IPv4地址,可以这样做:

---
- hosts: localhost
  tasks:
    - name: 打印默认IPv4地址
      debug:
        msg: "默认的IPv4地址是:{{ ansible_facts.default_ipv4.address }}"

4. 新旧版本的区别

在新版本的Ansible中,事实变量的引用方式有所变化。新版本中使用ansible_facts.<fact>的方式来引用变量,而旧版本则使用ansible_<fact>的方式。

新版本示例

{{ ansible_facts.ens34.ipv4.address }}

旧版本示例

{{ ansible_ens34.ipv4.address }}

5. 关闭和开启事实收集

在某些情况下,可能需要关闭事实收集以提高playbook的运行速度。可以在play中通过设置gather_facts: no来关闭事实收集:

---
- name: 关闭事实收集并手动运行setup模块
  hosts: localhost
  gather_facts: no
  tasks:
    - name: 手动运行setup模块
      setup:
        filter: ansible_ens34
      register: result
    - debug:
        var: result
07-23 02:28