问题描述

在使用Ansible时,可能会遇到“VARIABLE IS NOT DEFINED!”错误,尤其是在尝试访问内部变量(如ansible_hostname)时。这种错误通常是因为Ansible没有收集目标主机的事实(facts),或者变量未被正确定义。本文将介绍如何复现、排查和修复该错误。

错误复现

以下是一个Ansible Playbook示例,用于复现“VARIABLE IS NOT DEFINED!”错误:

文件:variablenotdefined_error.yml

---
- name: hostname demo
  hosts: all
  gather_facts: false  # 禁用了事实收集
  tasks:
    - name: print hostname
      ansible.builtin.debug:
        var: ansible_hostname

错误执行

运行Playbook时,可能会出现以下错误:

$ ansible-playbook -i inventory troubleshooting/variablenotdefined_error.yml
PLAY [hostname demo] **************************************************

TASK [print hostname] **************************************************
ok: [demo.example.com] => {
    "ansible_hostname": "VARIABLE IS NOT DEFINED!"
}

PLAY RECAP ***************************************************************
demo.example.com           : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

错误原因

  1. gather_facts禁用:gather_facts设置为false时,Ansible不会收集目标主机的事实,因此无法访问ansible_hostname等内部变量。
  2. 变量未定义:如果变量未在Playbook或主机变量文件中定义,也会导致此错误。

解决方案

启用gather_facts,以便Ansible可以收集目标主机的事实。修改Playbook如下:

文件:variablenotdefined_fix.yml

---
- name: hostname demo
  hosts: all
  gather_facts: true  # 启用事实收集
  tasks:
    - name: print hostname
      ansible.builtin.debug:
        var: ansible_hostname

修复执行

运行修复后的Playbook:

$ ansible-playbook -i inventory troubleshooting/variablenotdefined_fix.yml
PLAY [hostname demo] **************************************************

TASK [Gathering Facts] *************************************************
ok: [demo.example.com]

TASK [print hostname] **************************************************
ok: [demo.example.com] => {
    "ansible_hostname": "demo"
}

PLAY RECAP ***************************************************************
demo.example.com           : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

总结

  1. 启用gather_facts:确保gather_facts设置为true,以便Ansible可以收集目标主机的事实。
  2. 检查变量定义:如果使用自定义变量,请确保变量已在Playbook、主机变量文件或组变量文件中正确定义。
  3. 验证变量拼写:确保变量名称拼写正确,尤其是内部变量(如ansible_hostname)。

通过以上步骤,您可以快速解决“VARIABLE IS NOT DEFINED!”错误,并确保Playbook顺利执行。