如何根据子键过滤Yaml值并将其折叠

时间:2019-02-10 08:53:39

标签: ansible ansible-2.x json-query

我正在尝试过滤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"  
}

0 个答案:

没有答案