什么是 Ansible Inventory?
- Inventory 是 Ansible 用来定义和管理目标主机的文件或脚本。
- 它列出了 Ansible 需要管理的所有主机,并将这些主机分组,以便于任务分配。
- Inventory 可以是静态文件(如 INI 或 YAML 格式),也可以是动态生成的。
创建静态 Inventory
INI 格式
基本格式
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com
db2.example.com
[webservers]
和[dbservers]
是主机组的名称。- 组名下的每一行列出了属于该组的主机。
添加变量
[webservers]
web1.example.com ansible_port=2222 ansible_user=admin
web2.example.com ansible_port=2200 ansible_user=root
[dbservers]
db1.example.com
db2.example.com
[all:vars]
ansible_ssh_private_key_file=/path/to/private_key
- 为特定主机定义变量,如 SSH 端口 (
ansible_port
) 和用户名 (ansible_user
)。 [all:vars]
定义全局变量,适用于所有主机。
YAML 格式
基本格式
all:
children:
webservers:
hosts:
web1.example.com:
web2.example.com:
dbservers:
hosts:
db1.example.com:
db2.example.com:
- 使用
children
定义子组,hosts
列出每个组中的主机。
添加变量
all:
vars:
ansible_ssh_private_key_file: /path/to/private_key
children:
webservers:
hosts:
web1.example.com:
ansible_port: 2222
ansible_user: admin
web2.example.com:
ansible_port: 2200
ansible_user: root
dbservers:
hosts:
db1.example.com:
- 在 YAML 中也可以为主机和组定义变量。
动态 Inventory
基本概念
- 动态 Inventory 通过脚本或程序生成主机列表,适用于云环境或动态变化的基础设施。
- 常见的动态 Inventory 如 AWS、GCP、Azure 等。
使用 AWS 动态 Inventory 的示例
-
安装依赖
pip install boto3 botocore
-
下载和配置 AWS 动态 Inventory 脚本
wget https://raw.githubusercontent.com/ansible/ansible/stable-2.9/contrib/inventory/ec2.py chmod +x ec2.py
-
运行 Playbook
ansible-playbook -i ec2.py your_playbook.yml
动态 Inventory 的变量配置
- 动态 Inventory 通常通过环境变量或配置文件传递访问凭证(如 AWS 的
AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
)。
Inventory 的高级功能
主机组嵌套和继承
[databases:children]
dbservers
[databases:vars]
ansible_user=dbadmin
- 主机组可以嵌套,子组继承父组的变量。
分组的变量优先级
- 变量优先级:全局变量 < 组变量 < 主机变量 < 命令行指定的变量。
动态变量与主机变量
- 在 Inventory 文件或动态 Inventory 脚本中定义变量。
- 这些变量可在 Playbook 中通过 Jinja2 模板进行引用。
测试和验证 Inventory
使用 ping
模块测试连接
ansible all -m ping -i /path/to/your/inventory/hosts
- 测试所有主机的连接性。
运行 Playbook
ansible-playbook -i /path/to/your/inventory/hosts your_playbook.yml
- 指定 Inventory 文件运行 Playbook。
Inventory 最佳实践
使用分层 Inventory
[development]
dev1.example.com
dev2.example.com
[production]
prod1.example.com
prod2.example.com
[webservers:children]
development
production
- 在大型环境中,分层管理 Inventory 更易维护。
动态与静态 Inventory 混合使用
- 静态 Inventory 管理核心基础设施,动态 Inventory 管理云实例。
使用分组变量
- 避免重复配置,例如统一设置组内所有主机的 SSH 用户名。