Ansible架构与核心概念
配置管理是DevOps体系中基础设施自动化的关键环节。Ansible采用无Agent架构,通过SSH连接目标主机执行任务,无需在目标机器安装客户端,降低了运维复杂度和安全风险。核心组件包括Inventory(主机清单)、Playbook(任务编排)、Module(执行单元)和Role(角色复用)。Ansible的幂等性保证同一Playbook多次执行结果一致,不会产生重复操作,这是区别于Shell脚本的核心特性。批量管理数百台服务器时,幂等性确保配置漂移可自动纠正。
Inventory主机清单管理
Inventory定义了Ansible管理的目标主机和分组。生产环境通常按功能角色分组,支持动态Inventory从CMDB或云API获取主机列表。
[web_servers]
web01 ansible_host=10.0.1.11 ansible_user=deploy
web02 ansible_host=10.0.1.12 ansible_user=deploy
web03 ansible_host=10.0.1.13 ansible_user=deploy
[db_servers]
db01 ansible_host=10.0.2.11 ansible_user=deploy
db02 ansible_host=10.0.2.12 ansible_user=deploy
[prod:children]
web_servers
db_servers
[prod:vars]
ansible_python_interpreter=/usr/bin/python3
ntp_server=ntp.aliyun.com
Playbook编写与任务编排
Playbook是Ansible的核心执行单元,使用YAML描述任务序列。以下是一个完整的Nginx部署Playbook:
---
- name: 部署Nginx Web服务器
hosts: web_servers
become: yes
vars:
nginx_version: "1.25.3"
nginx_workers: "auto"
max_clients: 2048
tasks:
- name: 安装依赖包
yum:
name:
- gcc
- make
- pcre-devel
- openssl-devel
state: present
- name: 下载并解压Nginx源码
unarchive:
src: "https://nginx.org/download/nginx-{{ nginx_version }}.tar.gz"
dest: /usr/local/src
remote_src: yes
creates: "/usr/local/src/nginx-{{ nginx_version }}"
- name: 编译安装Nginx
shell: |
cd /usr/local/src/nginx-{{ nginx_version }}
./configure --with-http_ssl_module --with-http_v2_module --prefix=/usr/local/nginx
make -j$(nproc) && make install
args:
creates: /usr/local/nginx/sbin/nginx
- name: 配置Nginx
template:
src: nginx.conf.j2
dest: /usr/local/nginx/conf/nginx.conf
validate: /usr/local/nginx/sbin/nginx -t -c %s
notify: restart nginx
- name: 启动Nginx服务
systemd:
name: nginx
state: started
enabled: yes
handlers:
- name: restart nginx
systemd:
name: nginx
state: restarted
Role角色复用与项目结构
复杂项目通过Role实现模块化复用。标准Role目录结构包含tasks、handlers、templates、files、vars、defaults等子目录。使用ansible-galaxy初始化Role:
ansible-galaxy init roles/nginx
ansible-galaxy init roles/mysql
ansible-galaxy init roles/java
顶层Playbook组织多角色部署:
---
- name: 全栈环境部署
hosts: all
become: yes
roles:
- role: common
tags: [common, base]
- role: java
when: "'java_apps' in group_names"
- role: nginx
when: "'web_servers' in group_names"
- role: mysql
when: "'db_servers' in group_names"
Jinja2模板与变量管理
Jinja2模板引擎支持条件判断、循环和过滤器,用于生成差异化配置文件。Nginx配置模板示例:
# templates/nginx.conf.j2
worker_processes {{ nginx_workers }};
worker_rlimit_nofile {{ max_clients * 2 }};
events {
worker_connections {{ max_clients }};
use epoll;
multi_accept on;
}
http {
{% for server in nginx_vhosts %}
server {
listen {{ server.port }};
server_name {{ server.name }};
root {{ server.root }};
location / {
proxy_pass http://{{ server.upstream }};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
{% endfor %}
}
多环境变量隔离通过group_vars实现,dev和prod使用不同的参数值,同一Playbook适配多环境部署。
Ansible执行策略与并行控制
大批量主机执行时,通过forks参数控制并行度,serial控制滚动批次:
# ansible.cfg
[defaults]
forks = 20
host_key_checking = False
timeout = 30
pipelining = True
# Playbook中控制滚动更新
- name: 滚动更新Web集群
hosts: web_servers
serial: 2
max_fail_percentage: 25
strategy: free
pipelining开启后,Ansible将多个模块调用合并到单次SSH连接中执行,减少连接开销,批量部署效率提升约30%。strategy设为free时各主机独立执行不等彼此,进一步提升并行效率。serial设为2表示每次只更新2台主机,配合max_fail_percentage可在异常时自动中止滚动更新,避免大面积故障。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/pei-zhi-guan-li-zi-dong-hua-shi-zhan-ansible-pi-liang-bu/