Skip to content

Ansible 之旅(三) Ansible Inventory

Inventory 概念

Inventory 是一个文本文件,默认存放在 /etc/ansible/hosts中,在里面定义了 Ansible 管理的主机的集合,这些主机称之为托管主机。为了更好的管理,这些托管主机可以分配到组中。组可以包含子组,主机可以是多个组的成员。另外在 Inventory 中也可以设置主机变量和主机组变量(在后期讨论变量的时候会详细描述)。
Inventory 主要有两种方式定义:静态清单动态清单

静态 Inventory

静态 Inventory 文件,最简单的方式就是一行写一个主机名或者 IP 地址,如:

web1.example.com
web2.example.com
db1.example.com
db2.example.com
192.0.2.42

为了能够高效便捷的对托管主机进行操作,通常会将托管主机组织成主机组。主机组的名称由([])括起,主机组里面的主机在主机组名下面一行写一个,同样的可以是主机名或 IP 地址,如:

[web-servers]
web1.example.com
web2.example.com

[db-servers]
db1.example.com
db2.example.com

主机是可以同时存在多个组当中。推荐的做法是将主机以不同的方式组织到不同的组当中,当然这取决于主机的角色,物理位置等信息,如:

[web-servers]
web1.example.com
web2.example.com

[db-servers]
db1.example.com
db2.example.com

[east-datacenter]
web1.example.com
db1.example.com

Ansible Inventory 中主机组可以包括主机组,这一类组我们称之为嵌套组,需要在组名后面加上 :children 的后缀。

[web-servers]
web1.example.com
web2.example.com

[db-servers]
db1.example.com
db2.example.com

[app:children]
web-servers
db-servers

在定义组名时,有两个组是始终存在的,最好不要再去定义了:
- all :代表 Inventory 中所有的主机。
- ungrouped :代表没有被分组的主机。
如果在 Inventory 中定义很多主机时,可以定义范围来简化主机列表。在 Inventory 中可以指定主机名或者 IP 的范围来简化 Inventory 。可以指定字母或数字的范围,使用以下语法:
- [START:END]
举个例子:

192.168.[3:8].[0:254]
server[a:z].example.com
2001:db18::[a:f]

测试 Inventory

编写完 Inventory 后,可以使用 ansible 命令进行测试:
ansible hostname/groupname --list-hosts
如果能成功列出主机就说明正确:

$ ansible web1.example.com --list-hosts
  hosts (1):
    web1.example.com

$ ansible web-servers --list-hosts
  hosts (2):
    web1.example.com
    web2.example.com

如果提示以下信息,则表示主机或主机组不在 Inventory 中:

$ ansible web12.example.com --list-hosts
 [WARNING]: Could not match supplied host pattern, ignoring: web12.example.com
 [WARNING]: No hosts matched, nothing to do
  hosts (0):

$ ansible webservers --list-hosts
 [WARNING]: Could not match supplied host pattern, ignoring: webservers
 [WARNING]: No hosts matched, nothing to do
  hosts (0):

覆盖默认 Inventory

Inventory 默认存放在 /etc/ansible/hosts 文件中,但一般不建议使用,而是自定义存放的位置。在运行 ansible 命令时,可以通过选项 --inventory 或者 -i 来指定 inventory 的位置。此外 Inventory 可以是一个文件也可以是一个目录,当它是一个目录的时候,Ansible 会按照数字字母的顺序来进行顺序加载。

动态 Inventory

Inventory 也可以由外部信息来生成,这些外部信息可以是外部数据库,或者使用脚本收集的信息。静态 inventory 很容易编写,但只适合管理小型基础设施。在管理大型基础设施时,机器经常变来变去,此时很难保持静态inventory 不改变。举个例子,通过一个动态 inventory 可以联系你的 AWS 账户,可以查询当前有多少主机,因为 EC2 可能会随时创建或删除,使用静态的 inventory 就没那么可靠。动态脚本可以使用不同的编程语言来编写,如:Python、Java、Shell、Perl 等,但是都需要有执行权限。
一些可用的动态 inventory 脚本,如:
1. 私有云,如 OpenStack
2. 共有云,如 AWS EC2 GCE Rackspace Cloud Azure
3. 混合云,如 CloudForms
4. 虚拟化,如 RHEV Vmware vSphere
5. PAAS 解决方案,如 OpenShift Docker
6. 生命周期管理工具,如 Foreman Spacewalk
7. 主机提供商 , 如 Digital Linode
可在 Ansible Github 项目主页上获取 :https://github.com/ansible/ansible/tree/devel/contrib/inventory
如果没有合适的脚本,可以自己着手进行开发,相关帮助手册可以访问:http://doc.ansible.com/ansible/dev_guide/developing_inventory.html
值得注意的是,如果指定的 Inventory 目录存在动态和静态的 Inventory 的话,假设先加载了静态的 Inventory 但是在里面引用了动态 Inventory 中的主机或主机组,那么需要在静态 Inventory 中进行声明,如果是主机则必须写上,如果是主机组,则定义一个空的主机组即可。


小菜园 原创文章,未经允许,请勿转载!

本文链接: https://www.imxcai.com/devops/ansible/ansible-inventory.html


发表评论

电子邮件地址不会被公开。 必填项已用*标注