Ansible 自动化运维入门到实战

文章目录

  • [Ansible 自动化运维入门到实战](#Ansible 自动化运维入门到实战)
    • 引言
    • [一、Ansible 核心亮点](#一、Ansible 核心亮点)
    • [二、环境部署(CentOS 7)](#二、环境部署(CentOS 7))
      • [1. 服务器规划](#1. 服务器规划)
      • [2. 控制节点配置(关键步骤)](#2. 控制节点配置(关键步骤))
      • [3. 受控节点要求](#3. 受控节点要求)
    • [三、Ansible 基础使用](#三、Ansible 基础使用)
      • [1. 主机清单(Inventory)](#1. 主机清单(Inventory))
      • [2. 核心配置文件(ansible.cfg)](#2. 核心配置文件(ansible.cfg))
      • [3. Ad Hoc 临时命令(快速执行单个任务)](#3. Ad Hoc 临时命令(快速执行单个任务))
    • [四、进阶: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

执行结果颜色说明:绿色(已达标,无修改)、黄色(执行成功,有修改)、红色(执行失败)。

相关推荐
翼龙云_cloud6 小时前
阿里云渠道商:在更换阿里云 GPU 公网 IP 时,如何确保数据的安全性?
运维·服务器·tcp/ip·阿里云·云计算
爱喝水的鱼丶6 小时前
SAP-ABAP:通过接口创建生产订单报“没有工艺路线选中”错误解决办法详解
运维·开发语言·sap·abap·bapi·生产订单
山川而川-R6 小时前
在香橙派5pro上的ubuntu22.04系统烧录镜像_2_12.23
linux·运维·服务器
Run_Teenage6 小时前
Linux:进程程序替换
linux·运维·服务器
学习3人组6 小时前
docker run 命令详解
运维·docker·容器
UpgradeLink6 小时前
NoteGen:轻量跨端笔记应用,搭配UpgradeLink系统,体验极致笔记之旅
开源·自动化·tauri·upgradelink·应用升级
11小猪会飞116 小时前
.net使用Jenkins 构建、部署到windows服务器上
运维·jenkins
rayylee6 小时前
使用 Windows 自带 ssh 的 X11转发功能并配置 ssh 和 VSCode
linux·运维
枉费红笺6 小时前
Linux / macOS 环境下解压 ZIP 文件的标准命令与常用变体
linux·运维·macos