Pattern: 正则匹配主机和组¶
当你执行 ad-hoc 临时命令或 playbook 时,你必须指定要被变更的节点或组。 Pattern 可以让你更方便的指定特定主机或组。 可以单独指定一台主机,一个 IP 地址,一个 Inventory 清单组, 一个子网的组或者你 Inventory 中的所有主机。 Pattern 具有高度的灵活性- 您可以排除或要求主机的子集,使用通配符或正则表达式等等。 Ansible 在模式中包含的所有清单主机上执行。
使用 patterns 模式¶
执行临时命令或剧本的任何时候都可以使用模式。 该模式是 ad-hoc command 中唯一没有标志的参数。 它通常是第二个参数:
ansible <pattern> -m <module_name> -a "<module options>"
举例:
ansible webservers -m service -a "name=httpd state=restarted"
在Playbook 中,pattern 是 hosts:
的值。
- name: <play_name>
hosts: <pattern>
举例:
- name: restart webservers
hosts: webservers
由于您通常想一次对多个主机运行命令或剧本,因此模式通常指代清单组
由于你通常希望针对多台主机一次性运行一个命令或 playbook, patterns 通常关联是一组主机列表。 ad-hoc 命令和 playbook 将对 webservers
中的所有主机做变更。
通过 patterns¶
下表展示了 patterns 模式的用法。
Description | Pattern(s) | Targets |
---|---|---|
All hosts | all (or *) | |
One host | host1 | |
Multiple hosts | host1:host2 (or host1,host2) | |
One group | webservers | |
Multiple groups | webservers:dbservers | all hosts in webservers plus all hosts in dbservers |
Excluding groups | webservers:!atlanta | all hosts in webservers except those in atlanta |
Intersection of groups | webservers:&staging | any hosts in webservers that are also in staging |
注解
你可以使用 (,
) 或(:
) 分隔多个主机。 推荐使用逗号,因为在 IPv6 的场景下首先逗号
当你掌握基础 pattern 后,你就可以高级进阶混合使用他们了。示例:
webservers:dbservers:&staging:!phoenix
该 pattern 表示 ‘webservers’ and ‘dbservers’ 组的所有主机,和 ‘staging’ 组中的交集的所有主机,并且这些主机不在 ‘phoenix’ 组中。
你也可以使用正则表示的 FQDN 主机名或 IP 地址:
192.0.* *.example.com *.com
你也可以同时混合使用正则和 patterns:
one*.com:dbservers
patterns 局限性¶
Patterns 依赖于 Inventory。 如果 host 或 group 不在 Inventory 清单仓库,则不能使用 Pattern 。 如果你使用的 Patterns IP 或主机名不存在。 会引发如下报错:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: Could not match supplied host pattern, ignoring: *.not_in_inventory.com
Pattern 必须遵循 Inventory 语法规则。如果你定义了一台 host alias:
atlanta:
host1:
http_port: 80
maxRequestsPerChild: 808
host: 127.0.0.2
你必须在 Pattern 使用别名。 在如上的案例中,你必须在 pattern 中使用 host1
。 如果你使用 IP 地址,会报错:
[WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2
高级 Pattern 选项¶
如上所述的通用 patterns 已经满足你的绝大部分需求,但 Ansible 也提供了几种其它的方式来定义你的目标主机和组。
在 patterns 使用变量¶
ansible-playbook 通过 -e
选项可以接受变量,在 pattern 中可以使用 {{ 变量 }}
:
webservers:!{{ excluded }}:&{{ required }}
在 patterns 使用组位置参数¶
您可以根据主机在主机组中的位置定义主机或主机子集. 如下示例:
[webservers]
cobweb
webbing
weber
你可以使用下标切割选择需要的主机或主机组:
webservers[0] # == cobweb
webservers[-1] # == weber
webservers[0:2] # == webservers[0],webservers[1]
# == cobweb,webbing
webservers[1:] # == webbing,weber
webservers[:3] # == cobweb,webbing,weber
Patterns and ansible-playbook 标志¶
命令行的优先级比 playbook 高,通过指定命令行选项可以覆盖 playbook 中的定义。 举例:你在 playbook 中定义 hosts: all
,但在命令行中指定 -i 127.0.0.2
, 命令行会覆盖 playbook 中的定义。 这种方式甚至在 Inventory 中没有定义目标主机都可行。同样,你可以使用 --limit
标识指定特定的目标主机:
ansible-playbook site.yml --limit datacenter2
最后,你可以使用 --limit
从一个文件中读取主机列表, 使用时在文件名前加 @
:
ansible-playbook site.yml --limit @retry_hosts.txt
如果 RETRY_FILES_ENABLED 设置 True
, 当 ansible-playbook
执行失败的主机记录到以 retry
结尾的文件中。这个文件在每次 ansible-playook
执行结束后都会被覆盖。
ansible-playbook site.yml –limit @site.retry
更多关于 ad-hoc 和 playbook 的 pattern 信息请参考 ad-hoc 命令操作指引 and Intro to Playbooks.
参见
- ad-hoc 命令操作指引
- 基础命令示例
- Working With Playbooks
- 学习 Ansible 配置管理语言
- Mailing List
- Questions? Help? Ideas? Stop by the list on Google Groups
- irc.freenode.net
- #ansible IRC chat channel