撇开语法错误不谈,一个正确的YAML文件是否足以作为一个正确的ansible playbook?

撇开语法错误不谈,一个正确的YAML文件是否足以作为一个正确的ansible playbook?,ansible,yaml,ansible-playbook,Ansible,Yaml,Ansible Playbook,我有一本ansible的剧本,它提出了一个错误(和往常一样,带有一条可怕的信息): 该文件由三个在线检查程序验证,因此没有YAML错误这一事实足以使文件成为正确的ansible剧本吗? 我试图理解的是,一个正确的YAML文件是否只会给我留下ansible语法错误(例如,一个不存在的模块),或者剧本是YAML的一个扩展(从某种意义上说,像-name:blah blah blah这样的行从YAML的角度来看是可以的,但是ansible会拒绝它,因为(我正在编一个例子)它不止两个字 换句话说,我正在检

我有一本ansible的剧本,它提出了一个错误(和往常一样,带有一条可怕的信息):

该文件由三个在线检查程序验证,因此没有YAML错误这一事实足以使文件成为正确的ansible剧本吗?

我试图理解的是,一个正确的YAML文件是否只会给我留下ansible语法错误(例如,一个不存在的模块),或者剧本是YAML的一个扩展(从某种意义上说,像
-name:blah blah blah
这样的行从YAML的角度来看是可以的,但是ansible会拒绝它,因为(我正在编一个例子)它不止两个字

换句话说,我正在检查以下内容是否为真:YAML语法正常,ansible关键字正常,但ansible由于存在一些限制而不完全符合YAML语法

编辑:康斯坦丁在回答中发现了一个错误。
我将保留这个问题,因为它帮助我理解ansible不会对YAML文件本身施加约束,所以当出现错误并且验证失败时,我确实会留下特定的ansible语法错误(或者逻辑错误,就像我的例子一样).

不,有效的YAML不一定会提供有效的Ansible剧本

错误消息是
作用中的意外参数类型

所以Ansible无法解释你想要什么。特别是:

  lineinfile:
    - create: yes
    - dest: /etc/rsyslog.d/expose-42000.conf
    - line: "*.* @127.0.0.1:42000"
create
dest
line
lineinfle
操作的参数,但是您尝试将一个包含三个dict的列表输入lineinfle,因为您在每个参数前面都加了一个破折号。从YAML语法角度来看,这是正确的,但Ansible无法解析它,因为您不应该将列表输入行动


若要更正错误,请删除这些参数前的破折号。

鉴于Ansible不正常且Ansible使用YAML语法,您最后的问题没有意义。您能澄清一下吗?@MattSchuchard:我很高兴Konstantin证明我有错误,这将有助于我继续下去——我的一般观点是,由于错误message或多或少地随机指向一个“预期参数类型”,我想知道我是否只剩下语法错误(我确实有),或者我是否还应该考虑ansible在YAML文件本身设置了特定的限制。答案似乎是“否”,因此如果YAML验证通过,我必须查找语法(或者像在我的例子中-更像是逻辑)错误。非常感谢您找到了错误。至于一般问题,我的理解是ansible不会对YAML文件本身施加约束,因此当出现错误并且验证失败时,尽管我真的留下了特定的ansible语法错误(或者逻辑错误,像在我的例子中)是的,您是对的:如果YAML语法是正确的,您应该仔细搜索逻辑错误。
# prepare environment
# configure rsyslog
- name: configure rsyslog to expose events on port 42000
  lineinfile:
    - create: yes
    - dest: /etc/rsyslog.d/expose-42000.conf
    - line: "*.* @127.0.0.1:42000"
  notify:
    - restart rsyslog
  lineinfile:
    - create: yes
    - dest: /etc/rsyslog.d/expose-42000.conf
    - line: "*.* @127.0.0.1:42000"