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

Ansible Playbook语法错误求助:YAML加载失败及变量引用问题

Ansible Playbook语法错误求助:YAML加载失败及变量引用问题

看起来你的Ansible Playbook存在几个关键的YAML语法问题和结构问题,我来帮你逐一排查并修正:

问题分析

  1. Playbook结构混乱
    你写了两个顶级的- hosts条目,这不符合Ansible的Play规范——一个Play应该只有一个hosts定义,所有任务都要嵌套在这个Play的tasks列表下。你现在把debug、set_fact等任务直接放在顶级层级,会导致YAML解析器无法正确识别结构。

  2. YAML缩进错误
    在set_fact模块下,oracle_sid这一行的缩进没有和oracle_home保持一致,没有正确嵌套在set_fact的参数里,这就是错误提示中“did not find expected key”的直接原因。

  3. Shell脚本与SQL语句问题

    • 你的SQL语句结尾没有加分号,也没有加/来触发执行,sqlplus可能不会返回查询结果;
    • Shell模块里的$ORACLE_HOME在Ansible的Jinja2模板环境中,需要避免被提前解析,最好用单引号包裹Here文档内容。

修正后的完整Playbook

- hosts: 192.168.56.10
  tasks:
    - debug:
        msg: "{{ oracle_home.stdout }}"

    - set_fact:
        oracle_home: "{{ oracle_home.stdout }}"
        oracle_sid: "{{ dbname }}"

    - name: List PDB of given CDB
      shell:
        cmd: |
          '$ORACLE_HOME'/bin/sqlplus / as sysdba <<'EOF'
          select instance_name, status from v$instance;
          /
          EOF
      environment:
        ORACLE_HOME: "{{ oracle_home }}"
        ORACLE_SID: "{{ oracle_sid }}"
      register: pdb

    - name: List PDB
      debug:
        msg: "{{ pdb.stdout_lines | replace('\t', '') }}"

额外说明

  • 我把所有任务都放到了tasks列表下,确保Play结构正确;
  • 修正了set_fact下的缩进问题,两个变量都正确嵌套在模块参数里;
  • 给SQL语句加上了分号和/,保证sqlplus能执行并返回结果;
  • Here文档使用了单引号包裹(<<'EOF'),避免Ansible解析其中的变量,让Shell环境自己处理$ORACLE_HOME;
  • 保留了你原本的变量引用和环境变量设置,确保逻辑不变。

备注:内容来源于stack exchange,提问作者Learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:53:11