Ansible/Jinja2 - 在列表中映射嵌套键

问题描述 投票:0回答:2

在嵌套变量列表中映射属性时,我无法检索其键。

我想从以下强调文本变量中检索“tls_cert_file”的密钥:

vault_config_listener:
  - tcp:
    - address: "0.0.0.0:8200"
    - tls_cert_file: "/etc/ssl/wildcard.crt"
    - tls_key_file: "/etc/ssl/private/wildcard.key"
    - tls_require_and_verify_client_cert: "false"
  - tcp:
    - address: "127.0.0.1:8200"
    - tls_disable: true

调试任务:

- debug:
    msg: "{{ (vault_config_listener | selectattr('tcp', 'defined') | map(attribute='tcp')) | selectattr('tls_cert_file','defined') | map(attribute='tls_cert_file') | join('') | dirname }}"

输出:

ok: [test] => {
    "msg": ""
}

我的映射工作直到“tcp”,但没有进一步......逻辑有什么问题?

filter ansible yaml jinja2
2个回答
5
投票

要获取

tls_cert_file
的列表,您可以使用

vault_config_listener | selectattr('tcp', 'defined') | map(attribute='tcp') | sum(start=[]) | selectattr('tls_cert_file','defined') | map(attribute='tls_cert_file') | list

注意

sum(start=[])
– 它用于展平列表的列表。

附注为什么要将可能的(?)多个路径连接到字符串中?

P.P.S 你的数据结构看起来很奇怪。为什么要定义诸如列表之类的 tcp 属性,而不仅仅是:

tcp:
  address: 0.0.0.0:8200
  tls_cert_file: /etc/ssl/wildcard.crt
  tls_key_file: /etc/ssl/private/wildcard.key
  tls_require_and_verify_client_cert: false

0
投票

您可以通过在中间放置扁平过滤器来获取 tls_cert_file 的值。

会是这样的

- name: Get tls_cert_file
  debug:
    msg: "{{ vault_config_listener | selectattr('tcp', 'defined') | map(attribute='tcp') | flatten | selectattr('tls_cert_file', 'defined') | map(attribute='tls_cert_file') | first }}"
© www.soinside.com 2019 - 2024. All rights reserved.