Ansible 中的嵌套哈希
Nested hash in Ansible
我想 运行 对嵌套哈希执行命令。我无法找到解决方案。我曾尝试使用 with_items
、with_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_dict
与 include
任务一起遍历用户,然后在包含的文件中使用另一个 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-0 和 set_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
我想 运行 对嵌套哈希执行命令。我无法找到解决方案。我曾尝试使用 with_items
、with_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_dict
与 include
任务一起遍历用户,然后在包含的文件中使用另一个 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-0 和 set_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