介绍
Ansible 是一个现代化的配置管理工具,可简化设置和维护远程服务器的任务,其最简洁的设计旨在让用户快速启动并运行。
在本指南中,我们将展示如何创建库存文件并将服务器组织成组和子组,如何设置主机变量,以及如何使用模式来控制每个主机和每个组执行 Ansible 命令和播放簿。
前提条件
为了遵循这个指南,你将需要:
- One Ansible 控制节点:安装并配置为使用 SSH 键连接您的 Ansible 主机的 Ubuntu 20.04 机器,请确保控制节点具有有 sudo 权限的常规用户和启用防火墙,如我们在 初始服务器设置指南中所解释的那样。
步骤 1 – 创建自定义库存文件
在安装时,Ansible 会创建一个库存文件,通常位于 /etc/ansible/hosts. 这是Ansible 使用的默认位置,当一个自定义库存文件在播放簿或命令执行时没有提供
-i’ 选项时。
尽管您可以轻松使用此文件,但使用项目库存文件是避免在执行命令和播放簿时混合服务器的良好做法。
要开始,访问您的主文件夹,并创建一个新的目录,以保持您的 Ansible 文件:
1cd ~
2mkdir ansible
移动到该目录,并使用您所选择的文本编辑器打开一个新的库存文件. 在这里,我们将使用nano
:
1cd ansible
2nano inventory
您的节点列表,每行有一个服务器,足以设置一个功能库存文件. 主机名和IP地址是可互换的:
1[label ~/ansible/inventory]
2203.0.113.111
3203.0.113.112
4203.0.113.113
5server_hostname
一旦设置了库存文件,您可以使用ansible-inventory
命令验证并获取有关您的 Ansible 库存的信息:
1ansible-inventory -i inventory --list
1[secondary_label Output]
2{
3 "_meta": {
4 "hostvars": {}
5 },
6 "all": {
7 "children": [
8 "ungrouped"
9 ]
10 },
11 "ungrouped": {
12 "hosts": [
13 "203.0.113.111",
14 "203.0.113.112",
15 "203.0.113.113",
16 "server_hostname"
17 ]
18 }
19}
虽然我们没有在库存中设置任何组,但输出显示了2个不同的组,这些组由Ansible自动推断:全部
和未组合
。正如其名称所示,所有
用于指向库存文件中的所有服务器,无论它们是如何组织的。
运行命令和Playbooks与自定义库存
若要使用自定义库存文件运行 Ansible 命令,请使用-i
选项如下:
1ansible all -i inventory -m ping
这将对您自定义库存文件中列出的 所有主机执行ping
模块。
同样,以下是如何使用自定义库存文件执行 Ansible 播放簿:
1ansible-playbook -i inventory playbook.yml
<$>[注] 注:有关如何连接到节点的更多信息,请参阅我们的 如何使用 Ansible指南,因为它展示了更多的连接选项。
到目前为止,我们已经看到如何创建一个基本的库存,以及如何使用它来运行命令和玩本,在下一步,我们将看到如何将节点组织成组和子组。
步骤 2 – 将服务器组织成组和子组
在库存文件中,您可以将服务器组织成不同的群组和子组,除了帮助保持主机的顺序之外,这种做法还将使您能够使用 group variables,这是一种功能,可以极大地简化使用 Ansible 管理 多阶段环境。
以下 INI 格式的库存文件展示了四个组的设置:webservers、dbservers、development 和 production. 你会注意到服务器由两个不同的品质组成:它们的目的(Web 和数据库),以及它们的使用方式(开发和生产)。
1[label ~/ansible/inventory]
2[webservers]
3203.0.113.111
4203.0.113.112
5
6[dbservers]
7203.0.113.113
8server_hostname
9
10[development]
11203.0.113.111
12203.0.113.113
13
14[production]
15203.0.113.112
16server_hostname
如果你用这个库存文件再次运行ansible-inventory
命令,你会看到以下安排:
1[secondary_label Output]
2{
3 "_meta": {
4 "hostvars": {}
5 },
6 "all": {
7 "children": [
8 "dbservers",
9 "development",
10 "production",
11 "ungrouped",
12 "webservers"
13 ]
14 },
15 "dbservers": {
16 "hosts": [
17 "203.0.113.113",
18 "server_hostname"
19 ]
20 },
21 "development": {
22 "hosts": [
23 "203.0.113.111",
24 "203.0.113.113"
25 ]
26 },
27 "production": {
28 "hosts": [
29 "203.0.113.112",
30 "server_hostname"
31 ]
32 },
33 "webservers": {
34 "hosts": [
35 "203.0.113.111",
36 "203.0.113.112"
37 ]
38 }
39}
还可以将多个组合合为 children 在一个父母
组中,然后将父母
称为 metagroup。
1[label ~/ansible/inventory]
2[web_dev]
3203.0.113.111
4
5[web_prod]
6203.0.113.112
7
8[db_dev]
9203.0.113.113
10
11[db_prod]
12server_hostname
13
14[webservers:children]
15web_dev
16web_prod
17
18[dbservers:children]
19db_dev
20db_prod
21
22[development:children]
23web_dev
24db_dev
25
26[production:children]
27web_prod
28db_prod
你拥有的服务器越多,分组或创建替代安排就越有意义,这样你就可以根据需要瞄准更小的服务器组。
步骤 3 – 设置主机名称
您可以使用名称以一种方式命名服务器,以便在运行命令和播放簿时更容易引用这些服务器。
若要使用名称,请在名称后添加一个名为ansible_host
的变量,其中包含应对该名称的服务器的相应 IP 地址或主机名称:
1[label ~/ansible/inventory]
2server1 ansible_host=203.0.113.111
3server2 ansible_host=203.0.113.112
4server3 ansible_host=203.0.113.113
5server4 ansible_host=server_hostname
如果你用这个库存文件运行ansible-inventory
命令,你会看到类似于此的输出:
1[secondary_label Output]
2{
3 "_meta": {
4 "hostvars": {
5 "server1": {
6 "ansible_host": "203.0.113.111"
7 },
8 "server2": {
9 "ansible_host": "203.0.113.112"
10 },
11 "server3": {
12 "ansible_host": "203.0.113.113"
13 },
14 "server4": {
15 "ansible_host": "server_hostname"
16 }
17 }
18 },
19 "all": {
20 "children": [
21 "ungrouped"
22 ]
23 },
24 "ungrouped": {
25 "hosts": [
26 "server1",
27 "server2",
28 "server3",
29 "server4"
30 ]
31 }
32}
请注意,服务器现在是如何被他们的代名称引用,而不是他们的IP地址或主机名称,这使得运行命令和播放簿时更容易瞄准单个服务器。
步骤 4 – 设置主机变量
可以使用库存文件来设置变量,这些变量在连接和执行节点上的命令时会改变Ansible的默认行为。这实际上是我们在上一个步骤中在设置主机名称时所做的。
库存变量可以设置为每个主机或组,除了自定义Ansible的默认设置外,这些变量还可以从您的播放簿中访问,从而为单个主机和组提供进一步的自定义。
下面的示例显示如何在连接到本库文件中列出的每个节点时定义默认的远程用户:
1[label ~/ansible/inventory]
2server1 ansible_host=203.0.113.111 ansible_user=sammy
3server2 ansible_host=203.0.113.112 ansible_user=sammy
4server3 ansible_host=203.0.113.113 ansible_user=myuser
5server4 ansible_host=server_hostname ansible_user=myuser
您还可以创建一个组来汇总具有类似设置的主机,然后在组级别上设置其变量:
1[label ~/ansible/inventory]
2[group_a]
3server1 ansible_host=203.0.113.111
4server2 ansible_host=203.0.113.112
5
6[group_b]
7server3 ansible_host=203.0.113.113
8server4 ansible_host=server_hostname
9
10[group_a:vars]
11ansible_user=sammy
12
13[group_b:vars]
14ansible_user=myuser
这种库存安排将与ansible-inventory
产生以下输出:
1[secondary_label Output]
2{
3 "_meta": {
4 "hostvars": {
5 "server1": {
6 "ansible_host": "203.0.113.111",
7 "ansible_user": "sammy"
8 },
9 "server2": {
10 "ansible_host": "203.0.113.112",
11 "ansible_user": "sammy"
12 },
13 "server3": {
14 "ansible_host": "203.0.113.113",
15 "ansible_user": "myuser"
16 },
17 "server4": {
18 "ansible_host": "server_hostname",
19 "ansible_user": "myuser"
20 }
21 }
22 },
23 "all": {
24 "children": [
25 "group_a",
26 "group_b",
27 "ungrouped"
28 ]
29 },
30 "group_a": {
31 "hosts": [
32 "server1",
33 "server2"
34 ]
35 },
36 "group_b": {
37 "hosts": [
38 "server3",
39 "server4"
40 ]
41 }
42}
请注意,所有库存变量都列在ansible-inventory
产生的 JSON 输出中的_meta
节点中。
步骤 5 – 使用模式来目标执行命令和玩本
在使用 Ansible 执行命令和播放簿时,您必须提供一个目标。 Patterns 允许您在库存文件中瞄准特定主机、组或子组。
请考虑下列库存文件:
1[label ~/ansible/inventory]
2[webservers]
3203.0.113.111
4203.0.113.112
5
6[dbservers]
7203.0.113.113
8server_hostname
9
10[development]
11203.0.113.111
12203.0.113.113
13
14[production]
15203.0.113.112
16server_hostname
现在想象一下,你需要执行一个命令,仅针对正在生产中的数据库服务器(数据库服务器)。在这个示例中,只有server_hostname
匹配了这些标准;然而,你可能有一个大群数据库服务器在该组中。
1ansible dbservers:\&production -m ping
&
字符代表逻辑操作AND
,这意味着有效的目标必须在两个组中。
上面的例子只针对存在于dbservers
和生产
组中的服务器. 如果你想做相反的事情,只针对存在于dbservers
但不存在于生产
组中的服务器,你会使用以下模式:
1ansible dbservers:\!production -m ping
要表示目标必须 **不 **在某一特定组中,您可以使用 !
字符. 再次,我们将 \' 逃避字符包含在表达式中,以避免命令行错误,因为无论是
&还是
!` 都是可由 Bash 解析的特殊字符。
下表包含一些不同的常见模式示例,您可以在使用 Ansible 运行命令和播放簿时使用:
Pattern | Result Target |
---|---|
all | All Hosts from your inventory file |
host1 | A single host (host1 ) |
host1:host2 | Both host1 and host2 |
group1 | A single group (group1 ) |
group1:group2 | All servers in group1 and group2 |
group1:\&group2 | Only servers that are both in group1 and group2 |
group1:\!group2 | Servers in group1 except those also in group2 |
对于更高级的模式选项,例如使用定位模式和regex来定义目标,请参阅 官方 Ansible 文档关于模式。
结论
在本指南中,我们对 Ansible 库存进行了详细的研究,我们已经看到如何将节点组织成组和子组,如何设置库存变量,以及如何使用模式在运行命令和玩本时针对不同的服务器组。
在本系列的下一部分,我们将看到如何使用Ansible ad-hoc命令来管理多个服务器。