Helm-Charts(yaml):正则表达式损坏

Helm-Charts(yaml): Regex expression broken

我正在与 https://github.com/prometheus-community/helm-charts 合作,并且正在 运行 解决一些问题,一些正则表达式查询是我们基本 yaml 部署的一部分。我遇到的问题特别是普罗米修斯图表的节点导出器部分。我已经配置了这个:

   nodeExporter:
      extraArgs: {
        collector.filesystem.ignored-fs-types="^(devpts|devtmpfs|mqueue|proc|securityfs|binfmt_misc|debugfs|overlay|pstore|selinuxfs|tmpfs|hugetlbfs|nfsd|cgroup|configfs|rpc_pipefs|sysfs|autofs|rootfs)$",
        collector.filesystem.ignored-mount-points="^/etc/.+$",
        collector.netstat.fields="*",
        collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p|dm-)\d+$", # BROKEN
        collector.netclass.ignored-devices=^(?:tun|kube|veth|dummy|docker).+$,                      # BROKEN
        collector.nfs
       }
      tolerations:
        - operator: Exists

如上所述,带有正则表达式的这两行已损坏:

 collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p|dm-)\d+$", # BROKEN
 collector.netclass.ignored-devices=^(?:tun|kube|veth|dummy|docker).+$,                      # BROKEN

第一个中“nvme”之前的 | 字符和第二个中的 ?: 字符似乎有问题。我认为这与 regex/yaml 格式有关,但我不确定如何更正此问题。

使用 {,您正在开始 YAML 流映射。它通常包含以逗号分隔的键值对,但您也可以像本例中那样提供单个值,这将使它们成为具有 null 值的键。

在 YAML 中,一旦您输入流式集合,all special flow-indicators 就不能再用于普通标量。特殊流量指示器是 {}[],。普通标量是不带引号的文本值。

第一个破损值是非法的,因为它包含 []。根据规范,第二个损坏的值实际上是合法的,但相当多的 YAML 实现会阻塞它,因为 ? 也用作映射键的指示符。

您有多种选择:

  • 引用标量。因为 none 其中包含单引号,所以用单引号括起来就可以了。通常你也可以双引号,但是你需要转义所有双引号字符和其中的所有反斜杠,这不利于可读性。
   nodeExporter:
      extraArgs: {
        collector.filesystem.ignored-fs-types="^(devpts|devtmpfs|mqueue|proc|securityfs|binfmt_misc|debugfs|overlay|pstore|selinuxfs|tmpfs|hugetlbfs|nfsd|cgroup|configfs|rpc_pipefs|sysfs|autofs|rootfs)$",
        collector.filesystem.ignored-mount-points="^/etc/.+$",
        collector.netstat.fields="*",
        'collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p|dm-)\d+$"',
        'collector.netclass.ignored-devices=^(?:tun|kube|veth|dummy|docker).+$',
        collector.nfs
       }
      tolerations:
        - operator: Exists
  • 使用块标量。块标量通常是输入具有大量特殊字符的标量的最佳方式,因为它们通过缩进结束,因此可以包含任何特殊字符。块标量只能出现在其他块结构中,因此您需要制作 extraArgs 块映射:
   nodeExporter:
      extraArgs:
        ? collector.filesystem.ignored-fs-types="^(devpts|devtmpfs|mqueue|proc|securityfs|binfmt_misc|debugfs|overlay|pstore|selinuxfs|tmpfs|hugetlbfs|nfsd|cgroup|configfs|rpc_pipefs|sysfs|autofs|rootfs)$"
        ? collector.filesystem.ignored-mount-points="^/etc/.+$"
        ? collector.netstat.fields="*"
        ? |-
          collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p|dm-)\d+$"
        ? |-
          collector.netclass.ignored-devices=^(?:tun|kube|veth|dummy|docker).+$
        ? collector.nfs
      tolerations:
        - operator: Exists

如您所见,这现在使用前面提到的 ? 作为关键指标。 由于它是一个块序列,因此您不再需要逗号。 |- 开始一个文字块标量,从中剥离最后的换行符。