是否正确的YAML文件足以获得正确的ansible playbook,语法错误除外?

WoJ*_*WoJ 6 yaml ansible ansible-playbook

我有一个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
Run Code Online (Sandbox Code Playgroud)

有问题的一行是我在本剧本和其他剧本中的其他专栏:

# 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
Run Code Online (Sandbox Code Playgroud)

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

我想要了解的是,正确的YAML文件是否只留下了ansible语法错误(例如,一个不存在的模块),或者是- name: blah blah blah一个Playbook是YAML的扩展(在某种意义上说,YAML的行是正常的)透视,但将被ansible拒绝,因为(我正在编写一个例子)它有两个以上的单词.

换句话说,我正在检查以下是否可以:YAML语法没问题,ansible关键字是正常的但是ansible通过一些限制完全不符合YAML语法.

编辑:康斯坦丁在他的回答中发现了一个错误.我将保留这个问题,因为它帮助我理解ansible没有对YAML文件本身施加约束,所以当出现错误并且验证时,我确实留下了特定的ansible语法错误(或者逻辑上,如同在我的情况下).

Kon*_*rov 11

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

错误消息是unexpected parameter type in action.
所以Ansible无法解释你想要的东西.特别:

  lineinfile:
    - create: yes
    - dest: /etc/rsyslog.d/expose-42000.conf
    - line: "*.* @127.0.0.1:42000"
Run Code Online (Sandbox Code Playgroud)

create,dest并且line是参数lineinfile的动作,但你尝试喂列表三种类型的字典lineinfile,因为你在前面加上一个破折号每个参数.从YAML语法的角度来看,这是正确的,但是Ansible无法解析它,因为您不应该将列表提供给操作.

要更正错误,请在这些参数之前删除破折号.