如何为特定库存组设置运行任务?

如何为特定库存组设置运行任务?

以下任务:

- name: Download Jfrog Artifcats
  ansible.windows.win_shell: |
    $ENV:JFROG_CLI_OFFER_CONFIG="false"
    jfrog rt download ...
  when: ???

center应该只在位于appservers组下的机器上运行

---
all:
  children:
    root:
      children:
        center:
          children:
            appservers:
              hosts:
                vm1.domain.com:
            qservers:
              hosts:
                vm2.domain.com:
            dbservers:
              hosts:
                vm3.domain.com:
        mobilefarms:
          hosts:
          children:
            gateways:
              hosts:
        south:
          children:
            brooklyn:
              hosts:
                vm4.domain.com:
              children:
                clients:
                  hosts:
                    vm5.domain.com:
                    vm6.domain.com:
        north:
          children:
            new_york:
              hosts:
                vm8.domain.com:
              children:
                clients:
                  hosts:
                    vm9.domain.com:

when为了实现这一点,我应该输入什么条件?此外,这个配置选项背后的原理是什么?

答案1

为了在任务、剧本或区块的条件中使用组成员身份,您可以使用以下格式:

when: inventory_hostname in groups["<group name>"]

具体针对你最初的问题:

when: inventory_hostname in groups["appservers"]

要访问下的所有机器north,只需将其更改为: when: inventory_hostname in groups["north"]

关于您后续的澄清(在特定的“位置”指定一个组),由于组名在 ansible 中必须是唯一的,因此无需区分哪个 appservers您所指的组appservers只能位于一个位置。

如果您尝试创建两个appservers组,则 ansible 引擎实际上只会解析第一个组;任何后续同名组都将被忽略。因此,如果您计划(将来)在appservers下创建一个组north,在 下创建一个appserverssouth,您会发现只有第一个组中的成员才会被包括在内。

在 ansible 中,我们如何实现这一点(我的假设可能如果您将来想要这样做),则可以通过 ansible 方式将主机添加到多个组,如下所示,并适当调整限制或条件:

all:
  children:
    north:
      hosts:
        a.domain.com:
        b.domain.com:
    south:
      hosts:
        y.domain.com:
        z.domain.com:
    appservers:
      hosts:
        a.domain.com:
        y.domain.com:
    dbservers:
      hosts:
        b.domain.com:
        z.domain.com:

在这个例子中,如果你想全部应用服务器,您只需定位appservers。如果您只想appservers在该north地区,那么您可以将播放限制设置为north:&appservers,或者使用条件

when:
  - inventory_hostname in groups["appservers"]
  - inventory_hostname in groups["north"]

无论如何,我认为你可能需要重新了解一下 ansible 中的库存结构,为此我建议用户指南;各种培训网站上也有一些很棒的资源,可以进行更详细的介绍。

有关使用多个组(组合、联合和排除等)进行更复杂的定位的更多信息,我建议您查看其他用户指南


就我个人而言,起初我认为该设置很繁琐且功能有限,但随着我越来越熟悉使用它,我实际上发现它比其他选择更具活力。

相关内容