以下任务:
- 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
为了实现这一点,我应该输入什么作为条件?另外,这个配置选项背后的原理是什么?
为了在任务、播放或块的条件中使用组成员资格,您将使用以下格式:
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
组 undernorth
和一个appservers
组 undersouth
,您会发现只有第一个组中的成员会被包括在内。在 ansible 中,我们如何实现这一点(我假设您将来可能想要什么),ansible 的继续方式是将主机添加到多个组中,并适当调整您的限制或条件:
在此示例中,如果您想要所有应用服务器,您只需定位
appservers
. 如果您只想appservers
在该north
地区,那么您可以将游戏限制设置为north:&appservers
,或者使用条件无论如何,我认为您可能需要重新了解 ansible 中的库存结构,因为我会推荐用户指南;各种培训网站上也有一些很棒的资源,可以更详细地介绍。
有关使用多个组(组合、联合和排除等)的更复杂定位的更多信息,我建议您查看此其他用户指南。
就个人而言,最初我认为设置乏味且有限,但随着我越来越熟悉使用它,我实际上发现它比替代方案更具动态性。