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

Ansible剧本执行报错:无法解析为JSON/YAML语法问题求助

问题根因定位

这是典型的YAML语法错误,和Ansible是否支持在shell中传递变量无关,具体错误点有两个:

  1. 任务定义中name字段后缺失冒号:YAML语法要求键值对必须为键: 值格式,你写的- name Set /etc/motd to user value没有在name后加冒号,导致YAML解析器将整行识别为一个键,下一行的shell:被判定为该键值内部的非法映射,这才是触发报错的核心原因(报错箭头指向shell行只是解析到非法结构的位置,根因在上一行)。
  2. 潜在的转义风险:shell命令中直接插入变量如果不做转义,当变量包含引号、特殊符号时会导致shell执行异常,这也是报错提示中提到的模板变量需要引号包裹的原因。
修复方案

推荐优先使用Ansible原生模块代替shell操作,避免不必要的转义和权限问题,修复后的完整剧本如下:

---
- name: User MOTD Script
  hosts: localhost
  vars_prompt:
      - name: "defaultMOTD"
        prompt: "Do you want to set the MOTDs to the default? (y/n)"
        private: no

      - name: "MOTD"
        prompt: "Please input your MOTD for /etc/motd: "
        private: no
        when: defaultMOTD != "y"

      - name: "MOTDIssue"
        prompt: "Please input your MOTD for /etc/issue: "
        private: no
        when: defaultMOTD != "y"

      - name: "MOTDIssueNet"
        prompt: "Please input your MOTD for /etc/issue.net: "
        private: no
        when: defaultMOTD != "y"

  tasks:
  #Set custom MOTDs
  - name: Set /etc/motd to user value
    copy:
      content: "{{ MOTD }}"
      dest: /etc/motd
    when: defaultMOTD != "y"

  # 补充另外两个文件的配置逻辑,原剧本仅配置了/etc/motd
  - name: Set /etc/issue to user value
    copy:
      content: "{{ MOTDIssue }}"
      dest: /etc/issue
    when: defaultMOTD != "y"

  - name: Set /etc/issue.net to user value
    copy:
      content: "{{ MOTDIssueNet }}"
      dest: /etc/issue.net
    when: defaultMOTD != "y"

如果要保留原来的shell写法,只需要补全name后的冒号,并且给shell命令加引号即可:

- name: Set /etc/motd to user value
    shell: 'echo "{{ MOTD }}" > /etc/motd'
    when: defaultMOTD != "y"

内容的提问来源于stack exchange,提问作者Ruth Edges

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:36:06