Ansible Playbook执行报错:hosts字段缺失与变量加载异常求助
Ansible Playbook 错误排查与解决
问题1:第一个Playbook执行报错 ERROR! the field 'hosts' is required but was not set
原Playbook中第一个条目:
- name: Configure System for Oracle 19 vars_prompt: - name: setup_test prompt: "Configure System for Test or Production? [Test/Prod]: " default: Test private: no vars_files: - /etc/ansible/roles/oracle_19_test/defaults/main.yml
这是一个不完整的Play——Ansible要求每个Play必须包含hosts字段,即使只是用来获取变量或执行本地操作,也需要指定目标主机(比如localhost)。
修复方案
将变量配置整合到一个完整的本地Play中(仅用于获取变量,不执行远程操作):
--- # 全局变量与提示,仅在本地执行,不收集主机信息 - hosts: localhost gather_facts: no vars_prompt: - name: setup_test prompt: "Configure System for Test or Production? [Test/Prod]: " default: Test private: no vars_files: - /etc/ansible/roles/oracle_19_test/defaults/main.yml # 配置Appserver的Play - hosts: "{{ Appserver_STBY }}" tasks: - name: tnsnames auf Appserver anpassen template: src: tnsnames_Appserver.ora.j2 dest: /opt/oracle/app/oracle/product/11.2.0/client_1/network/admin/tnsnames.ora owner: oracle group: oinstall mode: 0644 backup: yes # 配置Floorserver的Play - hosts: "{{ Floorserver }}" tasks: - name: tnsnames auf Floorserver anpassen template: src: /etc/ansible/roles/oracle_19_test/templates/tnsnames_Floor.ora.j2 dest: /u01/app/oracle/product/11.2.0/xe/network/admin/tnsnames.ora owner: oracle group: oinstall mode: 0644 backup: yes tags: floortest
问题2:自动加载group_vars/all时变量未定义 ERROR! The field 'hosts' has an invalid value, which includes an undefined variable. The error was: 'Floorserver' is undefined
错误原因
Ansible自动加载group_vars/all的前提是:
group_vars目录必须和你指定的inventory文件/目录处于同一级路径下- 执行Playbook时,要么工作目录是inventory所在目录,要么通过
-i参数明确指定inventory路径
如果Ansible找不到对应的group_vars目录,就无法加载其中的变量,导致Floorserver未定义。
修复方案
方案1:执行Playbook时指定正确的inventory路径
假设你的inventory文件是/etc/ansible/hosts,且group_vars目录在/etc/ansible/下,执行命令时:
ansible-playbook -i /etc/ansible/hosts your_playbook.yml
方案2:在ansible.cfg中配置默认inventory路径
编辑/etc/ansible/ansible.cfg,确保以下配置正确:
[defaults] inventory = /etc/ansible/hosts
这样执行Playbook时无需手动指定-i参数,Ansible会自动加载对应路径下的group_vars。
方案3:在Playbook中显式加载vars_files(已验证可行)
保持手动加载的方式,确保变量被正确导入:
- hosts: "{{ Floorserver }}" vars_files: - /etc/ansible/group_vars/all tasks: - name: tnsnames auf Floorserver anpassen template: src: /etc/ansible/roles/oracle_19_test/templates/tnsnames_floor.ora.j2 dest: /u01/app/oracle/product/11.2.0/xe/network/admin/tnsnames.ora owner: oracle group: oinstall mode: 0644 backup: yes tags: floortest
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

