1

我想在嵌套哈希上运行命令。我无法找到解决方案。我尝试过使用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 拓扑不存在,我将创建 Kafka 主题。哈希结构如何相同,我需要使用这些项目

用实际情况重新发布问题(https://stackoverflow.com/questions/37182895/nested-hash-in-ansible

4

2 回答 2

4

我的错误是我试图将loop_control与 Ansible 2.0 一起使用,因此它不起作用。相反,我应该使用loops-and-includes-in-2-0set_fact.

主要的.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
于 2016-05-12T09:58:43.893 回答
2

我认为没有标准的循环可以让你用你的数据结构做到这一点。

with_dict不会处理子元素。with_subelements 如果你有一个列表而不是一个字典,那就可以了。使用此数据结构:

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_dict将用户与include任务一起使用循环,然后with_dict在包含的文件中使用另一个循环访问访问项。

或者以正确/干净的方式进行操作并创建自己的查找插件。只需很少的 Python 知识,您就可以遍历任何数据结构。

于 2016-05-12T09:14:12.050 回答