一个管理大规模数量Linux服务器的好帮手
1. Ansible核心概念与架构解析
1.1 什么是Ansible?
Ansible是一款基于Python开发的自动化运维工具,采用无代理架构,通过SSH协议进行安全通信,实现批量系统配置、应用部署和任务执行 。其核心特性包括:
- 无代理架构:无需在受管主机上安装任何客户端软件
- 模块化设计:通过模块实现各种运维功能
- 声明式语法:使用YAML语言描述配置状态
- 幂等性:多次执行同一任务结果一致
1.2 Ansible架构组件
| 组件名称 | 功能描述 | 重要性 |
|---|---|---|
| 控制节点 | 运行Ansible的主机,负责任务调度 | 核心组件 |
| 受管主机 | 被Ansible管理的目标服务器 | 管理对象 |
| Inventory | 主机清单,定义受管主机分组 | 配置基础 |
| Modules | 功能模块,执行具体操作 | 功能实现 |
| Playbooks | 任务剧本,描述自动化流程 | 核心配置 |
| Plugins | 插件系统,扩展Ansible功能 | 功能扩展 |
2. 环境搭建与安装配置
2.1 控制节点安装
系统要求:
- Python 2.7 或 3.5+
- 支持的操作系统:Linux、macOS、Windows(WSL)
bash
# Ubuntu/Debian 系统安装
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
# CentOS/RHEL 系统安装
sudo yum install epel-release
sudo yum install ansible
# 验证安装
ansible --version
2.2 受管主机配置
受管主机需要满足以下条件 :
- 支持SSH连接
- 安装Python 2.6+ 或 3.5+
- 配置SSH密钥认证
bash
# 生成SSH密钥对
ssh-keygen -t rsa -b 4096
# 分发公钥到受管主机
ssh-copy-id user@target_host
3. 主机清单(Inventory)配置详解
3.1 基础清单配置
ini
# inventory.ini 基础示例
[web_servers]
web1.example.com ansible_user=ubuntu
web2.example.com ansible_user=ubuntu
web3.example.com ansible_user=ubuntu
[db_servers]
db1.example.com ansible_user=centos
db2.example.com ansible_user=centos
[production:children]
web_servers
db_servers
[all:vars]
ansible_ssh_private_key_file=~/.ssh/id_rsa
3.2 动态清单配置
python
#!/usr/bin/env python3
# dynamic_inventory.py - 动态清单示例
import json
def main():
inventory = {
'web': {
'hosts': ['web1.example.com', 'web2.example.com'],
'vars': {
'http_port': 80,
'max_requests': 1000
}
},
'db': {
'hosts': ['db1.example.com'],
'vars': {
'db_port': 5432
}
},
'_meta': {
'hostvars': {
'web1.example.com': {
'ansible_user': 'ubuntu'
}
}
}
}
print(json.dumps(inventory))
if __name__ == '__main__':
main()
4. 核心模块使用指南
4.1 常用模块分类对比
| 模块类别 | 代表模块 | 主要功能 | 使用场景 |
|---|---|---|---|
| 系统管理 | command, shell, user, group | 执行命令、用户管理 | 基础系统配置 |
| 文件操作 | copy, template, file | 文件传输、模板渲染 | 配置文件部署 |
| 包管理 | yum, apt, pip | 软件包安装管理 | 应用环境搭建 |
| 服务管理 | systemd, service | 服务启停管理 | 服务状态控制 |
| 网络管理 | uri, get_url | HTTP请求、下载 | API调用、文件下载 |
4.2 模块实战示例
yaml
# 模块使用示例playbook
- name: 系统基础配置示例
hosts: web_servers
become: yes
tasks:
# 用户管理模块
- name: 创建运维用户
user:
name: opsuser
groups: sudo
shell: /bin/bash
state: present
# 包管理模块
- name: 安装Nginx
apt:
name: nginx
state: latest
update_cache: yes
# 文件操作模块
- name: 部署Nginx配置
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
notify: restart nginx
# 服务管理模块
- name: 启动Nginx服务
systemd:
name: nginx
state: started
enabled: yes
handlers:
- name: restart nginx
systemd:
name: nginx
state: restarted
5. Playbook编写与高级特性
5.1 Playbook基础结构
yaml
# deploy_webapp.yml - 完整Playbook示例
- name: 部署Web应用
hosts: web_servers
gather_facts: yes
become: yes
vars:
http_port: 8080
app_version: "1.2.3"
tasks:
- name: 安装依赖包
apt:
name: "{{ item }}"
state: present
loop:
- python3
- python3-pip
- git
- name: 创建应用目录
file:
path: "/opt/myapp"
state: directory
owner: "www-data"
group: "www-data"
mode: '0755'
- name: 从Git仓库克隆代码
git:
repo: "https://github.com/example/myapp.git"
dest: "/opt/myapp"
version: "{{ app_version }}"
- name: 安装Python依赖
pip:
requirements: "/opt/myapp/requirements.txt"
virtualenv: "/opt/myapp/venv"
- name: 配置应用服务
template:
src: "templates/myapp.service.j2"
dest: "/etc/systemd/system/myapp.service"
notify: reload systemd
- name: 启动应用服务
systemd:
name: myapp
state: started
enabled: yes
handlers:
- name: reload systemd
systemd:
daemon_reload: yes
5.2 变量管理与使用
yaml
# 变量定义示例
- name: 变量管理演示
hosts: all
vars:
# 直接变量定义
domain_name: "example.com"
max_connections: 1000
# 列表变量
packages:
- nginx
- mysql-client
- python3
# 字典变量
database_config:
host: "localhost"
port: 3306
user: "appuser"
password: "securepassword"
tasks:
- name: 使用变量示例
debug:
msg: "域名: {{ domain_name }}, 最大连接数: {{ max_connections }}"
- name: 循环安装软件包
apt:
name: "{{ item }}"
state: present
loop: "{{ packages }}"
- name: 使用字典变量
template:
src: "db_config.j2"
dest: "/app/db.conf"
5.3 条件判断与循环控制
yaml
# 条件与循环控制示例
- name: 高级任务控制
hosts: web_servers
vars:
deploy_environment: "production"
tasks:
- name: 根据环境部署不同配置
template:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
loop:
- { src: "nginx_prod.conf.j2", dest: "/etc/nginx/nginx.conf" }
- { src: "app_prod.ini.j2", dest: "/etc/myapp/app.ini" }
when: deploy_environment == "production"
- name: 开发环境特殊配置
copy:
src: "dev_config.yml"
dest: "/etc/myapp/config.yml"
when: deploy_environment == "development"
- name: 注册变量使用示例
command: "cat /etc/os-release"
register: os_info
changed_when: false
- name: 根据系统类型执行不同任务
apt:
name: nginx
state: present
when: "'ubuntu' in os_info.stdout"
- name: 错误处理示例
block:
- name: 尝试重启服务
systemd:
name: myapp
state: restarted
rescue:
- name: 重启失败处理
debug:
msg: "服务重启失败,需要手动检查"
always:
- name: 记录执行日志
debug:
msg: "服务管理任务执行完成"
6. 角色(Roles)与代码复用
6.1 角色目录结构
bash
roles/
├── nginx/
│ ├── defaults/
│ │ └── main.yml # 默认变量
│ ├── files/ # 静态文件
│ ├── handlers/
│ │ └── main.yml # 处理器
│ ├── meta/
│ │ └── main.yml # 角色依赖
│ ├── tasks/
│ │ └── main.yml # 主任务
│ ├── templates/ # 模板文件
│ └── vars/
│ └── main.yml # 变量定义
6.2 角色开发示例
yaml
# roles/nginx/tasks/main.yml
- name: 安装Nginx
apt:
name: nginx
state: present
tags: nginx_install
- name: 配置Nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
backup: yes
notify: restart nginx
tags: nginx_config
- name: 启动Nginx服务
systemd:
name: nginx
state: started
enabled: yes
tags: nginx_service
6.3 角色使用与依赖管理
yaml
# site.yml - 使用角色的Playbook
- name: 部署Web基础设施
hosts: web_servers
roles:
- role: common
tags: common
- role: nginx
vars:
nginx_worker_processes: 4
nginx_worker_connections: 1024
tags: nginx
- role: app
vars:
app_port: 8000
tags: app
7. Ansible Galaxy与社区生态
7.1 Galaxy角色使用
bash
# 搜索可用角色
ansible-galaxy search "nginx"
# 安装角色
ansible-galaxy install geerlingguy.nginx
# 使用requirements.yml管理依赖
cat > requirements.yml << EOF
- src: geerlingguy.nginx
version: 3.1.0
- src: geerlingguy.mysql
version: 3.3.0
- src: https://github.com/example/custom-role.git
version: master
EOF
# 批量安装角色
ansible-galaxy install -r requirements.yml
8. 最佳实践与生产环境部署
8.1 目录结构组织
bash
production/
├── inventories/
│ ├── production/
│ ├── staging/
│ └── development/
├── group_vars/
│ ├── all/
│ ├── web_servers/
│ └── db_servers/
├── host_vars/
│ ├── web1.example.com/
│ └── db1.example.com/
├── roles/
│ ├── common/
│ ├── nginx/
│ └── mysql/
├── site.yml
├── webservers.yml
└── dbservers.yml
8.2 安全最佳实践
yaml
# 安全配置示例
- name: 安全加固配置
hosts: all
become: yes
tasks:
- name: 配置SSH安全设置
lineinfile:
path: /etc/ssh/sshd_config
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
loop:
- { regexp: '^#?PasswordAuthentication', line: 'PasswordAuthentication no' }
- { regexp: '^#?PermitRootLogin', line: 'PermitRootLogin no' }
- { regexp: '^#?ClientAliveInterval', line: 'ClientAliveInterval 300' }
notify: restart ssh
- name: 配置防火墙
ufw:
rule: "{{ item.rule }}"
port: "{{ item.port }}"
proto: "{{ item.proto | default('tcp') }}"
loop:
- { rule: allow, port: 22 }
- { rule: allow, port: 80 }
- { rule: allow, port: 443 }
- name: 自动安全更新
apt:
upgrade: dist
update_cache: yes
cache_valid_time: 3600
handlers:
- name: restart ssh
systemd:
name: ssh
state: restarted
9. 高级特性与性能优化
9.1 异步任务与并行执行
yaml
- name: 异步任务示例
hosts: all
strategy: free
serial: 10 # 每次执行10台主机
tasks:
- name: 长时间运行任务
command: "/usr/bin/long_running_script.sh"
async: 300 # 最大运行时间300秒
poll: 30 # 每30秒检查一次
register: async_result
- name: 等待任务完成
async_status:
jid: "{{ async_result.ansible_job_id }}"
register: job_result
until: job_result.finished
retries: 30
delay: 10
9.2 动态变量与事实收集
yaml
- name: 事实收集与使用
hosts: all
gather_facts: yes
tasks:
- name: 显示系统信息
debug:
msg: |
主机名: {{ ansible_hostname }}
操作系统: {{ ansible_distribution }} {{ ansible_distribution_version }}
内存: {{ ansible_memtotal_mb }} MB
处理器: {{ ansible_processor_vcpus }} 核心
- name: 自定义事实收集
setup:
filter: "ansible_*"
register: custom_facts
- name: 基于事实的条件部署
apt:
name: nginx
state: present
when: ansible_os_family == "Debian"
通过系统学习Ansible从基础概念到高级特性的完整知识体系,结合实际的代码示例和最佳实践,可以构建高效、可靠的自动化运维平台。Ansible的声明式语法、幂等特性和丰富的模块生态使其成为现代运维自动化的首选工具 。在实际应用中,建议从简单的任务开始,逐步扩展到复杂的多角色部署,同时注重代码的可维护性和安全性 。