Patterns: 目标主机和组
当您通过临时命令或运行剧本执行 Ansible 时,您必须选择要执行的托管节点或组。Patterns 允许您对 Inventory 中的特定主机或组运行命令和剧本。Ansible Patterns 可以指单个主机、IP地址、库存组、一组组或库存中的所有主机。Patterns 非常灵活,您可以排除或要求主机的子集,使用通配符或正则表达式等。Ansible 在 Patterns 中包含的所有 Inventory 主机上执行。
使用 Patterns
每次执行临时命令或剧本时,都会使用 pattern。该 Pattern 是临时命令中唯一没有标志的元素。它通常是第二个元素
1
ansible <pattern> -m <module_name> -a "<module options>"
示例:
1
ansible webservers -m service -a "name=httpd state=restarted"
在 playbook 中,pattern 是 host 的内容
1
2- name: <play_name>
hosts: <pattern>示例:
1
2- name: restart webservers
hosts: webservers由于通常希望同时对多个主机运行命令或 playbook,因此 pattern 通常指 inventory 组。上面的临时命令和 playbook 都将对 webservers 组中的所有机器执行。
常见的 patterns
下表列出了针对 Inventory 主机和组的常见 Pattern。
描述 | Pattern(s) | 目标主机或组 |
---|---|---|
所有主机 | all (or *) | - |
一个主机 | host1 | - |
多个主机 | host1:host2 (or host1,host2) | - |
一个组 | webservers | - |
多个组 | webservers:dbservers | webservers 中的所有主机加上 dbservers 中的所有主机 |
排除组 | webservers:!atlanta | webservers 组中除 atlanta 组以外的所有主机 |
两个组的交集 | webservers:&staging | 既处于 webservers 中也处于 staging 组中的任何主机 |
注意: 可以使用逗号 (,) 或冒号(;)来分隔主机列表。在处理范围和IPv6地址时,首选逗号。
一旦了解了基本模式,就可以把它们组合起来。此示例:
1
webservers:dbservers:&staging:!phoenix
针对 “webservers” 和 “dbservers”组中也在“staging” 组中的所有机器,但 “phoenix” 组中的任何机器除外。
您可以将通配符模式与FQDN或IP地址一起使用,只要主机在您的 Inventory 中按FQDN或IP地址命名:
1
2
3192.0.*
*.example.com
*.com您可以同时混合通配符模式和组:
1
one*.com:dbservers
Patterns 的局限性
Patterns 取决于 Inventory。如果您的 Inventory 中没有列出主机或组,则无法使用 Pattern 来定位它。如果您的 Pattern 中包含未出现在 Inventory 中的IP地址或主机名,您将看到这样的错误:
1 | [WARNING]: No inventory was parsed, only implicit localhost is available |
您的 Pattern 必须与您的 Inventory 语法相匹配。如果您将主机定义为别名:
1 | atlanta: |
您必须使用 Pattern 中的别名。在上面的示例中,您必须在模式中使用 host1。如果您使用IP地址,您将再次收到错误:
1 | [WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2 |
Pattern 处理顺序
Pattern 按以下顺序进行处理:
:
and,
&
!
高级 Pattern 选项
上面描述的常见 Pattern 将满足您的大多数需求,但 Ansible 提供了其他几种方法来定义您想要处理的主机和组。
在 Patterns 中使用 变量
您可以使用变量,通过
-e
参数将组说明符传递给 ansible-playbook:1
webservers:!{{ excluded }}:&{{ required }}
在 Patterns 中使用组位置
您可以根据主机或主机子集在组中的位置来定义它。例如,给定以下组:
1
2
3
4[webservers]
cobweb
webbing
weber您可以使用下标在 webservers 组中选择单个主机或范围:
1
2
3
4
5
6webservers[0] # == cobweb
webservers[-1] # == weber
webservers[0:2] # == webservers[0],webservers[1]
# == cobweb,webbing
webservers[1:] # == webbing,weber
webservers[:3] # == cobweb,webbing,weber
在 Patterns 中使用正则
您可以通过以
~
开始 Pattern 来指定 Patterns 为正则表达式:1
~(web|db).*\.example\.com
Pattern 和 ad-hoc 命令
您可以使用命令行选项更改 ad-hoc 命令中定义的 pattern 的行为。您还可以使用 --limit
标志限制您在特定运行中的目标主机。
限制为一个主机
1
ansible all -m [module] -a "[module options]" --limit "host1"
限制多台主机
1
ansible all -m [module] -a "[module options]" --limit "host1,host2"
取反限制。请注意,必须使用单个引号来防止bash插值。
1
ansible all -m [module] -a "[module options]" --limit 'all:!host1'
限制主机组
1
ansible all -m [module] -a "[module options]" --limit 'group1'
Pattern 和 palybook flags
您可以使用命令行选项更改 playbook 中定义的 pattern 的行为。
例如,您可以通过指定
-i 127.0.0.2
运行定义主机的 playbook:全部在单个主机上(注意尾随逗号)。即使您目标主机未在清单中定义,这也可以工作,但此方法不会读取您的清单中与此主机绑定的变量,并且所需的任何变量都需要在命令行手动指定。您还可以使用--limit
标志限制您在特定运行中的目标主机,该标志将引用您的清单:1
ansible-playbook site.yml --limit datacenter2
最后,您可以使用
--limit
通过在文件名前加上@
来读取文件中的主机列表:1
ansible-playbook site.yml --limit @retry_hosts.txt
如果
RETRY_FILES_ENABLED
设置为 True,则在 ansible-playbook 运行后将创建一个.retry
文件,其中包含所有播放的失败主机列表。每次 ansible-playbook 完成运行时,此文件都会被覆盖。1
ansible-playbook site.yml --limit @site.retry