Как отфильтровать значения yaml по подключам и свернуть их - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь отфильтровать файл конфигурации 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"   
}
...