正确的 YAML 文件是否足以用于正确的 ansible playbook,除了语法错误?

Is a correct YAML file enough for a correct ansible playbook, syntax errors aside?

我有一个 ansible 剧本,它引发了一个错误(像往常一样带有可怕的消息):

ERROR! unexpected parameter type in action: <class 'ansible.parsing.yaml.objects.AnsibleSequence'>

The error appears to have been in '/root/myplaybook.yml': line 17, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

# configure rsyslog
- name: configure rsyslog to expose events on port 42000
  ^ here

有问题的行是我在本手册和其他手册中的其他行的典型行:

# 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

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

我想了解的是,一个正确的 YAML 文件是否只给我留下了明显的语法错误(例如一个不存在的模块),或者是一个 playbook 是 YAML 的扩展(从某种意义上说,一行- name: blah blah blah从 YAMl 的角度来看是可以的,但会被 ansible 拒绝,因为(我正在编一个例子)它有两个以上的词。

换句话说,我正在检查以下内容是否为真:YAML 语法没问题,ansible 关键字没问题,但 ansible 不完全符合 YAML 语法,因为有一些限制。

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

不,有效的 YAML 不一定会给你一个有效的 Ansible 剧本。

错误信息是unexpected parameter type in action
所以 Ansible 无法解释你想要什么。具体来说:

  lineinfile:
    - create: yes
    - dest: /etc/rsyslog.d/expose-42000.conf
    - line: "*.* @127.0.0.1:42000"

createdestlinelineinfile 操作的参数,但您尝试提供一个 list三个 dictslineinfile 中,因为您在每个参数前加上了破折号。从 YAML 语法的角度来看这是正确的,但 Ansible 无法解析它,因为您不应该将列表提供给操作。

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