如果你不介意播放日志混乱,这是一种方式:
- hosts: all gather_facts: no serial: 1 tasks: - group_by: key: "single_{{ cluster_number }}" when: groups['single_'+cluster_number] | default([]) | count == 0 - hosts: single_* gather_facts: no tasks: - debug: msg: "{{ inventory_hostname }}"
serial: 1 在第一次重新评估的过程中至关重要 when 每个主持人的声明。
serial: 1
when
首次播放后,每个群集只有N个组,其中只有一个主机。
一个选择是
比如给出了 主机
[test] test01 cluster_number='1' test02 cluster_number='1' test03 cluster_number='1' test04 cluster_number='1' test05 cluster_number='1' test06 cluster_number='2' test07 cluster_number='2' test08 cluster_number='2' test09 cluster_number='3' test10 cluster_number='3' [test:vars] cluster_numbers=['1','2','3']
以下剧本
- hosts: all gather_facts: no tasks: - group_by: key=cluster_{{ cluster_number }} - debug: var=groups['cluster_{{ item }}'][0] loop: "{{ cluster_numbers }}" run_once: true
给
> ansible-playbook test.yml | grep groups "groups['cluster_1'][0]": "test01", "groups['cluster_2'][0]": "test06", "groups['cluster_3'][0]": "test09",
在目标上执行任务 include_tasks (而不是在上面的循环中调试)和 delegate_to 目标
- set_fact: my_group: "cluster_{{ item }}" - command: hostname delegate_to: "{{ groups[my_group][0] }}"
注意:收集列表 cluster_numbers 从库存
cluster_numbers: "{{ hostvars|json_query('*.cluster_number')|unique }}"