建立仓库
仓库将托管节点,组织在为 Ansible 提供系统信息及网络位置的中心化文件中。使用仓库文件,Ansible 可以单个命令,管理大量主机。
要完成以下步骤,咱们需要至少一个主机系统的 IP 地址或完全限定域名 (FQDN)。出于演示目的,该主机可以在容器或虚拟机中本地运行。还必须确保咱们的 SSH 公钥,已添加到每台主机上的 authorized_keys
文件中。
译注:译者在 ArchLinux/Manjaro 通过
virt-manager
/Virt-manager,建立了 4 个AlmaLinux 8AlmaLinux 9 的虚拟机实例,用于 Ansible 实验目的。更新:随后发现在针对 AlmaLinux 8 实例运行 Ansible 临时命令时,会报出
MODULE FAILURE: No start of json char found
错误,查询发现这是因为高版本的 Ansible 不再支持 AlmaLinux 8 版本,具体是因为 ArchLinux 8 上 Python 版本为 3.8,而 AlmaLinux 9 上 Python 版本为 3.9。后安装新的 AlmaLinux 9 后,不再报出错误。AlmaLinux 上运行
dnf install epel-release
以安装开启 EPEL。后即可添加其国内镜像源。
请继续 Anisble 的入门,并像下面这样建立一个仓库:
-
在咱们在上一步中创建的
ansible_quickstart
目录中,创建一个名为inventory.ini
的文件; -
把一个新的
[myhosts]
组,添加到inventory.ini
文件,并指定出每个主机系统的 IP 地址或完全限定域名 (FQDN);
[myhosts]
almalinux-6
almalinux-100
almalinux-109
almalinux-213
- 检查咱们的仓库;
> ansible-inventory -i ansible_quickstart/inventory.ini --list
译注: 该命令的输出如下。
{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"ungrouped",
"myhosts"
]
},
"myhosts": {
"hosts": [
"almalinux-6",
"almalinux-100",
"almalinux-109",
"almalinux-213"
]
}
}
- 对咱们仓库中的
myhosts
组,进行ping
操作。
ansible myhosts -u root -m ping -i ansible_quickstart/inventory.ini
注:如果控制节点和托管节点上的用户名不同,请传递
ansible
命令下的-u
选项。
almalinux-100 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3.8"
},
"changed": false,
"ping": "pong"
}
almalinux-213 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3.8"
},
"changed": false,
"ping": "pong"
}
almalinux-109 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3.8"
},
"changed": false,
"ping": "pong"
}
almalinux-6 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3.8"
},
"changed": false,
"ping": "pong"
}
恭喜,咱们已成功建立了一个仓库。
INI 或 YAML 格式的库存
咱们既可以在 INI 文件中,也可以在 YAML 中创建仓库。大多数情况下,例如前面步骤中的示例,对于少量托管节点来说,INI 文件就非常简单且易于读取。
随着托管节点数量的增加,以 YAML 格式创建仓库,就成为一个明智选择。例如,下面就是个与 inventory.ini
等效的,声明了那些托管节点的唯一名称,并使用了 ansible_host
字段:
myhosts:
hosts:
my_host_01:
ansible_host: 192.0.2.50
my_host_02:
ansible_host: 192.0.2.51
my_host_03:
ansible_host: 192.0.2.52
译注:此时运行命令:
ansible-inventory -i ansible_quickstart/inventory.yaml --list
的输出为:
{
"_meta": {
"hostvars": {
"my_host_01": {
"ansible_host": "192.0.2.50"
},
"my_host_02": {
"ansible_host": "192.0.2.51"
},
"my_host_03": {
"ansible_host": "192.0.2.52"
}
}
},
"all": {
"children": [
"ungrouped",
"myhosts"
]
},
"myhosts": {
"hosts": [
"my_host_01",
"my_host_02",
"my_host_03"
]
}
}
相比于等价的 INI 格式仓库的命令输出,可以看出 YAML 格式提供了更多信息。
建立仓库的一些技巧
-
确保组的名字有意义且唯一。组的名字同样区分大小写;
-
组的名字中要避免使用空格、连字符(
-
)和先导数字(比如要使用floor_19
,而不是19th_floor
);
-
要根据主机是什么(What)、位于何处(Where)以及何时存在(When),对清单中的主机进行逻辑分组。
- What
根据拓扑对主机进行分组,例如:
db
、web
、leaf
、spine
。译注:这里的
leaf
、spine
是指 Spine-Leaf 网络拓扑,特指数据中心网络拓扑。spine 有枝干,而 leaf即叶子的字面意思。 参考:- Where
按地理位置对主机进行分组,例如:数据中心、区域、楼层、建筑物。
- When
按阶段对主机进行分组,例如:开发、测试、灰度发布(staging)、生产。
使用元组别
Use metagroups
使用以下语法,创建出对仓库中的多个组,加以组织的元组别:
metagroupname:
children:
下面这个仓库,演示了某个数据中心的基本结构。这个示例仓库,包含着一个包括了所有网络设备的 network
元组别,以及一个包含了 network
组以及全部 Web 服务器的 datacenter
元组别。
leafs:
hosts:
leaf01:
ansible_host: 192.0.2.100
leaf02:
ansible_host: 192.0.2.110
spines:
hosts:
spine01:
ansible_host: 192.0.2.120
spine02:
ansible_host: 192.0.2.130
network:
children:
leafs:
spines:
webservers:
hosts:
webserver01:
ansible_host: 192.0.2.140
webserver02:
ansible_host: 192.0.2.150
datacenter:
children:
network:
webservers:
译注:执行命令
ansible-inventory -i ansible_quickstart/datacenter.yaml --list
的输出如下:
{{#include ../ansible_quickstart/datacenter.json}}
创建变量
变量设置托管节点的一些值,比如 IP 地址、FQDN、操作系统及 SSH 用户等,如此咱们在运行 Ansible 命令时,就无需传递他们了。
变量可以应用于特定主机。
webservers:
hosts:
webserver01:
ansible_host: 192.0.2.140
http_port: 80
webserver02:
ansible_host: 192.0.2.150
http_port: 443
变量也可以应用于某个组别中的全部主机。
webservers:
hosts:
webserver01:
ansible_host: 192.0.2.140
http_port: 80
webserver02:
ansible_host: 192.0.2.150
http_port: 443
vars:
ansible_user: it
译注:此时对于更新后的
ansible_quickstart/inventory_updated.yaml
:
db:
hosts:
almalinux-39:
ansible_host: 192.168.122.39
vars:
db_port: 5432
webservers:
hosts:
almalinux-5:
ansible_host: 192.168.122.5
debian-199:
ansible_host: 192.168.122.199
vars:
http_port: 443
facility:
children:
db:
webservers:
app:
hosts:
almalinux-61:
ansible_host: 192.168.122.61
almalinux-207:
ansible_host: 192.168.122.207
vars:
app_port: 8080
website:
children:
facility:
app:
vars:
ansible_user: hector
执行
ansible website -m ping -i ansible_quickstart/inventory_updated.yaml
,可得到与原先同样的结果。
(End)