我正在尝试过滤YAML配置文件并根据密钥折叠它们。
对于Ansible剧本,我使用以下配置
virtual_hosts:
- vname: example
server_name: "www.example.com example.com"
port: 443
ssl:
cert: "star_example"
- name: example_star
server_name: "*.example.com"
port: 443
ssl:
cert: "star_example"
- name: foo
server_name: "www.foo.com foo.com"
port: 443
ssl:
cert: "foo"
我一直想使用模板
- name: Certs Template
set_fact:
vhost_certs: "{{ lookup('template', './cert.yml') | from_yaml }}"
使用以下cert.yml
{% if virtual_hosts is defined %}
{% for host in virtual_hosts %}
{% if host.ssl is defined %}
- name: "{{host.ssl.cert}}"
private: " ... PRIV KEY ...."
public: " ... PUB KEY ...."
{% endif %}
{% endfor %}
{% endif %}
问题是vhost_certs
将包含两次star_example
。
实际上,cert.yml使用Ansible插件进行查找以获取私钥和公钥,因此我只希望查找一次。
我想更好的方法是解析virtual_hosts
并创建一个新对象,其中的主键将是ssl.cert
,然后将所有server_names
添加到{{ 1}}和private
键,然后检查证书对于public
例如
server_name
Ansible中有没有办法做到这一点?
更新:
我设法创建了列表:
vhost_certs:
- name: star_example
server_names:
- "www.example.com"
- "example.com"
- "*.example.com"
- name: foo
server_names:
- "www.foo.com"
- "foo.com"
这确实提供了{{ virtual_hosts | json_query('[?ssl.cert].{cert: ssl.cert, domains: server_name }') | list }}
list
我只需要以某种方式将其折叠 到
item: {
"cert" : "star_example"
"domains" "www.example.com example.com"
}
item: {
"cert" : "star_example"
"domains" "*.example.com"
}
item: {
"cert" : "foo"
"domains" "www.foo.com foo.com"
}