使用字典的 Ansible 模板无法找到密钥

Ansible templating with dictionaries unable to find the key

我正在使用以下代码:

    - name: Find cert file
      ansible.builtin.find:
        file_type: file
        paths: /etc/ilmaotus
        patterns: '*_X509.pem'
      register: cert_files

    - name: Set cert based facts
      ansible.builtin.set_fact:
        device_id: "{{ cert_files['files'] | first | attr('path') }}"

我正在从目标主机获取文件名(应该始终只有一个文件),早期部分工作正常,包括获取列表中的第一项,但我似乎无法获取值对于字典中的 'path' 属性。我可以在我的 j2 文件中访问 'device_id',但无法获取 set_fact-play.

部分的值

当我打印 devide_id 时,第一个看起来像

{'path': '/etc/myservice/mypem_X509.pem', 'mode': '0544', 'isdir': False, 'is....

所以字典里应该有key。我做错了什么但不确定是什么。

与 Jinja 中访问属性的大多数方法不同,attr() 仅检索对象属性,而不检索集合项。 .[] 都可以, different precedence in each case:

        device_id: "{{ (cert_files['files'] | first).path }}"
        device_id: "{{ (cert_files['files'] | first)['path'] }}"

您也可以在使用 first() 之前使用 map() 检索项目:

        device_id: "{{ cert_files['files'] | map(attribute='path') | first }}"