Ansible 从列表中获取第一个元素

标签 ansible jinja2

假设我有以下vars_file:

mappings:
  - primary: 1.1.1.1
    secondary: 2.2.2.2

  - primary: 12.12.12.12
    secondary: 11.11.11.11

和主机文件

1.1.1.1
12.12.12.12
5.5.5.5

以及以下剧本任务

- name: Extract secondary from list
  debug:
    msg: "{{ (mappings | selectattr('primary', 'search', inventory_hostname) | list | first | default({'secondary':None})).secondary }}"

当前任务有效,并且在找不到匹配项时会给出空字符串,但我想知道是否有更好的方法/更干净的方法来执行此操作,而无需将字典传递给默认构造函数。

最佳答案

一个选项是使用json_query

- debug:
    msg: "{{ mappings | json_query(\"[?primary=='\" + inventory_hostname + \"'].secondary\") }}"

,但是selectattr也可以工作

- debug:
    msg: "{{ mappings | selectattr('primary', 'equalto', inventory_hostname) | map(attribute='secondary') | list }}"

关于Ansible 从列表中获取第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54639553/

相关文章:

python - 我如何在 Jinja 中创建一个包含模板后面的值的标签?

python - 如何将 Erlang 配置文件与 Python J2 模板一起使用?

python - Jinja2中模板的动态使用

python - 在 Jinja2 模板中访问类方法

elasticsearch - 如何通过 Ansible 生成 Elasticsearch 安全用户

xml - 使用 Ansible 在 Jinja2 中转义特殊 XML 字符

python - Python 中的 Github flavor Markdown

Python:我可以在 Ansible 的帮助下在 yaml 配置文件中使用变量和简单表达式吗?

ansible - ansible中的系统特定变量

Ansible:如果远程主机上存在文件,则回显该文件的内容