文章目录
- [Ansible 自动化运维入门到实战](#Ansible 自动化运维入门到实战)
-
- 引言
- [一、Ansible 核心亮点](#一、Ansible 核心亮点)
- [二、环境部署(CentOS 7)](#二、环境部署(CentOS 7))
-
- [1. 服务器规划](#1. 服务器规划)
- [2. 控制节点配置(关键步骤)](#2. 控制节点配置(关键步骤))
-
- [(1)安装 Ansible](#(1)安装 Ansible)
- (2)免密登录配置(核心)
- [3. 受控节点要求](#3. 受控节点要求)
- [三、Ansible 基础使用](#三、Ansible 基础使用)
- [四、进阶:Playbook 实战(自动化核心)](#四、进阶:Playbook 实战(自动化核心))
-
- [1. YAML 基础规则](#1. YAML 基础规则)
- [2. 编写 Playbook(安装并配置 httpd)](#2. 编写 Playbook(安装并配置 httpd))
- [3. 运行 Playbook](#3. 运行 Playbook)
Ansible 自动化运维入门到实战
引言
手动管理多台服务器时,重复操作、配置不一致、故障排查繁琐等问题总能让人头大。Ansible 作为无代理自动化运维工具,用简单的 YAML 语法就能实现配置管理、应用部署、工作流编排,完美适配 DevOps 流程。本文精简三份官方文档的核心内容,从环境搭建到 Playbook 实战,带你快速上手 Ansible!
一、Ansible 核心亮点
- 无代理架构:通过 SSH/WinRM 连接受控节点,无需在目标主机安装代理,部署简单、安全高效。
- 简单易用:Playbook 采用 YAML 格式,人类可读,无需复杂编程技能,新手也能快速上手。
- 功能强大:支持配置管理、应用部署、网络自动化、持续交付等全生命周期运维场景。
- 跨平台兼容:可管理 Linux、Windows、网络设备(Cisco、Juniper 等),适配复杂 IT 环境。
- 幂等性:重复执行 Playbook 不会导致配置混乱,目标主机始终保持预期状态。
二、环境部署(CentOS 7)
1. 服务器规划
| 主机名 | IP 地址 | 角色 | 核心要求 |
|---|---|---|---|
| controller | 192.168.108.10 | 控制节点 | 安装 Ansible,Python 2.7+/3.6+ |
| node1-node4 | 192.168.108.11-14 | 受控节点 | 开启 SSH,支持免密登录 |
2. 控制节点配置(关键步骤)
(1)安装 Ansible
bash
# 配置 EPEL 源(华为云镜像,速度更快)
yum install -y epel-release
sed -i "s/#baseurl/baseurl/g; s/metalink/#metalink/g; s@download.*pub@repo.huaweicloud.com@g" /etc/yum.repos.d/epel.repo
# 安装 Ansible
yum install -y ansible
# 验证版本(2.9+ 稳定版即可)
ansible --version
(2)免密登录配置(核心)
bash
# 控制节点创建 laogao 用户(所有节点统一用户名)
useradd laogao && echo "huawei" | passwd --stdin laogao
# 配置免密提权(所有节点执行)
echo 'laogao ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/laogao
# 控制节点生成密钥对
su - laogao
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N '' # 一路回车
# 推送公钥到所有受控节点(含控制节点自身)
for host in controller node{1..4}; do
sshpass -p "huawei" ssh-copy-id laogao@$host
done
# 验证免密登录
for host in controller node{1..4}; do
ssh laogao@$host hostname
done
3. 受控节点要求
- Linux 节点:安装 Python 2.7+/3.6+(大部分系统默认自带)。
- Windows 节点:需开启 PowerShell 远程连接,安装 .NET Framework 4.0+。
- 网络设备:支持 SSH/API 连接(如 Cisco IOS、Juniper Junos)。
三、Ansible 基础使用
1. 主机清单(Inventory)
Inventory 定义受控节点集合,支持静态配置(文本文件)和动态生成(脚本 / 云平台对接),这里重点讲静态清单。
(1)基础配置(ini 格式)
bash
# 在控制节点创建 inventory 文件
vim ~/web/inventory
# 内容如下
node1
node2
[webservers] # 主机组
node1
node2
[dbservers] # 主机组
node3
node4
[all_servers:children] # 组嵌套(包含 webservers 和 dbservers)
webservers
dbservers
(2)范围简写技巧
ini
# IP 范围:192.168.108.11-14
[node_range]
192.168.108.[11:14]
# 主机名范围:host01-host20
[host_range]
host[01:20].example.com
(3)验证清单
bash
# 查看所有节点
ansible -i inventory all --list-hosts
# 查看 webservers 组节点
ansible -i inventory webservers --list-hosts
2. 核心配置文件(ansible.cfg)
配置文件优先级:ANSIBLE_CONFIG 环境变量 > 项目目录 ansible.cfg > ~/.ansible.cfg > /etc/ansible/ansible.cfg,建议在项目目录创建自定义配置:
bash
vim ~/web/ansible.cfg
[defaults]
remote_user = laogao # 默认连接用户
inventory = ./inventory # 清单文件路径
host_key_checking = False # 关闭 SSH 主机密钥检查
[privilege_escalation]
become = True # 启用提权(sudo)
become_user = root # 提权到 root
become_method = sudo # 提权方式
become_ask_pass = False # 无需输入 sudo 密码
3. Ad Hoc 临时命令(快速执行单个任务)
适合一次性操作,无需编写 Playbook,语法:ansible 主机/组 -m 模块 -a "模块参数"
常用案例
bash
# 1. 查看所有节点主机名(默认使用 command 模块,可省略 -m command)
ansible all -a "hostname"
# 2. 安装 httpd(webservers 组)
ansible webservers -m yum -a "name=httpd state=latest"
# 3. 拷贝控制节点文件到受控节点
ansible all -m copy -a "src=/tmp/test.txt dest=/opt/test.txt mode=0644"
# 4. 启动 httpd 服务并设置开机自启
ansible webservers -m service -a "name=httpd state=started enabled=yes"
# 5. 执行带管道的命令(需用 shell 模块)
ansible all -m shell -a "ps aux | grep sshd"
提示:
command模块不支持管道、重定向,复杂命令用shell模块;raw模块适用于无 Python 环境的设备(如部分网络设备)。
四、进阶:Playbook 实战(自动化核心)
Ad Hoc 适合单任务,Playbook 则能编排多任务流程,用 YAML 编写,可重复执行、版本控制。
1. YAML 基础规则
- 缩进用空格(2 个为宜),同一级别缩进一致。
- 键值对用
:分隔(冒号后加空格)。 - 列表项用
-开头。 - 注释用
#开头。
2. 编写 Playbook(安装并配置 httpd)
创建 deploy_httpd.yaml:
yaml
---
- name: 部署 httpd 服务并配置防火墙
hosts: webservers # 目标主机组
tasks:
- name: 安装 httpd 和 firewalld
yum:
name:
- httpd
- firewalld
state: latest # 确保安装最新版本
- name: 创建测试首页
copy:
content: "Welcome to Ansible Auto Deploy!\n"
dest: /var/www/html/index.html # 目标文件路径
- name: 启动并设置 firewalld 开机自启
service:
name: firewalld
state: started
enabled: yes
- name: 放行 http 服务(防火墙)
firewalld:
service: http
permanent: yes # 永久生效
state: enabled
immediate: yes # 立即生效
- name: 启动并设置 httpd 开机自启
service:
name: httpd
state: started
enabled: yes
- name: 测试 httpd 可用性
hosts: localhost # 本地执行
become: no # 无需提权
tasks:
- name: 访问 web 服务
uri:
url: http://node1
status_code: 200 # 期望返回 200 状态码
3. 运行 Playbook
bash
# 语法检查(无报错则格式正确)
ansible-playbook --syntax-check deploy_httpd.yaml
# 空运行(模拟执行,不实际修改)
ansible-playbook -C deploy_httpd.yaml
# 实际运行(-v 显示详细输出)
ansible-playbook deploy_httpd.yaml -v
执行结果颜色说明:绿色(已达标,无修改)、黄色(执行成功,有修改)、红色(执行失败)。
、