Ansible:使用map filter提取列表嵌套结构下的用户邮箱失败,求可行实现代码
Ansible:使用map filter提取列表嵌套结构下的用户邮箱失败,求可行实现代码
嗨~我来帮你搞定这个问题!
问题出在你改了employees的结构之后,sarav对应的不再是单个字典,而是一个包含字典的列表了!原来的map+extract写法只适用于直接嵌套字典的场景,现在多了一层列表,自然就拿不到值啦。
给你几个可行的实现方案,按需选就行:
方案1:适配map filter的通用写法(兼容多元素列表)
如果sarav下面可能有多个条目,或者想继续用map filter的思路,试试这个:
tasks: - name: 提取sarav的邮箱(适配列表嵌套结构) ansible.builtin.debug: msg: "{{ ['sarav'] | map('extract', employees) | flatten | map(attribute='email') | list }}"
我给你拆解开说哈:
- 先通过
map('extract', employees)把sarav对应的列表拿出来,这时候得到的是个嵌套的列表[[{...}]] - 用
flatten把它打平成单层的列表[{...}] - 再用
map(attribute='email')把每个字典里的email字段揪出来 - 最后
list转成正常的列表格式输出
方案2:直接索引提取(适合单元素列表场景)
如果你确定sarav下面永远只有一个条目,这个写法更简单直接,一步到位:
tasks: - name: 提取单个条目的sarav邮箱 ansible.builtin.debug: msg: "{{ employees.sarav.0.email }}"
直接通过索引0定位列表里的第一个字典,再取email字段就行,省心又高效~
方案3:用json_query灵活提取
如果之后还要处理更复杂的结构查询,json_query是个好选择,语法也很直观:
tasks: - name: 用json_query提取sarav邮箱 ansible.builtin.debug: msg: "{{ employees | json_query('sarav[*].email') }}"
这里sarav[*].email的意思就是:取出sarav列表下所有元素的email字段,不管列表里有几个元素都能搞定。
备注:内容来源于stack exchange,提问作者learnansibe
相关产品推荐
相关产品推荐

