ansible - 带有特殊变量的 Ansible 查找插件
问题描述
Ansible 查找插件是否能够支持特殊字符?
例子:
vars:
stage: prod
debug:
msg: "{{ lookup('?', 'groups.' + stage + '.index(inventory_hostname)') }}"
如果没有,是否仍然可以通过其他方式解决此问题以获取属于某个组的主机的索引stage
?
感谢您的帮助。
解决方案
要获取列表中元素的索引,您确实可以index()
在 jinja2 中使用,因为您似乎已经发现了。但是没有必要为此使用查找(并且无论如何都没有命名查找?
)。要在您的示例中的动态命名组上执行此操作,这给出了。
debug:
msg: "{{ groups[stage].index(inventory_hostname) }}"
有关语法的更多信息,请参阅有关访问复杂变量的文档。
同时,您应该注意,如果该值不存在于列表中(即主机不存在于组中),此方法将引发错误,并且无法像使用普通未定义变量一样使用default
过滤器恢复它。
因此,如果您的目标主机有可能不在stage
组中,您应该添加一些额外的 jinja2 表达式以确保您始终获得没有错误的值(例如,如果主机不在列表中,则返回 -1):
debug:
msg: "{%if machine in groups[stage] %}{{ groups[stage].index(inventory_hostname) }}{% else %}-1{% endif %}"
既然你提到了查找,还有一个使用indexed_items
插件的解决方案。这里的想法是将组列表转换为 ( <index>
, <host>
) 元组列表,搜索具有等于当前主机的第二个元素的元组,只保留结果的第一个元素,如果结果为空,则默认为虚拟元组并打印保留元组的第一个元素:
debug:
msg: "{{ (lookup('indexed_items', groups[stage]) | selectattr('1', 'eq', inventory_hostname) | first | default([-1]))[0] }}"
推荐阅读
- javascript - 在另一个模块中注入模块并使用注入模块的控制器
- django - Django:将 ListView 与 UpdateView 结合使用
- r - 使用 Shiny 添加/删除项目管理
- virtualbox - 虚拟化 Windows 10 上的 Virtualbox 仅显示 32 位模板?
- ruby-on-rails - Action Mailer 的问题
- codenameone - 在 PropertyBusinessObject 中存储任意对象
- .net - 如何将 SQLite 数据库中的文本与文本文件中本地保存的某些文本进行比较?
- java - Android:选择了水平日历错误的日期
- c++ - 在模板类中定义的枚举上嵌套类的部分特化
- css - 绑定的 JavaFX 属性可以被 CSS 修改吗?