【问题标题】:Got an error message Syntax Error in ansible-playbook [duplicate]在 ansible-playbook 中收到错误消息语法错误 [重复]
【发布时间】:2019-01-20 07:21:57
【问题描述】:

错误!加载 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 中使用带有“”的 grep 进入 shell 模块,并收到如下错误消息“错误!加载 YAML 时出现语法错误。”

- name: Ensure IP forwarding is disabled
  shell: "sysctl net.ipv4.ip_forward ; grep "net\.ipv4\.ip_forward" /etc/sysctl.conf /etc/sysctl.d/*"
  register: CIS_3.1.1
  ignore_errors: True

【问题讨论】:

  • 嗨 Rick_y,欢迎来到 SO。我希望你能理解,就像任何编程语言一样,你需要对出现在双引号字符串中的双引号进行转义。如果您不想转义它们,则可以切换到在 shell 命令周围使用单引号:- shell: 'sysctl net ...grep "net\...'。另外,有一个 ansible module 用于手动完成您正在做的事情
  • 这不是重复的。在标量中转义双引号是不够的,

标签: ansible


【解决方案1】:

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

  • plain:无引号,对起始字符和内部字符序列有限制,无转义
  • 单引号:可以包含双引号,除了重复单引号外没有转义
  • 双引号:字符串中的反斜杠转义,字符串中的双引号需要转义
  • 字面量:保留换行符,没有转义
  • 折叠:换行符转换为空格,没有转义

您使用的是双引号样式,因为您需要转义内部双引号 (") 和反斜杠 (\)。这很快就会变得丑陋和难以理解。在这种情况下使用文字样式会更有用:

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

即你把|-(减号是去掉下一行的最后一个换行符),然后把没有开始或结束引号的行缩进放在下一行。

【讨论】:

    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    相关资源
    最近更新 更多