在 YAML 中使用 enter 处理空格的更漂亮的方法

Posted

技术标签:

【中文标题】在 YAML 中使用 enter 处理空格的更漂亮的方法【英文标题】:A prettier way to handle spaces with enters in YAML 【发布时间】:2022-01-23 05:02:46 【问题描述】:

这更像是一个样式问题。我有这段丑陋的代码:

- name: download something
  shell: "wget https://www. my_var \
    a_string\
     a_very_long_string_to_show_what_i_mean "

在我看来,这看起来很丑陋。由于 URL 必须是一个“整体”,没有空格和引号等,我需要使用 \ 转义每个换行符。呸。

但是,我不能使用中断,例如>| 因为这将在最终结果中包含空格,并且代码会出错。

按照 ansible-lint 指南,我不希望单行的字符串大小大于大约 84 个字符。在这个例子中,当我必须下载一个文件时,我不能简单地将字符串放在一行中。

预期输出:

- name: pretty download something
  shell:
    wget https://www. my_var 
    a_string
     a_very_long_string_to_show_what_i_mean 

【问题讨论】:

【参考方案1】:

但是,我不能使用中断,例如>| 因为这将在最终结果中包含空格,并且代码会出错。

这实际上只说对了一半。 您可以将其与 Jinja 的 whitespace control mechanism 结合使用,以删除那些不需要的空格。

基本上,在表达式块的开头或结尾添加破折号确实会修剪它之前或之后的多余空格或回车。


给定:

- hosts: localhost
  gather_facts: no

  tasks:
    - debug:
        msg: >-
          wget https://www. my_var -
          a_string
          - a_very_long_string_to_show_what_I_mean -
      vars:
        my_var: example.org/
        a_very_long_string_to_show_what_I_mean: _foo

这会产生:

ok: [localhost] => 
  msg: wget https://www.example.org/a_string_foo

注意在:

wget https://www. my_var -

不需要开头胡须上的破折号,因为在该变量之前没有多余的空格。

【讨论】:

老兄,谢谢,正是我想要的。 作为对您编辑的答案的回应:那么为什么最后一个变量需要 2 个破折号?在这种情况下,a_very_long.... 只是理智清理。如果这确实是 URL 的结尾,您也可以将其省略。 其实-最后会去掉vars:之前的换行符和空格,导致YAML不正确,因为vars:会附加到msg的值上。 @flyx 这不是 Ansible 模板的工作方式; YAML 在任何 Jinja 处理发生之前就已被解析好,因此模板空白操作不可能影响 YAML。

以上是关于在 YAML 中使用 enter 处理空格的更漂亮的方法的主要内容,如果未能解决你的问题,请参考以下文章

Python 自动化处理 Yaml 文件-

几条经验让jQuery用的更漂亮

匹配多种文件类型的更漂亮的 glob

yaml格式配置文件

更漂亮的 YAML - SyntaxError:紧凑映射中不允许嵌套映射

更漂亮:仅针对文件的更改行运行