Ansible Inventory 完全指南:主机清单配置详解

Ansible Inventory 配置详解:主机清单管理完全指南

什么是 Inventory

Inventory(主机清单)是 Ansible 管理目标主机的列表。它定义了要管理的主机、分组、连接方式等信息。Ansible 支持多种 Inventory 格式和配置方式。

Inventory 格式

INI 格式

这是最常用的格式,简单直观:

[webservers]
web1.example.com
web2.example.com
192.168.1.10
192.168.1.11

[dbservers]
db1.example.com
db2.example.com

[production:children]
webservers
dbservers

[production:vars]
ansible_user=ansible
ansible_ssh_private_key_file=~/.ssh/ansible_key

YAML 格式

YAML 格式更加结构化,适合复杂配置:

all:
  children:
    webservers:
      hosts:
        web1.example.com:
          ansible_host: 192.168.1.10
        web2.example.com:
          ansible_host: 192.168.1.11
      vars:
        http_port: 80
    dbservers:
      hosts:
        db1.example.com:
        db2.example.com:
      vars:
        db_port: 3306
  vars:
    ansible_user: ansible
    ansible_ssh_private_key_file: ~/.ssh/ansible_key

主机分组

静态分组

[webservers]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11

[webservers:vars]
ansible_user=ansible
ansible_port=2222

嵌套分组

[webservers]
web1
web2

[dbservers]
db1
db2

[appservers]
app1
app2

[production:children]
webservers
dbservers
appservers

主机变量

行内变量

[webservers]
web1 ansible_host=192.168.1.10 ansible_user=ubuntu ansible_port=22
web2 ansible_host=192.168.1.11 ansible_user=ubuntu

组变量

[webservers]
web1
web2

[webservers:vars]
ansible_user=ansible
ansible_ssh_private_key_file=~/.ssh/id_rsa
http_port=80
https_port=443

连接变量

变量 说明 示例
ansible_host 主机地址 192.168.1.10
ansible_port SSH 端口 2222
ansible_user SSH 用户 ansible
ansible_password SSH 密码 secret
ansible_ssh_private_key_file SSH 密钥文件 ~/.ssh/id_rsa
ansible_connection 连接类型 local/ssh/winrm
ansible_python_interpreter Python 路径 /usr/bin/python3
ansible_become 是否提权 true/false
ansible_become_method 提权方式 sudo/su
ansible_become_user 提权用户 root

动态 Inventory

动态 Inventory 可以从云平台、CMDB 等外部来源获取主机信息。

使用 AWS EC2 动态 Inventory

# 安装 AWS 动态 Inventory 插件
pip install boto3 boto

# 创建配置文件
cat > aws_ec2.yml << EOF
plugin: aws_ec2
regions:
  - us-east-1
filters:
  instance-state-name: running
  tag:Environment:
    - production
 keyed_groups:
  - key: tags.Environment
    prefix: env_
  - key: tags.Application
    prefix: app_
EOF

# 使用动态 Inventory
ansible-playbook -i aws_ec2.yml playbook.yml

使用脚本生成 Inventory

#!/bin/bash
# dynamic_inventory.sh

echo '{"webservers": {"hosts": ["web1", "web2"]}}'

# 使脚本可执行
chmod +x dynamic_inventory.sh

# 使用脚本
ansible-playbook -i dynamic_inventory.sh playbook.yml

Inventory 文件位置

Ansible 按以下顺序查找 Inventory 文件:

  1. 命令行指定:-i inventory.ini
  2. 环境变量:ANSIBLE_INVENTORY
  3. 配置文件:ansible.cfg 中的 inventory 选项
  4. 默认位置:/etc/ansible/hosts

测试 Inventory

# 列出所有主机
ansible all -i inventory.ini --list-hosts

# 列出特定组的主机
ansible webservers -i inventory.ini --list-hosts

# 查看主机变量
ansible web1 -i inventory.ini -m setup

# 验证 Inventory 语法
ansible-inventory -i inventory.ini --list

高级技巧

使用通配符和范围

[webservers]
web[01:10].example.com    # web01 到 web10

[dbservers]
db[a:f].example.com        # dba 到 dbf

[appservers]
app[1:3:2]                 # app1, app3(步长为2)

使用变量文件

# inventory.ini
[webservers]
web1
web2

[webservers:vars]
@webservers_vars.yml

webservers_vars.yml:

---
http_port: 80
https_port: 443
document_root: /var/www/html

最佳实践

  • 结构化组织: 按环境、应用、功能等维度分组
  • 使用变量: 避免硬编码,使用变量管理配置差异
  • 版本控制: 将 Inventory 文件纳入 Git 管理
  • 敏感信息加密: 使用 Ansible Vault 加密密码等敏感信息
  • 文档化: 为复杂的 Inventory 结构添加注释

总结

Inventory 是 Ansible 的基础,合理组织和管理 Inventory 对于自动化运维至关重要。通过本文的学习,你已经掌握了 Inventory 的格式、分组、变量管理和动态配置等知识。接下来可以深入学习 Playbook 语法、模块使用等内容。

发表回复

后才能评论