以下任务:
- 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
,在 下创建一个appservers
组south
,您会发现只有第一个组中的成员才会被包括在内。
在 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 中的库存结构,为此我建议用户指南;各种培训网站上也有一些很棒的资源,可以进行更详细的介绍。
有关使用多个组(组合、联合和排除等)进行更复杂的定位的更多信息,我建议您查看其他用户指南。
就我个人而言,起初我认为该设置很繁琐且功能有限,但随着我越来越熟悉使用它,我实际上发现它比其他选择更具活力。