Ansible 的配置文件采用 INI 格式,分为多个模块,每个模块包含特定功能的配置参数。
以下是ansible.cfg配置文件中对各部分的详细解析:
[defaults](全局默认配置)
inventory
指定主机清单文件路径,默认值为 /etc/ansible/hosts。若取消注释,Ansible 会从此文件读取主机信息。
#inventory = /etc/ansible/hosts
remote_user
默认远程登录用户(如 root)。若未在 Playbook 中指定 remote_user,则使用此值。
#remote_user = root
host_key_checking
是否验证 SSH 主机密钥。默认启用(True)。禁用需取消注释并设为 False(适用于测试环境):
#host_key_checking = False
forks
并发任务数,默认 5。增大此值可提升执行效率(需根据控制机性能调整)。
#forks = 5
gathering
控制是否自动收集主机信息(facts)。默认 implicit(隐式收集,可通过 gather_facts: False 关闭)。
#gathering = implicit
roles_path
指定 Ansible 角色的搜索路径(支持多路径,用 : 分隔)。
#roles_path = /etc/ansible/roles
log_path
指定日志文件路径,默认不记录日志。取消注释后启用日志:
#log_path = /var/log/ansible.log
module_name 默认模块(如 command、shell)
module_name = shell
private_key_file 默认 SSH 私钥路径
private_key_file = ~/.ssh/id_rsa
vault_password_file Vault 密码文件路径
vault_password_file = ~/.vault_pass
display_skipped_hosts 是否显示跳过的任务
display_skipped_hosts = False # 默认True
hash_behaviour 变量冲突时的行为(replace 或 merge)
hash_behaviour = merge 默认replace
nocows 禁用 cowsay 动画 默认0
nocows = 1
nocolor 禁用输出颜色 默认0
nocolor = 1
fact_caching 缓存 Facts 的存储类型(如 jsonfile、redis)
fact_caching = jsonfile # 默认memory
fact_caching_connection 缓存存储路径(如 Redis 为 localhost:6379:0)
fact_caching_connection = /tmp/facts
[inventory](主机清单配置)
enable_plugins
指定启用的清单插件,默认包括 host_list, script, auto 等。可添加自定义插件(如 virtualbox)。
#enable_plugins = host_list, virtualbox, yaml, constructed
ignore_extensions
解析目录作为清单源时,忽略指定扩展名的文件。
#ignore_extensions = .pyc, .pyo, .swp, .bak, ~, .rpm, .md, .txt
ignore_patterns 忽略的文件匹配模式 默认空
ignore_patterns = test_*
unparsed_is_failed 未解析的清单文件是否报错 默认False
unparsed_is_failed = True
[privilege_escalation](权限提升配置)
become
是否启用权限提升(如 sudo)。默认 True。
#become = True
become_method
提升权限的方式(如 sudo、su)。
#become_method = sudo
become_user
提升权限后的用户(默认 root)。
#become_user = root
become_ask_pass
是否在权限提升时提示输入密码。默认 False。
#become_ask_pass = False
[paramiko_connection]
[ssh_connection](SSH 连接优化)
ssh_args
SSH 连接参数。默认启用 ControlPersist 提升性能:
#ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
pipelining
启用管道传输以提升性能。需确保目标主机的 sudoers 文件禁用 requiretty。
#pipelining = False # 改为 True 启用
retries
SSH 连接失败后的重试次数(默认 3 次)。
#retries = 3
transfer_method
文件传输方式(sftp、scp、piped)默认smart
transfer_method = sftp
[persistent_connection](持久连接配置)
connect_timeout
持久连接的空闲超时时间(默认 30 秒)。
#connect_timeout = 30
command_timeout
单条命令的超时时间(默认30秒)
command_timeout = 60
[accelerate](加速模式配置)
accelerate_port 加速模式端口
accelerate_port = 6000 # 默认5099
accelerate_timeout 加速连接超时时间(秒)
accelerate_timeout = 60 # 默认30
accelerate_multi_key 允许多个密钥
accelerate_multi_key = yes # 默认 no
[selinux](SELinux 配置)
special_context_filesystems 需要特殊处理的文件系统,默认nfs, vboxsf, fuse, ramfs, 9p, vfat
special_context_filesystems = cifs
libvirt_lxc_noseclabel 允许 libvirt_lxc 无 SELinux 标签,默认no
libvirt_lxc_noseclabel = yes
[colors](输出颜色配置)
自定义不同日志级别的颜色(如错误信息为红色):
#error = red
#ok = green
[diff](差异显示配置)
always
是否始终显示文件差异(等同于命令行参数 -D)。
#always = no # 改为 yes 启用
context 差异显示的上下文行数
context = 3 # 默认
常见配置场景
禁用 SSH 主机密钥检查(适用于测试环境):
[defaults]
host_key_checking = False
启用管道传输优化性能:
[ssh_connection]
pipelining = True
配置默认权限提升:
[privilege_escalation]
become = True
become_method = sudo
become_user = root
总结
优先级:Ansible 配置按以下顺序加载(优先级从高到低):
环境变量 ANSIBLE_CONFIG
当前目录的 ansible.cfg
用户家目录的 .ansible.cfg
/etc/ansible/ansible.cfg
建议:在项目目录中创建 ansible.cfg,覆盖全局配置,避免修改系统级文件。
以下是hosts文件中对各部分的详细解析:
Ansible 的主机清单文件(Inventory File)用于定义被管理的主机和组,支持灵活的主机分组、模式匹配及变量定义。以下是对配置文件的逐部分解析:
1.基础结构
文件路径:默认路径为 /etc/ansible/hosts,但可通过 ansible.cfg 或命令行参数自定义。
注释与空白行:以 # 开头的行是注释,空白行会被忽略。
2.未分组的主机
直接在文件顶部列出主机(不归属任何组):
# green.example.com
# blue.example.com
# 192.168.100.1
# 192.168.100.10
取消注释后,这些主机会被 Ansible 识别,但无组归属。
3.分组主机
使用 [组名] 定义组,组内列出主机名或 IP:
# [webservers]
# alpha.example.org
# beta.example.org
# 192.168.1.100
# 192.168.1.110
取消注释后,组 webservers 包含 4 台主机。
作用:可针对组执行任务(如 ansible webservers -m ping)。
4.主机范围模式
使用 [start:end] 简化连续主机的定义:
# www[001:006].example.com
实际解析为:
www001.example.com, www002.example.com, …, www006.example.com。
支持格式:数字填充(如 001 表示 3 位补零),也支持无前导零(见下方示例)。
5.无前导零的主机范围
直接使用数字区间:
# db-[99:101]-node.example.com
实际解析为:
db-99-node.example.com, db-100-node.example.com, db-101-node.example.com。
6.高级用法(需手动添加)
用户示例
未展示,但以下功能是 Ansible 支持的:
嵌套组:
使用 :children 定义父组包含子组:
[web:children]
webservers
loadbalancers
变量定义:
为组或主机设置变量:
[webservers]
web1.example.com ansible_user=admin
[dbservers:vars]
db_port=3306
动态清单:
通过脚本或云平台 API 动态生成主机清单(需可执行文件返回 JSON 格式)。
7.示例配置(取消注释后)
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57# 使用主机范围
www[001:003].example.com
db-[99:101]-node.example.com
Ansible内置变量:
示例:
[webservers]
web1.example.com ansible_ssh_pass='your_password'
web2.example.com ansible_ssh_pass='your_password'
8.常见问题与注意事项
1.主机范围语法:
格式必须为 [start:end],支持数字和字母(如 web[a:d].example.com 生成 weba 到 webd)。
补零操作:www[01:05].example.com 生成 www01, www02, …, www05。
2.组与变量优先级:
主机变量 > 组变量 > 父组变量 > 全局变量。
3.动态清单:
更适合云环境,可通过 ansible-inventory -i dynamic_inventory.py --list 测试。
4.别名与端口:
定义别名和指定 SSH 端口:
jump ansible_host=192.168.1.200 ansible_port=2222
9.验证清单
使用命令检查主机清单是否正确解析:
ansible-inventory -i hosts.cfg --list
rules目录的的主要作用及示例
一、Roles 的主要作用
Ansible Roles 是一种模块化设计模式,用于将 Playbook 拆解为可复用的组件。其主要作用包括:
1.代码组织
将任务、变量、文件、模板等按功能分类,形成标准化的目录结构,提升代码可读性。
2.复用性
同一 Role 可在多个 Playbook 中重复使用,避免重复编写相似代码。
3.协作友好
通过 Roles 分离不同功能模块,便于团队分工开发和维护。
4.变量与逻辑分离
将配置变量(如端口、路径)与任务逻辑解耦,增强灵活性。
5.易于扩展
支持依赖管理(通过 meta/main.yml),可定义 Role 之间的依赖关系。
二、Roles 的标准目录结构
一个完整的 Role 目录通常包含以下子目录和文件(以 roles/nginx 为例):
roles/
└── nginx/ # Role 名称├── tasks/ # 任务定义│ └── main.yml # 主任务文件├── handlers/ # 触发器(服务重启等)│ └── main.yml├── templates/ # Jinja2 模板文件│ └── nginx.conf.j2├── files/ # 静态文件(无需模板渲染)│ └── custom_404.html├── vars/ # 角色专用变量│ └── main.yml├── defaults/ # 默认变量(优先级最低)│ └── main.yml├── meta/ # 角色元数据(依赖、作者等)│ └── main.yml└── README.md # 角色说明文档
三、Roles 示例:部署 Nginx
1.目录结构
roles/
└── nginx/├── tasks/│ └── main.yml├── handlers/│ └── main.yml├── templates/│ └── nginx.conf.j2└── defaults/└── main.yml
2.关键文件内容
tasks/main.yml(核心任务)
- name: Install Nginxapt:name: nginxstate: present- name: Copy Nginx configurationtemplate:src: nginx.conf.j2dest: /etc/nginx/nginx.confnotify: restart nginx- name: Ensure Nginx is runningservice:name: nginxstate: startedenabled: yes
handlers/main.yml(触发器)
- name: restart nginxservice:name: nginxstate: restarted
templates/nginx.conf.j2(模板文件)
user www-data;
worker_processes {{ nginx_worker_processes }};
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;events {worker_connections {{ nginx_worker_connections }};
}
defaults/main.yml(默认变量)
nginx_worker_processes: 2
nginx_worker_connections: 1024
四、使用 Role 的 Playbook
在 Playbook 中引用 Role(site.yml):
- hosts: webserversroles:- role: nginxvars:nginx_worker_processes: 4 # 覆盖默认变量