ansible - 从 ansible 的列表中获取最新的字典
问题描述
我有一个字典列表,我想获得最新的。
查看 jinja2 文档似乎我应该能够做到这一点:
- set_fact:
t:
- a: 1
b: 2
- a: 3
b: 1
- debug:
msg: "{{ t | max(attribute='a') }}"
但这失败了
致命的:[本地主机]:失败!=> { "msg": "在 ({{ t | max(attribute='a') }}) 上发生了意外的模板类型错误:max() > 得到了一个意外的关键字参数 'attribute'" }
这样做最好的方法是什么?当然,我的用例比那个小演示更难。我的想法看起来像这样:
check_mode: no
set_fact:
tgs_info: "{{ tgs_info | default({}) | combine({ item: all_tg_info | to_json | from_json | json_query(query) | max(attribute='target_group_name') }) }}"
vars:
query: "target_groups[?contains(target_group_name, `{{ product }}`) == `true`] | [?ends_with(target_group_name, `{{ tg_suffix }}{{ item }}`) == `true`]"
loop: "{{ projects | selectattr('protocol', 'match', '^HTTP$') | map(attribute='port') | list }}"
这个想法是all_tg_info
包含我的 aws 帐户的所有自动缩放。我过滤它们,我想根据名称或任何其他参数获取最新的。我有点呆在这里。
解决方案
更新:正如下面@Hellseher 评论中所报告的,从ansible 2.11版本开始,max|min(attribute='someattr')
将可用。因此,对于此版本及以后的版本,以下答案将过时。请参阅相应的拉取请求。
审查 jinja2 文档似乎我应该能够做到这一点......
尽管jinja2 内置过滤器文档提到了max
过滤器的可能参数,但在 ansible 端有一个开放的错误报告来支持这些。
json_query
在这种情况下,您可以使用过滤器轻松实现您的要求。这是一个包含您的简单数据的演示手册(因为我没有您更详细的数据......)。您可能可以将其调整为您的实际json_query
.
---
- hosts: localhost
gather_facts: false
vars:
t:
- a: 1
b: 2
- a: 3
b: 1
tasks:
- debug:
msg: "{{ t | json_query('max_by(@, &a)') }}"
推荐阅读
- corda - 任何流程是否可以同时将两个用户的 softLock 应用到相同的状态?
- android - 任何人都可以在 xamarin.android 中修复我的 ListView 问题吗?
- rest - 如何通过 REST API 从 TFS 2018 U2 获取 TestPlan
- javascript - 如何知道用户是否在输入中添加或删除字符
- zsh - OSX launchctl ZSH Shell 脚本不等待外部程序完成
- testing - 如果我们在圆周图中有多个开始和停止会发生什么
- node.js - 使用 Typescript 和 JSForce 的 Webpack 编译错误
- python-3.x - 在python中调用函数时没有文件错误
- google-cloud-ml - 从自定义预测类中获取正在运行的项目 ID
- php - PHP如何从相同的字符串创建相同的哈希?