#作者:曹付江
掌握Ansible后,你能够干什么?
1)一键部署数百台服务器
2)自动化应用生命周期管理
3)云环境基础设施即代码
4)安全合规自动化审计
5)持续交付流水线集成
6)数据库自动化运维
……
第一阶段:基础入门
1.Ansible 核心概念
1.1什么是 Ansible?
Ansible 是一个开源的自动化平台,主要用于配置管理、应用部署、任务执行和 IT 自动化。
特点:
- 无需代理(Agentless)
- 使用 SSH 作为默认通信方式
- 基于 YAML 的 Playbook 编排语言
- 模块化设计,支持自定义模块
1.2工作原理:
基于SSH的无代理架构,Ansible 控制节点通过 SSH 或 WinRM 连接目标机器,不需要安装客户端
Ansible 工作方式:
- 控制节点:运行 ansible 命令
- 受管主机:通过 SSH/WinRM 执行任务
- 模块:任务单位,如 copy, yum
- 清单文件:定义目标主机
- Playbook:YAML 编排剧本
1.3核心组件:
- Inventory:被管理主机清单
- Playbook:自动化剧本(YAML)
- Module:执行单元(超过3000个内置模块)
- Role:可复用的任务集合
3# 2.环境搭建
2.1 控制节点
系统要求:建议使用 Linux 发行版,如 CentOS、Ubuntu、Debian
# Ubuntu安装
sudo apt update
sudo apt install ansible -y
# 验证安装
ansible --version
2.2 受管主机
确保以下内容:
- Linux 系统
- 已配置 SSH 登录权限
- 控制节点能 SSH 无密码登录(建议使用 SSH key)
2.3 Windows 受管主机(用的少,此处略过)
2.4 网络设备支持
Ansible 支持 Cisco、Juniper、Arista 等,使用 network_cli 插件连接。
3. 第一个Ad-hoc命令
# 编辑主机清单 /etc/ansible/hosts
[web_servers]
192.168.1.101
192.168.1.102
# 测试连接
ansible web_servers -m ping -u root -k
4. Ansible 常用模块
示例列表:
ansible-doc -l | grep copy
示例 1:copy
ansible all -m copy -a “src=/etc/hosts dest=/tmp/hosts”
示例 2:yum
ansible all -m yum -a “name=httpd state=present”
示例 3:service
5. 基础Playbook示例
示例:安装 nginx 并启动
# site.yml
---
- name: 安装Web服务器
hosts: web_servers
become: yes
tasks:
- name: 安装Nginx
apt:
name: nginx
state: present
update_cache: yes
- name: 启动Nginx服务
service:
name: nginx
state: started
enabled: yes
运行Playbook:
ansible-playbook site.yml
第二阶段:进阶实战
1. 变量管理
# 在Playbook中定义变量
vars:
http_port: 8080
admin_email: admin@example.com
# 引用变量
- name: 配置Nginx端口
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
2. Jinja2模板使用
# templates/nginx.conf.j2
server {
listen {{ http_port }};
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
3. 条件与循环
- name: 批量创建用户
user:
name: "{{ item }}"
state: present
groups: sudo
loop:
- alice
- bob
- charlie
- name: 条件部署
apt:
name: git
state: present
when: ansible_os_family == "Debian"
4. 错误处理
Yaml:
- name: 尝试危险操作
command: /bin/false
ignore_errors: yes
register: result
failed_when: "'critical' in result.stderr"
- name: 错误处理
debug:
msg: "操作失败,正在回滚..."
when: result is failed
第三阶段:高级技巧
1. 角色(Roles)开发
创建角色结构:
Bash:
ansible-galaxy init nginx_role
目录结构:
nginx_role/
├── defaults
│ └── main.yml # 默认变量
├── tasks
│ └── main.yml # 主任务
├── templates
│ └── nginx.conf.j2
└── handlers
└── main.yml # 触发器
2. 自定义模块开发
Python:
#!/usr/bin/python3
# library/disk_space.py
def main():
module = AnsibleModule(
argument_spec= dict(mount=dict(required=True))
)
mount = module.params['mount']
free_bytes = os.statvfs(mount).f_bfree * os.statvfs(mount).f_bsize
module.exit_json(
changed=False,
free_gb=round(free_bytes / (1024**3), 1)
)
from ansible.module_utils.basic import *
main()
使用模块:
yaml
- name: 检查磁盘空间
disk_space:
mount: /var
register: disk
3. 动态Inventory
# aws_ec2.py
#!/usr/bin/env python
import boto3
ec2 = boto3.resource('ec2')
groups = {'web': [], 'db': []}
for instance in ec2.instances.all():
if 'WebServer' in instance.tags:
groups['web'].append(instance.public_ip)
elif 'Database' in instance.tags:
groups['db'].append(instance.private_ip)
print(json.dumps(groups))
第四阶段:企业级实践
1. CI/CD集成 (GitLab示例)
Yaml:
# .gitlab-ci.yml
stages:
- test
- deploy
ansible_test:
stage: test
image: python:3.8
script:
- pip install ansible==6.7.0
- ansible-playbook -i staging site.yml --syntax-check
- ansible-lint site.yml
prod_deploy:
stage: deploy
only:
- main
script:
- ansible-playbook -i production site.yml
2. Ansible Tower/AWX管理
架构:
核心功能:
- Web图形化管理
- RBAC权限控制
- 审计日志
- REST API
3. 性能优化
Init:
# ansible.cfg
[defaults]
forks = 50 # 并发数
host_key_checking = False
[ssh_connection]
pipelining = true
control_path = %(directory)s/%%h-%%r
4.实战项目:完整应用部署
# wordpress_deploy.yml
---
- name: 部署WordPress集群
hosts: all
vars:
mysql_root_password: "{{ vault_mysql_root_pass }}"
wp_db_password: "{{ vault_wp_db_pass }}"
roles:
- role: base
- role: nginx
- role: php
- role: mysql
- role: wordpress
post_tasks:
- name: 验证服务状态
uri:
url: http://localhost/wp-admin/install.php
return_content: yes
register: result
until: 'WordPress installation' in result.content
retries: 10
delay: 30
角色组织:
roles/
├── base
│ ├── tasks/main.yml # 基础系统配置
├── nginx
│ ├── templates/nginx.conf.j2
├── mysql
│ ├── tasks/configure.yml
├── php
│ └── tasks/install.yml
└── wordpress
├── tasks/download.yml
└── tasks/configure.yml
其他案例:
- 自动部署 LNMP
- 多节点服务重启
- 自动化用户创建
- 定时备份脚本下发
推荐资源:
- 官方文档:docs.ansible.com
- 书籍:《Ansible: Up and Running》
- 实验环境:Play with Docker (labs.play-with-docker.com)