问题描述
在使用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
错误原因
gather_facts禁用:gather_facts设置为false时,Ansible不会收集目标主机的事实,因此无法访问ansible_hostname等内部变量。- 变量未定义:如果变量未在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
总结
- 启用
gather_facts:确保gather_facts设置为true,以便Ansible可以收集目标主机的事实。 - 检查变量定义:如果使用自定义变量,请确保变量已在Playbook、主机变量文件或组变量文件中正确定义。
- 验证变量拼写:确保变量名称拼写正确,尤其是内部变量(如
ansible_hostname)。
通过以上步骤,您可以快速解决“VARIABLE IS NOT DEFINED!”错误,并确保Playbook顺利执行。