Ansible 常用模块实战

12 阅读8分钟

Ansible 从入门到实战:批量管理工具核心用法全解析

一、Ansible 核心介绍

Ansible 是 2013 年推出的 IT 自动化 DevOps 工具,基于 Python 开发,主打轻量级、无客户端特性,是批量管理服务器的首选工具之一。 ​

核心特性

  • 无 Agent:基于 Paramiko 实现 SSH 通信,被管理节点仅需开启 SSH 服务,无需安装额外代理;
  • 模块化设计:内置丰富模块,支持自定义模块(任意语言编写);
  • Playbook 能力:基于 PyYAML 编写可复用的自动化剧本,支持复杂场景;
  • Roles 架构:适合部署 OpenStack、K8s 等大型复杂环境。 ​

批量管理工具对比

工具      开发语言架构      现状/特点                
Ansible  Python  无客户端  主流,轻量易上手        
SaltStackPython  C/S 架构  小众,配置相对复杂      
Puppet    Ruby    C/S 架构  淘汰,学习成本高、冷门  
Chef      Ruby    C/S 架构  淘汰,学习成本高、冷门  

二、实验环境准备

环境规划

主机名角色      系统环境  硬件配置
Ansible管理主机  CentOS 7.62C/4G  
node01被管理主机CentOS 7.62C/4G  
node02被管理主机CentOS 7.62C/4G  

基础配置(管理主机执行)

1. 修改主机名
# 管理主机
hostnamectl set-hostname Ansible --static
# 被管理主机(分别在 node01/node02 执行)
hostnamectl set-hostname node01
hostnamectl set-hostname node02
2. 配置本地解析
vim /etc/hosts
# 添加以下内容
192.168.0.30 node01
192.168.0.31 node02
3. 配置 SSH 免密登录
# 生成密钥对(一路回车)
ssh-keygen
​
# 批量推送公钥到被管理节点
for IP in node01 node02
do
  ssh-copy-id $IP
done

安装 Ansible

1. 配置阿里云源
# 替换 Base 源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 
​
# 配置 EPEL 源(Ansible 依赖)
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2. 安装并验证版本
# 安装 Ansible
yum -y install ansible
​
# 查看版本
ansible --version

定义主机清单

Ansible 通过清单文件管理被控制主机,默认路径:/etc/ansible/hosts

# 编辑清单,定义主机组
vim /etc/ansible/hosts
# 添加以下内容
[websrvs]
node[01:02]# 验证主机组
ansible websrvs --list-host
# 输出示例:
#   hosts (2):
#     node01
#     node02

Ansible 基础命令

1. ansible-doc:模块文档查询
ansible-doc -l  # 列出所有模块
ansible-doc -s ping  # 查看 ping 模块帮助
2. ansible:核心执行命令

格式ansible 组名/主机 [-m 模块名] [-a 具体操作]

# 测试 websrvs 组连通性(ping 模块)
ansible websrvs -m ping
3. 返回值颜色说明
  • 绿色:执行成功,远程主机无变更;
  • 黄色:执行成功,远程主机有变更;
  • 红色:执行失败/异常;
  • 粉色:警告(可忽略)。

三、Ansible 常用模块实战

1. command 模块(默认模块)

远程执行命令,不经过 bash 解析< > | ; & 等符号失效)。

常用参数
  • chdir:执行命令前进入指定目录;
  • creates:文件存在则不执行命令;
  • removes:文件存在才执行命令。
示例
# 进入 /root 目录后执行 ls
ansible websrvs -m command -a 'chdir=/root/ ls'  
​
# 若 /opt/test.txt 存在,则不执行 touch
ansible websrvs -m command -a 'creates=/opt/test.txt touch /opt/test.txt'# 若 /opt/test.txt 存在,则执行 mv
ansible websrvs -m command -a 'removes=/opt/test.txt mv /opt/test.txt /root/'# 查看主机名、内核、内存
ansible websrvs -a 'hostname'
ansible websrvs -a 'uname -r'
ansible websrvs -a 'free -h'

2. shell 模块

远程执行命令,通过 bash 解析,支持管道、重定向等符号。

常用参数
  • cmd:指定执行命令(Playbook 中使用);
  • chdir/creates/removes:同 command 模块。
示例
# 统计 /etc/passwd 行数
ansible websrvs -m shell -a 'cat /etc/passwd | wc -l'# 重定向文件内容
ansible websrvs -m shell -a 'cat /etc/passwd > /opt/passwd'# 关闭防火墙并禁用开机自启
ansible websrvs -m shell -a 'systemctl stop firewalld && systemctl disable firewalld'

3. script 模块

执行本地脚本(无需拷贝到远程主机)。

示例:批量配置本地 YUM 源
# 编写脚本
vim /root/yum.sh 
#!/bin/bash
mkdir /mnt/centos
mount /dev/cdrom /mnt/centos
echo "/dev/cdrom /mnt/centos iso9660 defaults 0 0" >> /etc/fstab
rm -rf /etc/yum.repos.d/*
echo "[local_centos7]
name=local_centos7
baseurl=file:///mnt/centos
enabled=1
gpgcheck=0" > /etc/yum.repos.d/centos.repo
yum repolist
​
# 执行脚本
ansible websrvs -m script -a '/root/yum.sh'

4. yum 模块

管理远程主机软件包。

常用参数
  • name:指定软件包名(必填);
  • state:指定状态(present/installed/latest/removed/absent)。
示例
# 安装 vsftpd
ansible websrvs -m yum -a 'name=vsftpd'# 卸载 vsftpd
ansible websrvs -m yum -a 'name=vsftpd state=removed'# 安装最新版本
ansible websrvs -m yum -a 'name=vsftpd state=latest'

5. service 模块

管理远程主机服务。

常用参数
  • name:服务名(必填);
  • state:服务状态(started/restarted/stopped);
  • enabled:是否开机自启(yes/no)。
示例
# 启动 vsftpd 并设置开机自启
ansible websrvs -m service -a 'name=vsftpd state=started enabled=yes'# 重启 vsftpd
ansible websrvs -m service -a 'name=vsftpd state=restarted'# 停止 vsftpd
ansible websrvs -m service -a 'name=vsftpd state=stopped'# 查看服务状态
ansible websrvs -m shell -a 'systemctl status vsftpd'

6. copy 模块

拷贝本地文件到远程主机。

常用参数
  • src:本地文件/目录路径;
  • dest:远程目标路径(必填);
  • force:是否强制覆盖(yes/no,默认 yes);
  • backup:覆盖前是否备份(yes/no);
  • owner/group:设置文件属主/属组;
  • mode:设置文件权限(如 0644)。
示例
# 拷贝本地文件到远程
ansible websrvs -m copy -a 'src=/tmp/test.txt dest=/var/ftp'
​
# 覆盖前备份远程文件
ansible websrvs -m copy -a 'src=/root/hello dest=/opt backup=yes'
​
# 拷贝并设置属主、权限
ansible websrvs -m copy -a 'src=/root/hello dest=/opt owner=test group=test mode=0744'
​
# 不强制覆盖(文件不同时跳过)
ansible websrvs -m copy -a 'src=/root/hello dest=/opt force=no'

四、Ansible Playbook 实战

Playbook 是 Ansible 的核心,基于 YAML 编写,用于实现复杂自动化场景。

YAML 基础语法

  • 严格区分大小写;
  • 缩进用空格(禁止 tab),相同层级左对齐;
  • # 表示注释;
  • : 后必须加空格;
  • 多段配置用 --- 分隔;
  • 数组用 - 开头,对象用 键: 值

Playbook 核心属性

  • hosts:目标主机/组;
  • remote_user:远程执行用户;
  • tasks:任务列表(每个任务以 - 开头);
  • name:任务名称(自定义,便于排查)。

示例 1:基础 Playbook(测试连通性+创建目录)

# 编写剧本
vim ping_websrvs.yml
---
- hosts: websrvs
  remote_user: root
  tasks:
  - name: ping websrvs
    ping:
  - name: mkdir directory test
    shell:
       cmd: mkdir /test
# 执行剧本
ansible-playbook ping_websrvs.yml
​
# 语法检查(推荐先执行)
ansible-playbook --syntax-check ping_websrvs.yml
​
# 模拟执行(不实际修改主机)
ansible-playbook --check ping_websrvs.yml

示例 2:源码部署 Nginx

---  # YAML文件的开始标识(固定格式,告诉系统这是YAML文件)
# 定义一个Play(剧本),Ansible的核心执行单元
- hosts: websrvs          # 指定要执行任务的目标主机组:qwe(你的主机组包含20和30两台机器)
  remote_user: root   # 指定在远程主机上执行命令的用户:root(最高权限)

  # 任务列表:所有要在目标主机上执行的操作都写在tasks下面(必须是复数tasks,这是你之前报错的核心)
  tasks:

  # 第一个任务:安装编译nginx需要的依赖包
  - name: 安装nginx编译依赖包  # 任务名称(自定义,方便你看执行日志)
    yum:  # 调用Ansible的yum模块(用来管理Linux软件包)
      # 要安装的软件包列表(逗号分隔):gcc是编译器,pcre-devel处理正则,openssl-devel处理HTTPS,zlib压缩,wget下载文件
      name: gcc,pcre-devel,openssl-devel,zlib,wget
      state: present  # 操作状态:确保包已安装(和installed等价,Ansible推荐写法)

  # 第二个任务:创建nginx用户和组(因为编译nginx时要指定nginx用户运行,先建用户才不会报错)
  - name: 创建nginx用户和组(编译nginx需要)  # 任务名称
    user:  # 调用Ansible的user模块(用来管理Linux用户)
      name: nginx                # 要创建的用户名:nginx
      shell: /sbin/nologin       # 禁止nginx用户登录系统(安全规范,只用来运行程序)
      create_home: no            # 不创建nginx用户的家目录(不需要)
      state: present             # 操作状态:确保用户存在(不存在就创建,存在就不操作)

  # 第三个任务:下载nginx源码包到/opt目录
  - name: 下载nginx源码包到/opt目录  # 任务名称
    shell:  # 调用Ansible的shell模块(执行Linux命令)
      # 具体命令:wget下载nginx包,-P /opt/ 指定下载到/opt目录(你之前问过的wget参数)
      wget -P /opt/ https://nginx.org/download/nginx-1.24.0.tar.gz
    # 幂等性控制:如果/opt/nginx-1.24.0.tar.gz文件已经存在,就跳过这个任务(避免重复下载)
    args:
      creates: /opt/nginx-1.24.0.tar.gz

  # 第四个任务:解压并编译安装nginx(最核心的步骤,拆成多行更易读)
  - name: 解压并编译安装nginx  # 任务名称
    shell: |  # shell模块的|符号:允许写多行Linux命令(按顺序执行)
      # 第一步:解压nginx源码包到/opt目录(-C指定解压目录)
      tar xf /opt/nginx-1.24.0.tar.gz -C /opt/
      # 第二步:进入解压后的目录,执行编译配置、编译、安装
      # ./configure:编译前的配置,指定安装路径和功能模块
      # --prefix=/usr/local/nginx:nginx的安装目录
      # --user=nginx --group=nginx:指定nginx运行的用户/组
      # --with-xxx_module:启用nginx的扩展功能(如HTTPS、状态监控、压缩等)
      # make:编译源码(把代码转成可执行程序)
      # make install:安装编译好的程序到指定目录
      cd /opt/nginx-1.24.0 && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module && make && make install
    # 幂等性控制:如果/usr/local/nginx目录已存在(说明nginx已安装),就跳过这个任务
    args:
      creates: /usr/local/nginx
# 执行剧本
ansible-playbook nginx.yml

附:常用资源地址