在ansible playbook中获取错误消息语法错误

在ansible playbook中获取错误消息语法错误,ansible,Ansible,错误!加载YAML时出现语法错误。 未找到所需的密钥 错误似乎出现在“/etc/ansible/main.yml”中:第73行第50列,但可能是 根据确切的语法问题,在文件中的其他位置 令人不快的一行似乎是: - name: Ensure IP forwarding is disabled shell: "sysctl net.ipv4.ip_forward ; grep "net\.ipv4\.ip_forward" /etc/sysctl.conf /etc/sysctl.d/*"

错误!加载YAML时出现语法错误。 未找到所需的密钥

错误似乎出现在“/etc/ansible/main.yml”中:第73行第50列,但可能是 根据确切的语法问题,在文件中的其他位置

令人不快的一行似乎是:

- name: Ensure IP forwarding is disabled
  shell: "sysctl net.ipv4.ip_forward ; grep "net\.ipv4\.ip_forward" /etc/sysctl.conf /etc/sysctl.d/*"
                                             ^ here
我们可能错了,但这一个看起来可能是一个问题 不平衡的报价。如果以引号开始值,请确保 行以同一组引号结束。例如,这是任意的 例如:

我在ansible playbook的shell模块中使用了带“”的grep,得到了如下错误消息“ERROR!加载YAML时语法错误。”


ansible的配置文件采用YAML格式,在YAML中,表示字符串的标量可以采用多种格式:

  • 普通:没有引号,对起始字符和内部字符序列有限制,没有转义
  • 单引号:可以包含双引号,除重复单引号外没有转义符
  • 双引号:反斜杠在字符串中转义,在字符串中需要转义双引号
  • 文字:保留换行符,没有转义
  • 折叠:换行符转换为空格,无转义
您使用的是双引号样式,因此需要对内部双引号(
)和反斜杠(
\
)进行转义。这很快就会变得难看和不可读。在这种情况下,使用文字样式更有用:

- name: Ensure IP forwarding is disabled
  shell: |-
    sysctl net.ipv4.ip_forward ; grep "net\.ipv4\.ip_forward" /etc/sysctl.conf /etc/sysctl.d/*

也就是说,你把
|-
(减号是去掉下一行的最后一个换行符),然后把不带起始引号或结束引号的行,缩进到下一行。

ansible的配置文件是YAML格式的,在YAML中,表示字符串的标量可以是多种格式:

  • 普通:没有引号,对起始字符和内部字符序列有限制,没有转义
  • 单引号:可以包含双引号,除重复单引号外没有转义符
  • 双引号:反斜杠在字符串中转义,在字符串中需要转义双引号
  • 文字:保留换行符,没有转义
  • 折叠:换行符转换为空格,无转义
您使用的是双引号样式,因此需要转义内部双引号(
)和反斜杠(
\
)。这很快就会变得丑陋不堪。在这种情况下,使用文字样式更有用:

- name: Ensure IP forwarding is disabled
  shell: |-
    sysctl net.ipv4.ip_forward ; grep "net\.ipv4\.ip_forward" /etc/sysctl.conf /etc/sysctl.d/*

也就是说,你把
|-
(减号是去掉下一行的最后一个换行符),然后把不带起始引号或结束引号的行,缩进,放在下一行。

嗨,瑞克,欢迎来到SO。我希望您能够理解,就像任何编程语言一样,您需要对双引号字符串中出现的双引号进行转义。如果不想转义它们,那么可以切换到在shell命令周围使用单引号:
-shell:'sysctl net…grep“net\…”
。另外,有一种方法可以用来手工操作,这不是重复的。仅仅在标量中转义双引号是不够的,嗨,Rick_y,欢迎来到SO。我希望您能够理解,就像任何编程语言一样,您需要对双引号字符串中出现的双引号进行转义。如果您不想转义它们,那么您可以切换到在shell命令周围使用单引号:
-shell:'sysctl net…grep“net\…'
。另外,还有一个用于手动执行操作的方法这不是重复的。在标量中转义双引号是不够的,