首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个唯一的事实值只运行一次ansible任务

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

Stack Overflow用户
提问于 2019-02-21 03:14:45
回答 2查看 2.3K关注 0票数 1

我有一个动态清单,它为每个主机分配一个“事实”,称为“集群_number”。

预先不知道群集号,但是有一个或多个主机被分配相同的编号。库存有数百个主机和2-3个独特的集群号码。

我想为清单中的所有主机运行一个任务,但是我希望每组共享相同'cluster_number‘值的主机只执行一次任务。为每个组选择哪个特定的主机并不重要。

我觉得应该有一个相对直截了当的方法来处理ansible,但我不知道如何做到这一点。我看过group_by,时间,循环,delegate_to等等,但是还没有成功。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-21 07:35:14

如果你不介意玩乱七八糟的日志,有一种方法:

代码语言:javascript
复制
- 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语句是至关重要的。

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

票数 1
EN

Stack Overflow用户

发布于 2019-02-21 07:23:13

一种选择是

  • 通过 the cluster_number
  • 聚类数上的一次循环
  • 从每一组中选出第一位主持人。

例如,给定主机

代码语言:javascript
复制
[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']

下面的剧本

代码语言:javascript
复制
- hosts: all
  gather_facts: no
  tasks:
    - group_by: key=cluster_{{ cluster_number }}
    - debug: var=groups['cluster_{{ item }}'][0]
      loop:  "{{ cluster_numbers }}"
      run_once: true

给出

代码语言:javascript
复制
> ansible-playbook test.yml | grep groups
"groups['cluster_1'][0]": "test01", 
"groups['cluster_2'][0]": "test06", 
"groups['cluster_3'][0]": "test09",

在目标任务上执行任务(而不是在上面的循环中调试)和目标

代码语言:javascript
复制
- set_fact:
    my_group: "cluster_{{ item }}"
- command: hostname
  delegate_to: "{{ groups[my_group][0] }}"

注意:从清单中收集cluster_numbers列表

代码语言:javascript
复制
cluster_numbers: "{{ hostvars|json_query('*.cluster_number')|unique }}"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54798683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档