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

时间:2016-11-28 13:40:53

标签: ansible yaml ansible-playbook

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

# 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

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

- name: blah blah blah

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

我想要了解的是,正确的YAML文件是否只留下了ansible语法错误(例如,一个不存在的模块),或者是一个playbook是YAML的扩展(在某种意义上,就像{{ 1}}从YAMl的角度来看是可以的,但是会被ansible拒绝,因为(我正在编写一个例子)它有两个以上的单词。

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

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

1 个答案:

答案 0 :(得分:9)

不,有效的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操作的参数,但您尝试提供三个 dicts的列表 进入 lineinfile ,因为你在每个参数前加上一个破折号。从YAML语法的角度来看,这是正确的,但Ansible无法解析它,因为您不应该将列表提供给操作。

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