Ansible剧本执行报错:无法解析为JSON/YAML语法问题求助
问题根因定位
这是典型的YAML语法错误,和Ansible是否支持在shell中传递变量无关,具体错误点有两个:
- 任务定义中
name字段后缺失冒号:YAML语法要求键值对必须为键: 值格式,你写的- name Set /etc/motd to user value没有在name后加冒号,导致YAML解析器将整行识别为一个键,下一行的shell:被判定为该键值内部的非法映射,这才是触发报错的核心原因(报错箭头指向shell行只是解析到非法结构的位置,根因在上一行)。 - 潜在的转义风险: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
相关产品推荐
相关产品推荐

