Ansible 学习笔记 - 定位主机和组的模式

时间:2023-01-15 20:00:00

中英文对照表

英文 中文 备注

host 主机  

group (主机)组  

pattern 模式  

ad hoc 特别命令  

playbook 剧本 Ansible 专有名词,一段复杂的编排

inventory 库存 Ansible 专有名词

flag 标志  

alias 别名  

模式(Patterns):定位主机和主机组

当您通过一个特别命令(ad hoc)或运行一个剧本(playbook)执行 Ansible 时,您必须选择要针对哪个受管节点或组执行。模式允许您针对库存(inventory)中的特定主机和/或组运行命令和剧本。Ansible 模式可以引用单个主机、IP地址、库存组、一组 组或库存中的所有主机。模式非常灵活——您可以排除或要求主机子集,使用通配符或正则表达式,等等。Ansible 在模式中包含的所有库存主机上执行。


使用模式

几乎在执行特别命令或剧本时都要使用模式。模式是特别命令( ad hoc command )中唯一没有标志的元素。其通常是第二个元素:


ansible <pattern> -m <module_name> -a "<module options>"

1.

例如:


ansible webservers -m service -a "name=httpd state=restarted"

1.

⚠️ 注意:


如果 shell 是 zsh,<pattern> 需要用双引号括起来,如下:


✅ ansible “component*” -m ping

❌ ansible component* -m ping ,这个会报错:「zsh: no matches found: component*」

在剧本中,模式是每个剧本的 hosts: 行内容:


- name: <play_name>

 hosts: <pattern>

1.

2.

例如:


- name: restart webservers

 hosts: webservers

1.

2.

由于您经常希望一次针对多个主机运行命令或剧本,因此模式通常引用库存组。特别命令和上面的剧本都将对 webservers 组中的所有机器执行。


常用模式

该表列出了针对库存主机和组的常见模式。


描述 模式 目标

所有主机 all (或 *)  

一台主机 host1  

多台主机 host1:host2 (或 host1,host2)  

一个(主机)组 webservers  

多个(主机)组 webservers:dbservers webservers 组中的所有主机加上 dbservers 中的所有主机

排除(主机)组 webservers:!atlanta 在 webservers 且不在 atlanta 组中的所有主机

组的交集 webservers:&staging 既在 webservers 又在 staging 中的所有主机

✍️ 笔记:


可以使用逗号(,)或冒号(:)分隔主机列表。在处理范围和 IPv6 地址时,首选逗号。


一旦你知道了基本的模式,你就可以把它们组合起来。举个例子:


webservers:dbservers:&staging:!phoenix

1.

针对 “webservers” 组和 “dbservers” 组中所有也在 “staging” 组中的机器,除了 “phoenix” 组中的机器。


您可以对 FQDN 或 IP 地址使用通配符模式,只要目录中的主机是通过 FQDN 或 IP 地址命名的:


192.0.\*

\*.example.com

\*.com

1.

2.

3.

你可以同时混合通配符模式和组:


one*.com:dbservers

1.

模式的限制

模式取决于库存。如果一个主机或组没有列在你的目录中,你不能使用模式来锁定它。如果你的模式包含一个 IP 地址或主机名,但没有出现在库存中,你会看到这样的错误:


[WARNING]: No inventory was parsed, only implicit localhost is available

[WARNING]: Could not match supplied host pattern, ignoring: *.not_in_inventory.com

1.

2.

您的模式必须与库存语法匹配。如果将主机定义为别名:


atlanta:

 host1:

   http_port: 80

   maxRequestsPerChild: 808

   host: 127.0.0.2

1.

2.

3.

4.

5.

您必须在模式中使用别名。在上面的示例中,必须在模式中使用 host1。如果你使用 IP 地址,你将再次报错:


[WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2

1.

高级模式选项

上面描述的通用模式将满足您的大多数需求,但是 Ansible 提供了其他几种方法来定义您想要目标的主机和组。


在模式中使用变量

你可以通过 -e 参数使用变量来向 ansible-playbook 传递组说明符:


webservers:!{{ excluded }}:&{{ required }}

1.

在模式中使用组位置

可以根据主机在组中的位置定义主机或主机子集。例如,给定下列组:


[webservers]

cobweb

webbing

weber

1.

2.

3.

4.

您可以使用下标来选择单独的主机或范围内的 webservers 组:


webservers[0]       # == cobweb

webservers[-1]      # == weber

webservers[0:2]     # == webservers[0],webservers[1]

                   # == cobweb,webbing

webservers[1:]      # == webbing,weber

webservers[:3]      # == cobweb,webbing,weber

1.

2.

3.

4.

5.

6.

在模式中使用正则

你可以以 ~ 开头,指定一个模式作为一个正则表达式:


~(web|db).*\.example\.com

1.

模式和 ansible-playbook 标志

您可以使用命令行选项更改剧本中定义的模式的行为。例如,可以通过指定 -i 127.0.0.2, (注意末尾的逗号),在单个主机上运行一个定义了所有主机的剧本。即使你的目标主机没有在你的库存中定义,这也可以工作。你也可以使用 --limit 标志来限制你的目标主机:


ansible-playbook site.yml --limit datacenter2

1.

最后,您可以使用 --limit 从文件中读取主机列表,方法是在文件名前加上 @ 前缀:


ansible-playbook site.yml --limit @retry_hosts.txt

1.

如果 RETRY_FILES_ENABLED 设置为 True, ansible-playbook 运行后将创建一个 .retry 文件,其中包含所有剧本中失败的主机列表。每次 ansible-playbook 运行结束时,该文件都会被覆盖。


ansible-playbook site.yml –limit @site.retry

1.

要使用 Ansible 命令和脚本应用您的模式知识,请阅读 特别命令介绍和 脚本介绍。