Я пытаюсь отфильтровать файл конфигурации YAML и свернуть их по ключу.
Для сборника игр, я использую следующую конфигурацию
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"
Я привязан к использованиюtemplate
- 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
, выполните фактический поиск ключей private
и public
, а затем убедитесь, что сертификат действителен для всех элементов вserver_name
например,
vhost_certs:
- name: star_example
server_names:
- "www.example.com"
- "example.com"
- "*.example.com"
- name: foo
server_names:
- "www.foo.com"
- "foo.com"
Есть ли способ в Ansible сделать это?
Обновление:
Мне удалось создать список:
{{ 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"
}
Я бы простонужно как-то свернуть до
item: {
"cert" : "star_example"
"domains"
- "*.example.com"
- "www.example.com example.com"
}