有没有办法让以下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
如果有办法减少任何重复,那就太棒了。理想情况下,每个资源名称只会出现一次。
答案 0 :(得分:0)
是的,你可以通过两种优化来大大减少这种情况,其中一种优化使另一种优势大部分无效。但是,您必须通过简单的序列和映射来更改程序以创建更智能的对象(我称之为ShareInclude
,Shares
和Share
):
---
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
)并采取以下两种操作之一:
Share
Share
对象
这样,您必须指定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
变成一系列键值对,那么缩短的优势就会消失。