Ansible 是一款基于 Python 开发的开源自动化运维工具,主要用于实现服务器配置管理、应用部署、任务自动化执行等功能。它通过 简单的 YAML 脚本(Playbook) 定义任务,结合 SSH 协议 对远程主机进行管理,无需在被控节点安装额外代理程序,具有轻量、易上手、模块化等特点。
shell
、copy
、yum
)和自定义模块,通过 SSH 推送至被管理节点执行。selinux
模块用于配置 SELinux 模式,copy
模块用于文件拷贝。常用模块:
模块名称 | 功能描述 | 示例代码 |
---|---|---|
command | 执行 shell 命令(不支持 $ 符号) | ansible all -m command -a “date” |
shell | 执行 shell 命令(支持脚本) | ansible all -m shell -a “sh /script.sh” |
copy | 复制文件到远程主机 | copy: src=/local/file dest=/remote/file |
yum/apt | 软件包管理 | yum: name=nginx state=latest |
service | 管理系统服务 | service: name=nginx state=restarted |
/etc/ansible/hosts
,支持分组嵌套和变量继承。#可以按照范围指定主机,一组相似的hostname []是匹配
[webservers]
www[01:50].example.com # 批量定义主机
[dbservers]
db-[a:f].example.com # 范围匹配
- hosts: webservers
tasks:
- name: 安装 Nginx
yum: name=nginx state=present
- name: 启动服务
service: name=nginx state=started
nginx
角色包含安装、配置、启动任务)。role_name/
├── tasks/ # 主要任务
├── handlers/ # 事件处理器
├── templates/ # Jinja2 模板文件
├── files/ # 静态文件
├── vars/ # 变量
├── defaults/ # 默认变量
└── meta/ # 依赖和元数据
- hosts: webservers
roles:
- geerlingguy.nginx # 直接引用 Galaxy 下载的角色
6. Plugins(插件)
7. Variables(变量)
用于动态传递参数,支持在 Playbook、Inventory、命令行中定义。
vars:
app_port: 8080
8.Facts(主机信息)
Ansible 自动收集的远程主机信息(如 IP 地址、操作系统版本等),可直接在 Playbook 中使用。
- debug:
var: ansible_distribution # 输出主机操作系统名称
-
开头,每个元素占一行:fruits:
- Apple
- Orange
key: value
,支持缩进或紧凑格式:user:
name: John
job: Developer
# 紧凑格式
{name: John, job: Developer}
{{ var_name }}
引用变量,包含特殊符号时需用引号包裹:message: "Hello, {{ username }}!"
---
开头,缩进严格(空格而非制表符)。yes/no
、true/false
(不区分大小写)。yum -y install ansible
ansible.cfg
[defaults]
inventory = /etc/ansible/hosts # 主机清单路径
host_key_checking = False # 禁用 SSH 密钥验证
remote_user = root # 默认远程用户
主机清单配置
vi /etc/ansible/hosts
这些变量可以给 /usr/bin/ansible-playbook 使用,但不能给 /usr/bin/ansible 使用。
[webservers]
host1 ansible_ssh_port=2222 # 可单独给某主机自定义端口、用户等信息
# 组变量定义方式
#通过对atlanta组指定vars变量,相应的host1和host2相当于相应的指定了ntp_server和proxy变量参数值
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
可以把一个组作为另一个组的子成员:
[atlanta] #定义atlanta
host1
host2
[raleigh] #定义raleigh
host2
host3
[southeast:children] #把atlanta、raleigh加入southeast组
atlanta
raleigh
ansible all -m ping
ansible webservers -m shell -a "df -h"
ansible webservers -m copy -a "src=/local/file dest=/remote/path mode=0644"
ansible webservers -m script -a "/local/script.sh"
ansible-playbook /path/to/playbook.yaml
- hosts: webservers
tasks:
- name: 安装依赖
yum: name=epel-release state=present
- name: 部署代码
copy: src=/code dest=/var/www/html
ansible_connection=local
(本地执行)。ansible-playbook --extra-vars "var=value"
临时传参。register
捕获命令结果,结合 failed_when
判断任务失败条件:- shell: /usr/local/nginx/sbin/nginx -t
register: nginx_check
failed_when: "'failed' in nginx_check.stderr"
--sudo
或 become
提升权限:ansible webservers -m yum -a "name=nginx state=present" --sudo
- /etc/ansible:
inventory:
- 项目1:
- hosts # 主机清单列表文件
- ansible.cfg # 环境配置变量文件
- group_vars # 组变量目录
- host_vars # 主机变量目录
- *.yaml # 项目1的 play-book文件
- 项目2:
- hosts # 主机清单列表文件
- ansible.cfg # 环境配置变量文件
- group_vars # 组变量目录
- host_vars # 主机变量目录
- *.yaml # 项目2的 play-book文件
在 Ansible 中启用 SSH 多路复用和流水线(pipelining)可以显著提升大量主机并行操作时的性能。这两项优化分别通过减少 SSH 连接开销和简化模块执行流程来加速任务执行。
A. SSH 多路复用(SSH Multiplexing)
SSH 多路复用允许 Ansible 在已建立的 SSH 连接上复用会话,避免为每个任务重新建立连接(开销约 200-500ms)
创建 SSH 配置文件(通常位于 ~/.ssh/config
或 /etc/ssh/ssh_config
):
Host *
ControlMaster auto
ControlPersist 600 # 连接保持 10 分钟
ControlPath ~/.ssh/mux-%r@%h:%p
ControlMaster auto:自动创建主连接
ControlPersist:控制连接的持续时间(秒)
ControlPath:套接字文件路径,需保证用户有读写权限
在 Ansible 配置中启用(ansible.cfg):
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=600s
B. 流水线(Pipelining)
默认情况下,Ansible 执行模块时需先将模块文件复制到远程主机,再执行。
启用流水线后,模块直接通过 SSH 管道执行,减少文件传输开销。
在 ansible.cfg 中添加:
[ssh_connection]
pipelining = True
sudo 权限限制:若使用 become: true(sudo),需在目标主机的 /etc/sudoers 中添加:
Defaults !requiretty
Defaults visiblepw
组合优化的完整配置示例:
# ansible.cfg
[defaults]
forks = 50 # 并行连接数
host_key_checking = False # 关闭主机密钥检查(生产环境建议保留)
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=600s -o ServerAliveInterval=30 -o ServerAliveCountMax=10
pipelining = True
control_path = ~/.ansible/cp/%%h-%%p-%%r # 复用连接的套接字文件存储位置
7. Ansible Galaxy
如果你需要将一个开源系统部署到你的主机上,很有可能有人已经实现了相应的Role.
Ansible Galaxy 是 Ansible 官方的 共享平台,用于发布和下载可重用的 角色(Roles) 和 集合(Collections)。
目录结构:
role_name/
├── tasks/ # 主要任务
├── handlers/ # 事件处理器
├── templates/ # Jinja2 模板文件
├── files/ # 静态文件
├── vars/ # 变量
├── defaults/ # 默认变量
└── meta/ # 依赖和元数据
你可以在Ansible Galaxy的网站(https://galaxy.ansible.com/)浏览所有Role
scp
命令(非 Ansible 模块):scp -r [email protected]:/remote/dir /local/path
fetch
模块从远程拉取文件(Playbook 中使用):- name: 拉取远程文件
fetch:
src: /remote/file.txt
dest: /local/downloads/
flat: yes # 不保留远程目录结构
通过 Ansible,运维人员可以大幅提升工作效率,开发人员也能更便捷地管理基础设施,实现 “基础设施即代码”(Infrastructure as Code, IaC)的理念。