我有一个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语法错误(或者逻辑上,如同在我的情况下)。
答案 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"
create
,dest
和line
是lineinfile
操作的参数,但您尝试提供三个 dicts的列表 进入 lineinfile ,因为你在每个参数前加上一个破折号。从YAML语法的角度来看,这是正确的,但Ansible无法解析它,因为您不应该将列表提供给操作。
要纠正错误,请在这些参数之前删除破折号。