每个唯一的事实值只运行一次ansible任务


一生浮华
2025-03-18 09:14:36 (24天前)
  1. 我有一个动态库存,为每个主机分配一个“事实”,称为“cluster_number”。

群集号码事先不知道,但有一个或多个主机分配相同的…

3 条回复
  1. 0# 薄情 | 2019-08-31 10-32



    如果你不介意播放日志混乱,这是一种方式:



    1.   - hosts: all
    2. gather_facts: no
      serial: 1
      tasks:

    3. - group_by:
    4.     key: "single_{{ cluster_number }}"
    5.   when: groups['single_'+cluster_number] | default([]) | count == 0
      • hosts: single_*
        gather_facts: no
        tasks:

        • debug:
          msg: “{{ inventory_hostname }}”





    serial: 1

    在第一次重新评估的过程中至关重要

    when

    每个主持人的声明。



    首次播放后,每个群集只有N个组,其中只有一个主机。


  2. 1# 大黑骡子王 | 2019-08-31 10-32



    一个选择是




    比如给出了

    主机




    1. [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’]

    2. </code>


    以下剧本



    1.   - hosts: all
    2. gather_facts: no
      tasks:

    3. - group_by: key=cluster_{{ cluster_number }}
    4. - debug: var=groups['cluster_{{ item }}'][0]
    5.   loop:  "{{ cluster_numbers }}"
    6.   run_once: true
    7. </code>





    1.   > ansible-playbook test.yml | grep groups
    2. groups[‘cluster_1’][0]”: test01”,
      groups[‘cluster_2’][0]”: test06”,
      groups[‘cluster_3’][0]”: test09”,

    3. </code>


    在目标上执行任务

    include_tasks

    (而不是在上面的循环中调试)和

    delegate_to

    目标



    1.   - set_fact:
    2. my_group: "cluster_{{ item }}"
      • command: hostname
        delegate_to: “{{ groups[my_group][0] }}”




    注意:收集列表

    1. cluster_numbers


    从库存



    1. cluster_numbers: "{{ hostvars|json_query('*.cluster_number')|unique }}"


登录 后才能参与评论