我有两个清单:
ForwardIterators
我使用的任务为每个元素获取一些值:
the_list:
- { name: foo }
- { name: bar }
- { name: baz }
从现在开始,我可以将- name: Get values
shell:
magic_command {{ item.name }}
with_items: the_list
register: spells
及其对应值一起使用:
the_list
一切正常,但是对于许多任务使用- name: Use both
shell:
do_something {{ item.0.name }} {{ item.1.stdout }}
with_together:
- "{{ the_list }}"
- "{{ spells.results }}"
感到很不舒服,并且将来很难阅读该代码,所以我非常乐意构建{{1从我可以用一个简单的方式使用的那个。让我们这样说:
with_together
这使得这个难题。有人可以帮忙吗?
答案 0 :(得分:2)
我写了两个ansible过滤器来解决这个问题:zip和todict可以在https://github.com/ahes/ansible-filter-plugins我的回购中找到
样本ansible playbook:
- hosts: localhost
vars:
users:
- { name: user1 }
- { name: user2 }
tasks:
- name: Get uids for users
command: id -u {{ item.name }}
register: uid_results
with_items: users
- set_fact:
uids: "{{ uid_results.results | map(attribute='stdout') | todict('uid') }}"
- set_fact:
users: "{{ users | zip(uids) }}"
- name: Show users with uids
debug: var=users
结果将是:
TASK [Show users with uids] ****************************************************
ok: [localhost] => {
"users": [
{
"name": "user1",
"uid": "1000"
},
{
"name": "user2",
"uid": "2000"
}
]
}
答案 1 :(得分:0)
这可能是一种矫枉过正,但您应该尝试编写自定义filter plugin。
每次迭代the_list
时,您都希望将value
添加到dict
{name: 'foo'}
权利吗?
更新后,您只需要新的dict具有如下值:{name: 'foo', value: 'jigsaw'}
过滤插件非常简单:
def foo(my_list, spells):
try:
aux = my_list
for i in xrange(len(aux)):
my_list[i].update(spells[i])
return my_list
except Exception, e:
raise errors.AnsibleFilterError('Foo plugin error: %s, arguments=%s' % str(e), (my_list,spells) )
class FilterModule(object):
def filters(self):
return {
'foo' : foo
}
在plugins directory中添加此python代码后,您可以轻松调用foo
插件作为参数传递spells
列表:
- name: Get values
shell:
magic_command {{ item.name }}
with_items: the_list
register: spells
- name: Use both
shell:
do_something {{ item.name }} {{ item.value }}
with_items:
- "{{ the_list | foo(spells.results) }}"
注意:python代码只是一个例子。阅读有关开发过滤器插件的ansible文档。