一、主配置文件
主配置文件路径/etc/ansible/ansible.cfg
[defaults] #通用配置项
# 默认Inventory文件路径(主机清单文件)
# inventory = /etc/ansible/hosts
# 远程连接用户(默认当前用户)
# remote_user = root
# 是否提示SSH密码(默认False,建议使用密钥认证)
# ask_pass = False
# 是否检查远程主机SSH密钥(生产环境建议True)
# host_key_checking = False
# 日志文件路径(需确保写入权限)
# log_path = /var/log/ansible.log
# 并行执行任务的工作进程数(默认5)
# forks = 5
# 模块执行超时时间(秒)
# timeout = 10
# 默认模块名称(command/shell等)
# module_name = command
# 是否收集主机facts信息(默认True)
# gathering = smart
# 临时文件存放目录
# remote_tmp = ~/.ansible/tmp
[privilege_escalation] #提权配置项
# 是否启用权限提升(sudo/su等)
# become = True
# 权限提升方式(sudo/su/pbrun等)
# become_method = sudo
# 提升到的目标用户(默认root)
# become_user = root
# 是否提示become密码(默认False)
# become_ask_pass = False
[ssh_connection] #ssh连接的配置项
# 启用SSH管道加速(需目标机sudoers禁用requiretty)
# pipelining = True
# 优先使用SCP而非SFTP传输文件
# scp_if_ssh = True
# SSH连接重试次数
# retries = 3
[persistent_connection] #持久连接配置项
###
ansible连接时需要创建TCP套接字执行SSH任务,当任务结束后就会立即关闭TCP套接字。但是在使用剧本的情况下,就会导致一会关闭一会开启的现象发生,导致资源浪费。所以持久连接,就是创建一个套接字,后续的任务就在一定时间内一直走
###
# 持久化SSH连接超时时间(秒)
# timeout = 30
# 连接保持间隔(秒)
# idle_timeout = 15
[galaxy]
# Ansible Galaxy服务器地址
# server = https://galaxy.ansible.com
# 安装Role时的API密钥
# api_key = xxxxx
[colors]
# 输出颜色配置(成功/失败/警告等)
# highlight = white
# warn = bright purple
# error = red
# ok = green
# changed = yellow
ansible
的所有配置参数都被注释了,因为每个参数都有内置的默认值。用户只需注释并修改需要自定义的配置即可。该设计避免了配置文件的冗余,用户只关注需要覆盖的配置。
二、Ansible 主机清单(静态)及分组
主机清单(Inventory)是 Ansible 的核心配置文件,用于定义管理哪些主机以及如何分组。一个主机可以隶属于多个不同的组。
默认主机清单文件路径:/etc/ansible/hosts
(由/etc/ansible/ansible.cfg
定义)或通过-i
指定自定义文件。
1. 主机清单基本规则
### 主机组以[header]开头,这是主机组的名称
### 可以使用主机名/域名或IP地址标识目标主机
### 没有分组的主机需要在所有的主机组之前定义
1. 默认组
即使主机清单中没有定义任何组,ansible
也会创建两个默认组:
all
:该默认组包含所有主机。ungrouped
:该组包含单独未分组的主机。
例如:
mail.example.com
属于all
和ungrouped
foo.example.com
属于all
和webservers
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
2. 嵌套组(父子组)
在 Ansible 中,可以通过 父子组(嵌套组) 对主机进行分层管理,实现变量继承和批量操作。嵌套组可以嵌套很多个层级。
父组的变量会自动传递给子组,而子组可以覆盖父组的变量(优先级更高)。
在清单文件中,用:children
定义父组,用普通组名作为子组。
[root@ansible1 ~]# vim /etc/ansible/hosts
11.0.1.21
[web_servers]
11.0.1.22
11.0.1.23
[db_servers]
11.0.1.24
[production:children] # production为父组,其下有web_servers、db_servers两个子组
web_servers
db_servers
3. 查看当前组的嵌套关系
[root@ansible1 ~]# ansible-inventory --graph
@all:
|--@production:
| |--@db_servers:
| | |--11.0.1.24
| |--@web_servers:
| | |--11.0.1.22
| | |--11.0.1.23
|--@ungrouped:
| |--11.0.1.21
[root@ansible1 ~]#
2. 定义主机范围
在主机清单中可以通过 数字范围、字母范围 或 通配符 批量定义主机,避免逐个列出 IP/主机名。
1. 数字范围(适用于 IP 或有序主机名)
### 语法
[组名]
主机名前缀[开始:结束:步长] # 步长可省略(默认为1)
### 示例
[web_servers]
192.168.100.[10:14:2] # 等效于 web-1, web-2, web-3
192.168.100.10
192.168.100.12
192.168.100.14
[db_servers]
192.168.100.[13:14] # 生成 db-1, db-3, db-5
2. 字母范围(适用于有序主机名)
[log_servers]
log-[a:d] # 生成 log-a, log-b, log-c, log-d
3. 通配符匹配(模糊匹配主机名)
[all_servers]
*.example.com # 匹配所有以 .example.com 结尾的主机
server-*.mydomain.org # 匹配 server-01.mydomain.org, server-02.mydomain.org 等
3. 主机清单管理
当主机数量庞大(数百/数千台)且环境复杂(混合云、多团队协作)时,可通过以下目录结构和多清单策略实现高效管理:
1. 传递多个主机清单
可以通过命令行传递多个清单参数,或者配置 ANSIBLE_INVENTORY
,来同时定位多个主机清单。
编辑主机清单:
[root@openEuler ~]# cat web_servers
[web_servers]
192.168.100.10
192.168.100.11
[root@openEuler ~]# cat db_servers
[db_servers]
192.168.100.12
192.168.100.13
指定多个主机清单
[root@openEuler ~]# ansible all -m ping -i db_servers -i web_servers
192.168.100.10 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.100.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.100.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.100.13 | SUCCESS => {
"changed": false,
"ping": "pong"
}
2. 在目录中存放主机清单
可以将多个主机清单整合到一个目录中。最简单的形式是使用包含多个文件的目录,而不是单个清单文件。当单个文件变得太长时,维护起来会变得困难。如果你有多个团队和多个自动化项目,为每个团队或项目创建一个清单文件可以让每个人轻松找到对他们重要的 host 和组。
创建目录存放主机清单
[root@openEuler ~]# mkdir /opt/inventroy
[root@openEuler ~]# mv db_servers /opt/inventroy/
[root@openEuler ~]# mv web_servers /opt/inventroy/
指定目录
[root@openEuler ~]# ansible all -m ping -i /opt/inventroy
192.168.100.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.100.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.100.13 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.100.10 | SUCCESS => {
"changed": false,
"ping": "pong"
}
可以直接在
/etc/ansible/ansible.cfg
指定主机清单目录
# ansible.cfg
[defaults]
# 指定清单目录(可以是绝对路径或相对路径)
inventory = /opt/inventroy
ansible --version #检查当前配置是否生效
3. 主机清单加载顺序
Ansible 会按照文件名以 ASCII 顺序加载清单源。
如果你在一个文件或目录中定义了父组,在其他文件或目录中定义了子组,则必须先加载定义子组的文件。如果先加载父组,则会报错:
为了避免这个问题,可以通过向文件添加前缀来控制加载顺序,为了让文件依照一定的顺序排序。
4. 变量
变量是 Ansible 自动化中存储动态值的核心机制,用于实现配置灵活性、环境适配和代码复用。我们可以直接将变量添加到主机清单文件中的host
和组中。
连接控制变量
基础设施变量
命名规范
使用小写+下划线命名法(如
max_retries
)
文档注释
[web_servers:vars]
# 生产环境Nginx配置
nginx_worker_processes=4 # 根据CPU核心数调整
变量优先级
[root@openEuler ~]# vim /etc/ansible/hosts
[web_servers]
192.168.100.10
192.168.100.11
[db_servers]
192.168.100.12 ansible_port=2222 ansible_password=123
192.168.100.13
[db_servers:vars]
ansible_password=Huawei@123
[production:children]
web_servers
db_servers
[production:vars]
ansible_password=12345
[root@openEuler ~]# ansible all -m ping
192.168.100.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.100.10 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.100.13 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.100.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
结论:当定义了不同级别的变量时,优先级为:主机变量>主机组变量>父组变量