将 Ansible 中的复杂变量(列表字典)减少为简单列表

问题描述 投票:0回答:1

我搜索、扫描并尝试了多种解决方案,但没有找到合适的解决方案。这看起来是一个简单的操作。给定(例如)用户名和权限的 Ansible 变量,我想派生文件名(用于模板)以应用于每个组合。
过于简单的例子:

- task: user printing access
  vars:
    useraccess:
      superdude:
        - lpr
        - lpc
        - lpadmin
      nonprivuser:
        - lpr
  loop: # I'm at a loss
  debug:
    msg: "{{ some jinja2 expression using item transform }}""

我想要的结果

loop
以及任何转换/过滤器都应该像我指定的那样:

- task: user printing access
  vars:
    useraccess:
      - superdude/lpr
      - superdude/lpc
      - superdude/lpadmin
      - nonprivuser/lpr
  loop: "{{ useraccess }}"
  debug:
    msg: "{{ item }}"

我尝试过

map
product
dictitem
和其他一些,但尚未成功。

ansible jinja2 nested-loops ansible-2.x ansible-filter
1个回答
0
投票

一旦您在字典上使用

dict2items
,您就有了
key
value
属性。由于您的
value
是一个列表,因此您现在可以在其上使用
subelements
过滤器。

给定任务:

- set_fact:
    folders: "{{ folders | default([]) + [item.0.key ~ '/' ~ item.1] }}"
  loop: "{{ useraccess | dict2items | subelements('value') }}"
  loop_control:
    label: "{{ item.0.key }}/{{ item.1 }}"
  vars:
    useraccess:
      superdude:
        - lpr
        - lpc
        - lpadmin
      nonprivuser:
        - lpr

这将为您提供列表:

folders:
  - superdude/lpr
  - superdude/lpc
  - superdude/lpadmin
  - nonprivuser/lpr
© www.soinside.com 2019 - 2024. All rights reserved.