有没有办法缩短这个YAML?

时间:2014-10-20 02:13:18

标签: yaml

有没有办法让以下YAML更短,以便不重复相同的资源?

---
  classes:
    - roles::storage::nfs
  samba::config::includeconf:
    - alpha
    - beta
    - charlie
    - delta
    - echo
    - foxtrot
  smb_shares:
    alpha:
      name: alpha
    beta:
      name: beta
    charlie:
      name: charlie
    delta:
      name: delta
    echo:
      name: echo
      path: /path/to/file
    foxtrot:
      name: foxtrot

如果有办法减少任何重复,那就太棒了。理想情况下,每个资源名称只会出现一次。

1 个答案:

答案 0 :(得分:0)

是的,你可以通过两种优化来大大减少这种情况,其中一种优化使另一种优势大部分无效。但是,您必须通过简单的序列和映射来更改程序以创建更智能的对象(我称之为ShareIncludeSharesShare):

---
  classes:
    - roles::storage::nfs
  samba::config::includeconf: !ShareInclude
    - alpha
    - beta
    - charlie
    - delta
    - echo
    - foxtrot
  smb_shares: !Shares
    echo: !Share
      path: /path/to/file

创建ShareInclude时,应为每个序列元素创建一个Share,其初始名称与标量值相同,并将其插入某个全局列表中。

上面介绍了大部分Share对象,不包括info。什么时候

echo: !Share
  path: /path/to/file
处理

时,应创建临时匿名Share,并将path设置为属性或其他可检索值(如果名称不同,也可以存储)。然后,一旦创建Shares,它将知道要查找的共享的名称(从映射的键中echo)并采取以下两种操作之一:

  1. 如果可以查找名称,请使用匿名Share
  2. 中的信息更新Share对象
  3. 如果找不到该名称,请通过提供密钥值作为其名称来宣传匿名共享,并将其存储。
  4. 这样,您必须指定echo两次,否则无法将显式path与处理Share时创建的特定ShareInclude对象相关联。如果仍然太多,你可以从另一个方面接近它,并在处理ShareInclude时将Shares留空并隐式地输入:

    ---
      classes:
        - roles::storage::nfs
      samba::config::includeconf: !ShareInclude
      smb_shares: !Shares
        alpha:
        beta:
        charlie:
        delta:
        echo:
          path: /path/to/file
        foxtrot:
    

    虽然这有点短,但根据您的YAML解析器,您可能不再在创建Share对象时保证有序。如果你必须将Shares变成一系列键值对,那么缩短的优势就会消失。