文章目录
- [一、自动化运维工具 - Ansible](#一、自动化运维工具 - Ansible)
- [二、Ansible 的基本使用](#二、Ansible 的基本使用)
- [三、Ansible 常用模块说明](#三、Ansible 常用模块说明)
- [四、Ansible 配置文件详解](#四、Ansible 配置文件详解)
- [五、Playbook 介绍与应用](#五、Playbook 介绍与应用)
- [六、使用 Ansible 批量安装部署 Nginx](#六、使用 Ansible 批量安装部署 Nginx)
一、自动化运维工具 - Ansible
Ansible 是一款基于 Python 开发的无代理自动化运维工具,通过 SSH 协议实现对远程服务器的批量管理,无需在被管理节点安装任何客户端软件。它将复杂的运维操作抽象为简单的 "剧本 (Playbook)",支持配置管理、应用部署、任务编排等多种场景。
1、核心特点
- 无代理架构:仅需控制节点安装 Ansible,被管理节点只需开启 SSH 服务
- 声明式语法:使用 YAML 格式编写 Playbook,可读性强
- 幂等性:重复执行相同操作不会产生副作用
- 模块化设计:内置数千个功能模块,覆盖绝大多数运维场景
- 可扩展性:支持自定义模块、插件和角色
2、架构组成
- 控制节点:安装 Ansible 的服务器,执行管理命令和 Playbook
- 被管理节点:需要被管理的远程服务器
- Inventory:主机清单文件,定义被管理节点的分组和信息
- Modules:执行具体操作的功能单元
- Playbook:YAML 格式的任务编排文件
二、Ansible 的基本使用
- 控制节点安装 Ansible(192.168.13.134)
- 从 EPEL 10 开始,原来的完整ansible元包暂时未同步,目前官方仓库只提供ansible-core核心包(包含所有基础功能)
bash
# 安装EPEL仓库(提供额外依赖)
dnf install -y epel-release
# 安装Ansible
dnf install -y ansible
# 验证安装
ansible --version

- 配置 SSH 免密登录
bash
# 为了实现无密码批量操作 需要将控制节点的公钥分发到所有被管理节点
# 生成SSH密钥对(一路回车即可)
ssh-keygen -t ed25519
# 分发公钥到所有节点
ssh-copy-id root@192.168.13.134
ssh-copy-id root@192.168.13.135
ssh-copy-id root@192.168.13.136
# 测试免密登录
ssh root@192.168.13.135 "hostname"
- 配置主机清单 (Inventory)
bash
vim etc/ansible/hosts
bash
# 全局变量
[all:vars]
ansible_user=root
ansible_ssh_port=22
# 定义web服务器组
[webservers]
192.168.13.134
192.168.13.135
192.168.13.136
# 定义数据库服务器组(示例)
[dbservers]
# 192.168.13.137

- 测试节点连通性
bash
# 测试所有节点
ansible all -m ping
# 测试webservers组节点
ansible webservers -m ping
# 测试单个节点
ansible 192.168.13.135 -m ping

三、Ansible 常用模块说明
Ansible 模块是执行具体操作的基本单元,使用格式为:ansible <主机组> -m <模块名> -a "<参数>"
1、命令执行模块


2、软件包管理模块
bash
# 安装软件包
ansible webservers -m dnf -a "name=nginx state=present"
# 卸载软件包
ansible webservers -m dnf -a "name=nginx state=absent"
# 更新所有软件包
ansible webservers -m dnf -a "name=* state=latest"
3、文件管理模块
bash
# 创建目录
ansible webservers -m file -a "path=/data/www state=directory mode=0755 owner=nginx group=nginx"
# 复制本地文件到远程
ansible webservers -m copy -a "src=/root/index.html dest=/usr/share/nginx/html/index.html mode=0644"
# 获取远程文件内容
ansible webservers -m fetch -a "src=/etc/nginx/nginx.conf dest=/tmp/ flat=yes"
# 删除文件或目录
ansible webservers -m file -a "path=/tmp/test.txt state=absent"
4、服务管理模块
bash
# 启动服务并设置开机自启
ansible webservers -m service -a "name=nginx state=started enabled=yes"
# 停止服务
ansible webservers -m service -a "name=nginx state=stopped"
# 重启服务
ansible webservers -m service -a "name=nginx state=restarted"
5、用户管理模块
bash
# 创建用户
ansible webservers -m user -a "name=www shell=/bin/bash home=/home/www"
# 删除用户
ansible webservers -m user -a "name=www state=absent remove=yes"
四、Ansible 配置文件详解
Ansible 的主配置文件为/etc/ansible/ansible.cfg,包含了全局配置参数。以下是最常用的配置项。
从 Ansible 2.12(也就是 ansible-core 时代开始),官方做了一个重大改变:
不再默认提供包含所有配置项的完整文件,所有配置项都有内置默认值,空文件表示 "全部使用默认值"。所以查看ansible.cfg 是空的!
bash
[defaults]
# 主机清单文件路径
inventory = /etc/ansible/hosts
# 默认远程用户
remote_user = root
# 并发连接数
forks = 10
# 关闭SSH主机密钥检查(生产环境建议开启)
host_key_checking = False
# 超时时间(秒)
timeout = 30
# 日志文件路径
log_path = /var/log/ansible.log
# 模块搜索路径
library = /usr/share/ansible/modules
[privilege_escalation]
# 是否开启权限提升
become = True
# 权限提升方式
become_method = sudo
# 权限提升用户
become_user = root
# 是否需要输入密码
become_ask_pass = False
[ssh_connection]
# SSH连接参数
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
# 控制路径
control_path = /tmp/ansible-ssh-%%h-%%p-%%r
五、Playbook 介绍与应用
Playbook 是 Ansible 的核心,它使用 YAML 格式编写,将多个任务组合成一个完整的自动化流程。
- Playbook 基本结构
bash
---
- name: Playbook名称
hosts: 目标主机组
become: yes # 是否使用root权限执行
vars:
# 定义变量
variable1: value1
variable2: value2
tasks:
# 任务列表
- name: 任务1名称
模块名:
参数1: 值1
参数2: 值2
- name: 任务2名称
模块名:
参数1: 值1
- 变量使用
bash
---
- name: 变量使用示例
hosts: webservers
vars:
nginx_port: 80
nginx_docroot: /usr/share/nginx/html
tasks:
- name: 安装Nginx
dnf:
name: nginx
state: present
- name: 配置Nginx端口
lineinfile:
path: /etc/nginx/nginx.conf
regexp: '^ listen 80;'
line: ' listen {{ nginx_port }};'
- 条件判断
bash
---
- name: 条件判断示例
hosts: webservers
tasks:
- name: 仅在Rocky Linux系统上安装Nginx
dnf:
name: nginx
state: present
when: ansible_os_family == "RedHat"
- 执行 Playbook
bash
# 执行Playbook
ansible-playbook playbook.yml
# 检查Playbook语法
ansible-playbook playbook.yml --syntax-check
# 模拟执行(不实际修改)
ansible-playbook playbook.yml --check
# 详细输出执行过程
ansible-playbook playbook.yml -v
六、使用 Ansible 批量安装部署 Nginx
以下是一个完整的 Playbook,实现批量安装、配置、启动 Nginx 并验证服务状态。
- 创建项目目录结构
bash
mkdir -p /etc/ansible/nginx-deploy/{files,templates}
cd /etc/ansible/nginx-deploy
- 准备 Nginx 配置文件
bash
vim files/index.html
bash
<!DOCTYPE html>
<html>
<head>
<title>Ansible部署的Nginx</title>
<style>
body { text-align: center; padding: 50px; font-family: Arial, sans-serif; }
h1 { font-size: 3em; color: #2c3e50; }
p { font-size: 1.5em; color: #34495e; }
</style>
</head>
<body>
<h1>恭喜!Nginx部署成功</h1>
<p>服务器IP: {{ ansible_default_ipv4.address }}</p>
<p>部署时间: {{ ansible_date_time.iso8601 }}</p>
</body>
</html>
- 编写 Playbook
bash
vim nginx_install.yml
bash
---
- name: 批量安装部署Nginx服务
hosts: webservers
become: yes
gather_facts: yes
collections:
- community.general
vars:
nginx_port: 80
nginx_docroot: /usr/share/nginx/html
nginx_user: nginx
nginx_group: nginx
tasks:
- name: 安装EPEL仓库
dnf:
name: epel-release
state: present
- name: 安装Nginx
dnf:
name: nginx
state: present
- name: 创建Nginx文档根目录
file:
path: "{{ nginx_docroot }}"
state: directory
owner: "{{ nginx_user }}"
group: "{{ nginx_group }}"
mode: '0755'
- name: 复制自定义首页文件
template:
src: files/index.html
dest: "{{ nginx_docroot }}/index.html"
owner: "{{ nginx_user }}"
group: "{{ nginx_group }}"
mode: '0644'
- name: 配置Nginx监听端口
lineinfile:
path: /etc/nginx/nginx.conf
regexp: '^ listen 80;'
line: ' listen {{ nginx_port }};'
backup: yes
- name: 开放防火墙80端口
firewalld:
port: "{{ nginx_port }}/tcp"
permanent: yes
immediate: yes
state: enabled
- name: 启动Nginx服务并设置开机自启
service:
name: nginx
state: started
enabled: yes
- name: 验证Nginx服务状态
uri:
url: "http://{{ ansible_default_ipv4.address }}:{{ nginx_port }}"
status_code: 200
register: nginx_status
until: nginx_status.status == 200
retries: 5
delay: 2
- name: 输出部署成功信息
debug:
msg: "Nginx服务在{{ ansible_default_ipv4.address }}部署成功,访问地址:http://{{ ansible_default_ipv4.address }}:{{ nginx_port }}"
- 执行 Playbook
bash
# 安装最常用的几个社区集合
ansible-galaxy collection install community.general ansible.posix community.docker
# 先检查语法
ansible-playbook nginx_install.yml --syntax-check
# 执行部署
ansible-playbook nginx_install.yml