<p>在单个任务中从<em>hostvars</em>创建字典</p>
<pre class="lang-yaml prettyprint-override"><code>- hosts: all
tasks:
- set_fact:
distros: "{{ distros|default({})|
combine({ item.0: item.1|length }) }}"
loop: "{{ hostvars|dict2items|
groupby('value.ansible_distribution_release') }}"
run_once: true
</code></pre>
<hr/>
<p>当使用<em>json\u query</em>时,可以不迭代地创建相同的字典</p>
<pre class="lang-yaml prettyprint-override"><code>- hosts: all
tasks:
- set_fact:
distros: "{{ dict(keys|zip(vals)) }}"
vars:
dist: "{{ hostvars|dict2items|
json_query('[].{distro: value.ansible_distribution_release}')|
groupby('distro') }}"
keys: "{{ dist|map('first')|list }}"
vals: "{{ dist|map('last')|map('length')|list }}"
run_once: true
</code></pre>
<hr/>
<p>下一个选项是在自定义过滤器的帮助下创建字典</p>
<pre class="lang-py prettyprint-override"><code>shell> cat filter_plugins/count.py
def count(l):
d = {}
for i in set(l):
d[i] = l.count(i)
return d
class FilterModule(object):
def filters(self):
return {
'count': count,
}
</code></pre>
<pre class="lang-yaml prettyprint-override"><code>- hosts: all
tasks:
- set_fact:
distros: "{{ hostvars|
json_query('*.ansible_distribution_release')|
count}}"
run_once: true
</code></pre>