Ansible 中的嵌套哈希

Nested hash in Ansible

我想 运行 对嵌套哈希执行命令。我无法找到解决方案。我曾尝试使用 with_itemswith_dict,但我认为这不适合我的用例。

在进行 ansible 循环时,我认为我可以使用 loop-control 来完成此操作。我怎么也做不到。有人可以帮我解决这个问题吗?

Ansible 版本:2.0.2.0

我的哈希

users:
  ankit:
    name: ankit
    access:
      opt: /opt/data
      tmp: /tmp
  gupta:
    name: gupta
    access:
      data: /opt/data/gupta

预期执行 运行 使用上述哈希的循环。

- file: path=/opt/data state=directory owner:ankit mode=0755
- file: path=/tmp state=directory owner:ankit mode=0755
- file: path=/opt/data/gupta state=directory owner:gupta mode=0755

注意:这是修改后的例子。我没有在实际任务中创建文件夹。如果基于 Storm Topology 不存在,我正在创建 Kafka 主题。哈希结构如何相同,我需要使用这些项目

用事实重新发布问题()

我认为没有标准循环允许您使用数据结构执行此操作。

with_dict 不会处理子元素。 with_subelements 如果你有一个列表而不是 dict 就可以工作。使用此数据结构:

users:
  - name: ankit
    access:
      - /opt/data
      - /tmp
  - name: gupta
    access:
      - /opt/data/gupta

...你可以这样做:

- file: "path={{ item.1 }} state=directory owner={{ item.0.name }} mode=0755"
  with_subelements:
     - "{{ users }}"
     - access

如果您不能更改您的数据结构,它将变得更加复杂。您可以使用一些丑陋的解决方法,例如首先使用 with_dictinclude 任务一起遍历用户,然后在包含的文件中使用另一个 with_dict 来遍历 访问-items.

或者按 right/clean 方式和 create your own lookup plugin 进行。只需很少的 python 知识,您就可以遍历任何数据结构。

我的错误是我试图使用 loop_control with Ansible 2.0 hence it was not working. instead I should be using loops-and-includes-in-2-0set_fact

main.yml

- include: kafka_topic.yml
  with_dict: project.topology

kafka_topic.yml

- set_fact:
    outer_item: "{{item}}"

- debug:
    msg: "inner item={{item.value}}"
    with_dict: outer_item.value.kafka_topic