Ansible清单
在使用Ansible管理多个主机时,需要定义一个清单文件来描述这些主机的列表。Ansible的清单文件可以是静态的,也可以是动态的。以下详细介绍静态清单和动态清单的使用方式,并提供新的举例说明。
静态清单
静态清单文件概述
默认情况下,Ansible使用 /etc/ansible/hosts
文件作为系统的默认静态清单文件。清单文件的作用是告诉Ansible哪些主机需要管理。该文件格式是INI格式,其中可以定义主机名或IP地址,以及主机组。除了默认路径外,清单文件也可以放在系统的任何路径下,不过运行时需要指定其路径,可以使用 --inventory
或 -i
选项来指定。
创建静态清单文件
编辑
/etc/ansible/hosts
文件,添加需要管理的主机:[webservers] server1.example.com server2.example.com 192.168.1.10 [dbservers] db1.example.com db2.example.com 192.168.1.20
在上述配置中,我们定义了两个主机组
webservers
和dbservers
,分别包含了多个主机名或IP地址。也可以将清单文件放在其他路径下,然后在执行命令时指定其路径。例如,将清单文件放在
/home/user/myinventory
:[webservers] server1.example.com server2.example.com 192.168.1.10 [dbservers] db1.example.com db2.example.com 192.168.1.20
使用
-i
选项指定清单文件:ansible all -i /home/user/myinventory --list-hosts
主机组嵌套
Ansible允许创建嵌套的主机组,通过在组名后添加 :children
实现。例如:
[web]
web1.example.com
web2.example.com
[db]
db1.example.com
db2.example.com
[all:children]
web
db
在上述配置中,定义了两个主机组 web
和 db
,并通过 all:children
将两个主机组合并为一个更大的组 all
。
也可以使用简写形式:
[web]
web[1:2].example.com
[db]
db[1:2].example.com
[webdb:children]
web
db
这种方式可以更加简洁地定义多个连续编号的主机。
动态清单
动态清单概述
动态清单文件是一种可执行脚本或程序,它可以动态生成主机列表。这对于那些主机环境变化频繁的场景特别有用。Ansible会调用这个脚本,并解析其输出结果作为清单内容。
创建动态清单文件
编写一个Python脚本作为动态清单文件
dynamic_inventory.py
:#!/usr/bin/env python3 import json def main(): inventory = { "webservers": { "hosts": ["web1.example.com", "web2.example.com", "192.168.1.10"] }, "dbservers": { "hosts": ["db1.example.com", "db2.example.com", "192.168.1.20"] } } print(json.dumps(inventory)) if __name__ == "__main__": main()
在上述脚本中,我们定义了两个主机组
webservers
和dbservers
,并通过输出JSON格式的数据来描述主机列表。赋予脚本可执行权限:
chmod +x dynamic_inventory.py
使用动态清单运行Ansible命令:
ansible all -i ./dynamic_inventory.py --list-hosts
运行Playbook
创建一个简单的Playbook文件
deploy.yml
:--- - name: Deploy web servers hosts: webservers tasks: - name: Install Nginx apt: name: nginx state: present update_cache: yes
使用动态清单运行Playbook:
ansible-playbook -i ./dynamic_inventory.py deploy.yml
清单例子
简单静态清单
在最简单的形式中,INI格式的静态清单文件是受管主机的主机名或IP地址的列表,每行一个:
web1.example.com
web2.example.com
db1.example.com
db2.example.com
192.0.2.42
分组静态清单
通常而言,您可以将受管主机组织为主机组。通过主机组,您可以更加有效地对一系列系统运行Ansible。这时,每一部分的开头为以方括号 []
括起的主机组名称,其后为该组中每一受管主机的主机名或IP地址,每行一个。
在以下示例中,主机清单定义了两个主机组:webservers
和 dbservers
。
[webservers]
web1.example.com
web2.example.com
192.0.2.42
[dbservers]
db1.example.com
db2.example.com
嵌套主机组
通过创建后缀为 :children
的主机组名称来实现,例如:
[web]
web1.example.com
web2.example.com
[db]
db1.example.com
db2.example.com
[all:children]
web
db
在上述配置中,定义了两个主机组 web
和 db
,并通过 all:children
将两个主机组合并为一个更大的组 all
。
也可以使用简写形式:
[web]
web[1:2].example.com
[db]
db[1:2].example.com
[webdb:children]
web
db
这种方式可以更加简洁地定义多个连续编号的主机。
清单验证
在创建或修改清单文件后,可以通过Ansible的命令来验证清单内容是否正确。
查看指定主机组的主机列表:
ansible web --list-hosts
示例输出:
hosts (2): web1.example.com web2.example.com
查看所有主机列表(不包括本地):
ansible all --list-hosts
指定清单文件路径查看主机列表:
ansible all -i /path/to/inventory --list-hosts
查看本地主机列表:
ansible localhost --list-hosts
Ansible的清单文件是管理多个主机的关键,通过定义静态或动态清单文件,可以灵活地组织和管理受管主机。静态清单文件适用于主机数量相对固定的场景,而动态清单文件则适用于主机环境变化频繁的场景。通过清单验证命令,可以确保清单文件的正确性,为后续的自动化操作提供保障。
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。