还在手动登录一台台服务器进行重复操作吗?Ansible作为开源自动化领域的“扛把子”,能够帮助你实现高效的批量运维。想象一下,为100台服务器部署应用,手动操作可能需要数小时,而Ansible或许只需要一条命令。它究竟有何魅力?
为什么选择 Ansible?
Ansible的核心优势在于其简洁与强大:
- 无代理架构:无需在被管理主机上安装任何客户端软件,降低运维复杂度。
- SSH通信:直接通过SSH协议连接并管理远程主机。
- YAML语法:采用易于阅读和编写的YAML语言来定义自动化任务(Playbook)。
- 幂等性:确保任务重复执行的结果一致,避免意外状态,安全可靠。
安装 Ansible
以下以CentOS/RHEL系统为例,介绍控制节点的安装步骤。
第1步:安装EPEL源
对于CentOS/RHEL系统,需要先安装EPEL扩展源。
yum -y install epel-release
第2步:安装Ansible
通过yum直接安装Ansible。
yum -y install ansible
# 查看版本
ansible --version
# 输出:ansible 2.9.27
第3步:配置SSH免密登录
这是实现自动化管理的关键前提。控制节点需要能够免密登录所有被管理主机。
# 在控制节点执行,生成SSH密钥对(一直按回车使用默认值即可)
ssh-keygen -t rsa
# 将公钥复制到所有被管理主机
ssh-copy-id root@192.168.1.10
ssh-copy-id root@192.168.1.11
ssh-copy-id root@192.168.1.12
基础配置
安装完成后,需要进行一些基础配置。
Ansible配置文件
主要的配置文件有两个:
/etc/ansible/ansible.cfg:主配置文件。
/etc/ansible/hosts:主机清单文件,用于定义你要管理哪些服务器。
配置主机清单
编辑 /etc/ansible/hosts 文件,将你的服务器IP或域名按分组进行定义。
# /etc/ansible/hosts
[web_servers]
192.168.1.10
192.168.1.11
192.168.1.12
[db_servers]
192.168.1.20
192.168.1.21
[all_servers:children]
web_servers
db_servers
修改 ansible.cfg(可选)
根据需求调整主配置文件,例如关闭首次连接时的SSH主机密钥检查。
[defaults]
# 关闭主机密钥检查(避免首次连接手动确认)
host_key_checking = False
# 开启日志记录
log_path = /var/log/ansible.log
# 设置并发数
forks = 100
# 库存文件位置
inventory = /etc/ansible/hosts
测试连通性
配置完成后,使用 ping 模块测试与所有主机的连接是否正常。
# 测试所有主机
ansible all -m ping
# 测试指定分组
ansible web_servers -m ping
如果返回 pong,则表示Ansible控制节点可以成功连接到目标主机。
Ansible 常用模块详解
模块是Ansible执行任务的核心单元。以下介绍10个最常用的模块。
1. ping 模块 — 主机连通性检查
最基础的模块,用于检查主机是否在线且Ansible可连接。
# 单台主机
ansible 192.168.1.10 -m ping
# 分组主机
ansible web_servers -m ping
# 所有主机
ansible all -m ping
2. command / shell 模块 — 执行命令
- command:执行简单命令,不支持管道符、重定向等Shell特性。
# 查看系统负载
ansible web_servers -m command -a "uptime"
# 查看内存使用情况
ansible all -m command -a "free -h"
- shell:在远程主机的Shell环境下执行命令,支持管道、重定向等所有Shell特性。
# 使用管道过滤磁盘信息
ansible all -m shell -a "df -h | grep /dev/sda"
# 写入文件
ansible all -m shell -a "echo 'hello ansible' > /tmp/test.txt"
3. yum / apt 模块 — 软件包管理
-
yum模块:用于CentOS/RHEL等基于RPM的系统。
- name: 安装Nginx
yum:
name: nginx
state: present
- name: 安装多个软件包
yum:
name:
- nginx
- php-fpm
- mariadb
state: present
- name: 确保软件包是最新版本
yum:
name: nginx
state: latest
- name: 卸载软件包
yum:
name: nginx
state: absent
- apt模块:用于Debian/Ubuntu系统。
- name: 安装Nginx
apt:
name: nginx
state: present
update_cache: yes
4. copy 模块 — 文件复制
将本地文件或目录复制到远程主机。
- name: 复制配置文件到远程主机
copy:
src: /local/config/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
- name: 复制整个目录
copy:
src: /local/app/
dest: /opt/app/
owner: app
group: app
mode: '0755'
5. template 模块 — 模板渲染
基于Jinja2模板引擎,将包含变量的模板文件渲染后传输到远程主机,常用于配置文件的动态生成。
- name: 渲染Nginx配置文件
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
模板示例 (nginx.conf.j2):
server {
listen {{ port }};
server_name {{ domain }};
location / {
root {{ web_root }};
}
}
6. file 模块 — 文件/目录管理
用于创建、删除文件或目录,以及管理符号链接和权限。
- name: 创建目录
file:
path: /opt/app
state: directory
mode: '0755'
- name: 创建空文件
file:
path: /opt/app/config.txt
state: touch
mode: '0644'
- name: 创建符号链接
file:
src: /opt/app/current
dest: /opt/app/latest
state: link
- name: 删除文件或目录
file:
path: /opt/app
state: absent
7. user 模块 — 用户管理
用于管理远程主机上的用户账户。
- name: 创建普通用户并加入sudo组
user:
name: deploy
state: present
shell: /bin/bash
groups: sudo
append: yes
- name: 创建系统用户(如用于运行服务)
user:
name: redis
system: yes
shell: /sbin/nologin
create_home: no
- name: 删除用户并移除其主目录
user:
name: deploy
state: absent
remove: yes
8. group 模块 — 用户组管理
用于管理远程主机上的用户组。
- name: 创建用户组
group:
name: developers
state: present
- name: 创建系统组
group:
name: appuser
system: yes
9. service 模块 — 服务管理
用于管理系统的服务(启动、停止、重启、设置开机自启等)。
- name: 启动Nginx服务并设为开机自启
service:
name: nginx
state: started
enabled: yes
- name: 停止PHP-FPM服务
service:
name: php-fpm
state: stopped
- name: 重启Nginx服务
service:
name: nginx
state: restarted
10. setup 模块 — 收集系统信息
收集远程主机的各种系统信息(称为“Facts”),这些信息可以在Playbook中作为变量使用。
# 收集所有主机信息(信息量较大)
ansible all -m setup
# 收集信息并保存到指定目录的文件中
ansible all -m setup --tree /tmp/facts/
# 过滤收集特定的信息(如内存相关)
ansible all -m setup -a "filter=ansible_*_mb"
常用的事实变量示例:
ansible_facts[‘hostname’] — 主机名
ansible_facts[‘default_ipv4’][‘address’] — IPv4地址
ansible_facts[‘memory_total_mb’] — 总内存大小(MB)
ansible_facts[‘distribution’] — 操作系统发行版
Playbook 实战案例
Playbook是将多个任务组织起来的YAML文件,是实现复杂自动化的核心。
案例:一键部署LAMP环境
创建一个名为 lamp.yml 的Playbook。
---
- name: 部署 LAMP 环境
hosts: web_servers
become: yes
tasks:
- name: 安装 Apache
yum:
name: httpd
state: present
- name: 安装 MySQL (MariaDB)
yum:
name: mariadb-server
state: present
- name: 安装 PHP
yum:
name: php,php-mysql
state: present
- name: 启动并启用服务
service:
name: "{{ item }}"
state: started
enabled: yes
loop:
- httpd
- mariadb
- name: 复制PHP配置文件
copy:
src: php.ini
dest: /etc/php.ini
执行该Playbook:
ansible-playbook lamp.yml
模块使用速查表
| 模块 |
功能 |
典型场景 |
| ping |
检查连通性 |
批量检测主机网络可达性 |
| command/shell |
执行命令 |
执行简单的Shell命令或脚本 |
| yum/apt |
包管理 |
安装、更新、卸载软件包 |
| copy |
文件复制 |
分发静态配置文件、应用包 |
| template |
模板渲染 |
分发需要根据变量动态生成的配置文件 |
| file |
文件操作 |
创建、删除、修改文件/目录属性 |
| user |
用户管理 |
创建、删除系统用户,管理用户属性 |
| group |
组管理 |
创建、删除用户组 |
| service |
服务管理 |
启动、停止、重启系统服务 |
| setup |
信息收集 |
收集主机系统信息用于决策或配置 |
总结
通过本文,你已经掌握了Ansible从安装、配置到核心模块使用的全流程。简单回顾一下关键步骤:
- 安装:在控制节点通过包管理器(如yum)安装Ansible。
- 配置:完成SSH免密登录,并编辑主机清单文件定义管理目标。
- 测试:使用
ansible all -m ping 验证基础连通性。
- 使用模块:灵活运用ping、yum、copy、service等模块执行具体任务。
- 编写Playbook:将任务模块组织成YAML文件,实现可重复、复杂的自动化流程。
Ansible就像一把运维的“瑞士军刀”,熟练掌握它,能让你从繁琐的重复操作中解放出来,真正实现高效、可靠的自动化运维。如果你想了解更多运维工具与实践,欢迎在云栈社区与其他开发者交流探讨。