You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:22:16