Ansible Playbook语法错误求助:YAML加载失败及变量引用问题
Ansible Playbook语法错误求助:YAML加载失败及变量引用问题
看起来你的Ansible Playbook存在几个关键的YAML语法问题和结构问题,我来帮你逐一排查并修正:
问题分析
Playbook结构混乱
你写了两个顶级的- hosts条目,这不符合Ansible的Play规范——一个Play应该只有一个hosts定义,所有任务都要嵌套在这个Play的tasks列表下。你现在把debug、set_fact等任务直接放在顶级层级,会导致YAML解析器无法正确识别结构。YAML缩进错误
在set_fact模块下,oracle_sid这一行的缩进没有和oracle_home保持一致,没有正确嵌套在set_fact的参数里,这就是错误提示中“did not find expected key”的直接原因。Shell脚本与SQL语句问题
- 你的SQL语句结尾没有加分号,也没有加
/来触发执行,sqlplus可能不会返回查询结果; - Shell模块里的
$ORACLE_HOME在Ansible的Jinja2模板环境中,需要避免被提前解析,最好用单引号包裹Here文档内容。
- 你的SQL语句结尾没有加分号,也没有加
修正后的完整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
相关产品推荐
相关产品推荐

