ansible中的双with_items循环
Posted
技术标签:
【中文标题】ansible中的双with_items循环【英文标题】:Double with_items loop in ansible 【发布时间】:2019-04-06 13:39:11 【问题描述】:我想在 ansible 中创建一个双循环。 我有这样的一件事:
userslist:
- name: user1
primary : user1-group
groups :
- group1
- group2
- name: user2
primary : user2-group
groups :
- group3
- group4
- name : Creating Secondary group
group :
name : " item.groups "
state: present
with_items: " userslist"
每个用户都可以创建每个辅助组吗? 我认为为此我需要做第二个 with_items 循环,但我不知道如何
【问题讨论】:
【参考方案1】:有两种方法可以在 Ansible 中创建嵌套(双)循环。
with_nested
。它允许您对在外循环中迭代的对象进行内部迭代。官方文档中提供了示例和解释:https://docs.ansible.com/ansible/2.5/plugins/lookup/nested.html
将with_items
与include_tasks
一起使用。这是一个复杂而强大的结构。理论上,这种构造的嵌套程度没有限制(堆栈深度除外)。
它需要将内部代码放入单独的任务列表中。我将用outer.yaml
和inner.yaml
来展示它,外层对列表执行循环,内层对外层循环的项(循环变量)执行循环。
外部.yaml:
- name: Loop over foo
include_tasks: inner.yaml
with_items: ' foo '
loop_control:
loop_var: inner_var_name
vars:
foo:
- [1, 2, 3]
- [a, b, c]
inner.yaml:
- name: Performing operation one
debug: msg="Action one for item "
with_items: ' inner_var_name '
- name: Performing operation two
debug: msg="Action two for item"
with_items: ' inner_var_name '
此方法的主要优点是inner.yaml
可以包含任意数量的语句,所有这些语句都将从outer.yaml
循环处理。
一件重要的事情:所有include
的事情都需要谨慎处理与从包含的代码中传递值(set_fact
、register
等)相关的任何事情。 In 相当棘手且不明显,因此我的建议是永远不要在包含之外的包含代码中使用设置的变量。
【讨论】:
在我的例子中,user1 没有与 user2 相同的组和嵌套循环,我只能创建具有相同组的用户,对吗? include_tasks 也一样吗? 这取决于你。您可以使用相同的组,也可以使用不同的组。如果需要,您可以为用户提供一些“组”变量,其中包含他们所属的组列表,或者您可以拥有用户属于他们的组。如果要过滤部分用户,有when
语句。
我已经测试了很多语法,但我不能做我想要的:(你能写一个小例子吗?
但我已经为这两种情况提供了示例。他们还不够清楚,是吗?【参考方案2】:
我这样做了,效果很好
---
- hosts: all
become: yes
vars:
userslist:
- name: user1
primary : user1-group
groups :
- group1
- group2
- name: user2
primary : user2-group
groups :
- group3
- group4
tasks:
- name: Creating Secondary group
group:
name=" item.1 "
with_subelements:
- ' userslist '
- groups
【讨论】:
以上是关于ansible中的双with_items循环的主要内容,如果未能解决你的问题,请参考以下文章
ansible-playbook循环安装软件包(with_items)