在大规模服务器管理场景中,手动逐台配置、部署、维护效率极低且易出错,Ansible 作为一款轻量高效的自动化运维工具,凭借简洁架构、丰富模块和易上手特性,成为企业批量管理服务器的首选工具。本文将从概述、环境部署、核心配置、命令行操作及常用模块五大维度,完整拆解 Ansible 基础核心知识点,带你从零掌握 Ansible 实操。

一、Ansible 概述:自动化运维的核心工具

1. 工具基础信息

  • 诞生与发展:Ansible 首次发布于2012年,作者为 Michael DeHaan(同时也是 Cobbler 工具作者)
    • 2015年被 RedHat 收购,后续持续迭代优化,成为主流自动化工具。
  • 开发语言:基于 Python 开发的自动化运维工具(注意不是服务),跨平台兼容性强,适配主流 Linux/Unix 系统。
  • 核心功能:聚焦批量运维场景,覆盖:
    • 批量系统配置
    • 批量程序部署
    • 批量命令执行
    • 批量服务器密码修改
    • 批量软件包安装
    • 批量配置文件修改
      等核心能力,大幅提升运维效率。

2. 产品核心特色

Ansible 区别于其他运维工具,具备以下显著优势:

  • 基于 SSH 架构:无需在被管理节点安装额外客户端,依托系统原生 SSH 协议通信,部署极简;
  • 模块丰富:内置数百个官方模块,覆盖系统、网络、软件、服务等全场景运维操作;
  • 支持自定义模块:可基于 Python 开发自定义模块,适配企业个性化运维需求;
  • 支持异构 IT 架构:兼容 Linux、Windows、Unix 等多类型系统,适配复杂混合架构环境;
  • 社区活跃:开源社区持续维护,问题反馈及时,文档与案例资源丰富;
  • 部署简单、容易上手:无复杂依赖,配置简洁,零基础运维人员可快速入门。

3. 实验环境说明

本次实操采用模板机克隆4台虚拟机,搭建基础实验环境:

  • 配置IP地址,使用WindTerm远程连接虚拟机
    • 1台控制节点(control):负责下发 Ansible 指令,批量管理其他节点;
    • 3台被控制节点:web1、web2(Web 服务节点)、db1(数据库节点);被控节点通常无需安装 Ansible。

请添加图片描述

二、Ansible 环境部署:从拓扑搭建到基础配置

Ansible架构模式

Ansible 采用主控节点 + 被控节点架构,无中心化代理:
选一台机器作为管理节点(主控),所有操作、任务编排都在这里执行;
集群内其他服务器为被控节点,无需提前安装 Ansible 客户端 / Agent。

1. 实验拓扑图

核心架构为单控制节点 + 多被控制节点,拓扑如下:

  • 控制节点:control(192.168.8.253),作为 Ansible 指令下发核心;
  • 被控制节点组:web1(192.168.8.11)、web2(192.168.8.12)、db1(192.168.8.13),由 control 节点统一管理。

请添加图片描述

2. 前置配置:主机名解析 + SSH 密钥免密登录

2.1 配置主机名解析

为避免每次操作输入 IP,在 control 节点配置 /etc/hosts 文件,实现主机名与 IP 的映射解析,支持主机名直接通信:

[root@control ~]# cat /etc/hosts
# 追加以下内容
192.168.8.253   control
192.168.8.11    web1
192.168.8.12    web2
192.168.8.13    db1

# 验证解析是否生效
[root@control ~]# ping control  #ping测试
[root@control ~]# ping web1
2.2 配置 SSH 密钥免密登录

Ansible 基于 SSH 通信,需实现 control 节点免密码登录所有被控制节点,避免手动输入密码,提升自动化效率:

# 1. 非交互式生成 SSH 密钥对(-N无密码,存储路径 /root/.ssh/id_rsa)
[root@control ~]# ssh-keygen -f /root/.ssh/id_rsa -N ''

# 2. 循环将公钥分发到所有被控制节点(web1、web2、db1)
[root@control ~]# for i in web1 web2 db1
do
    ssh-copy-id root@$i
done

请添加图片描述
分别确认即可

3. 安装 Ansible 控制节点

本次采用离线 RPM 包安装,需提前将 ansible-6.3.0-1.el8.noarch.rpmansible-core-2.13.3-1.el8.x86_64.rpm 上传至 control 节点 /root 目录,执行安装命令:

# 离线安装 Ansible 及核心依赖
[root@control ~]# dnf -y install ansible-6.3.0-1.el8.noarch.rpm ansible-core-2.13.3-1.el8.x86_64.rpm

# 验证安装是否成功,查看版本信息
[root@control ~]# ansible --version

注意,使用dnf命令安装自己上传的软件包时,必须使用完整软件包名(连带后缀)

4. 被控制节点基础要求

Ansible 对被管理节点有2个核心基础要求,缺一不可:

  • 开启 SSH 服务:
    • Ansible默认通过SSH协议(linux服务器系统默认开启)管理机器。为确保被管理节点 SSH 服务正常运行,被管理主机要开启SSH服务,允许控制主机登录;
  • 安装 Python:
    • Ansible 模块默认基于 Python 执行,被管理节点需提前安装 Python(默认系统自带)。

5. 核心配置文件修改

  • ansible有两种配置文件:
    • ansible.cfg主配置文件,用于配置全局信息
    • inventory主机清单文件,用于记录 ansible管理哪些主机

注意:需要在ansible.cfg主配置文件指定 inventory主机清单文件的位置

5.1 主配置文件 ansible.cfg
  • 默认路径:/etc/ansible/ansible.cfg
  • 配置文件查找顺序(优先级从高到低):
    1. 环境变量 ANSIBLE_CONFIG 指定的配置文件;
    2. 当前目录下的 ./ansible.cfg
    3. 当前用户家目录下的 ~/ansible.cfg
    4. 系统默认配置 /etc/ansible/ansible.cfg

使用 ansible --version可以查看是哪个配置文件在生效
即使以上所有配置文件都不存在,ansible命令依然可以正常使用,但会以系统默认值运行。至于如何操作,本文不作过多阐述

本次实操采用自定义配置文件,路径为 ~/ansible/ansible.cfg
创建~/ansible目录,创建ansible.cfg文件,指定主机清单文件
配置步骤:

# 1. 创建自定义配置目录
[root@control ~]# mkdir ~/ansible

# 2. 编辑主配置文件,指定主机清单路径
[root@control ~]# vim ~/ansible/ansible.cfg
# 写入以下内容
[defaults]
# 全局默认配置
inventory = ~/ansible/hosts  # 指定主机清单文件路径
# forks = 5                   # 可选:SSH 并发连接数量,默认5
5.2 主机清单文件 hosts

主机清单文件用于定义 Ansible 管理的所有主机及主机组,是 Ansible 识别被管理节点的核心文件,路径与 ansible.cfginventory 配置一致(~/ansible/hosts):

# 编辑主机清单文件
[root@control ~]# vim ~/ansible/hosts
# 写入以下内容
[webserver]          # 定义 Web 服务主机组(组名自定义)
web[1:2]             # 批量匹配组内主机:web1、web2

[database]           # 定义数据库主机组
db1

[cluster:children]   # 定义父组 cluster(集群),children 关键字标识子组
webserver            # 子组1:webserver
database             # 子组2:database
#写入all代表所有组,不必定义直接可用

Ansible在后续管理时,既可以调用组名,也可以单独调用主机名

6. 测试 Ansible 环境连通性

完成配置后,验证 Ansible 是否能正常识别主机并连通被控制节点

# 切换到配置文件所在目录
[root@control ~]# cd ~/ansible

# 1. 查看所有被管理主机列表
[root@control ansible]# ansible all --list-hosts
#也可以单独查看某一组或者某一集群,如:ansible cluster --list-hosts,ansible webserver --list-hosts


# 2. 调用 ping 模块,测试单节点连通性(本质是 SSH 连通性测试)
[root@control ansible]# ansible web1 -m ping
[root@control ansible]# ansible db1 -m ping
#也可以单独测试主机,如:ansible web1,db1 -m ping

# 3. 测试主机组连通性
[root@control ansible]# ansible webserver -m ping

如果命令正常执行并输出,显示的就是绿色/黄色内容;断联或者故障,显示的就是红色内容

三、Ansible Ad-Hoc 命令行:快速执行批量操作

  • ansible远程批量管理主机的两种方式:
    • Ansible-AdHoc命令行执行
    • Ansible-playbook 剧本(脚本)

ansible学习无需死记硬背,他有非常详细的自带官方模板 + 帮助文档

1. Ad-Hoc 命令概述

Ansible Ad-Hoc 是直接通过命令行下发指令、批量执行运维操作的方式,适合临时、简单的批量任务(如批量查看系统信息、批量创建文件),无需编写复杂脚本,即输即用。

2. 命令核心格式

  • 格式: ansible 主机集合 -m 模块名 -a "模块参数"
    (注意,参数带有特殊符号,一定要用双引号。没有特殊要求,单双引号都可以)
    补充:不加-m指定模块时,默认是command模块

  • 主机集合:指定操作对象,可填单个主机(如web1)、主机组(如webserver)、所有主机(all)

常用选项:

  • -m 模块名:指定要调用的 Ansible 模块(默认模块为 command);

  • -a “参数”:模块对应的执行参数;

  • 其他常用选项:

    • -k:远程执行时输入 SSH 密码(免密登录时无需使用);
    • -i:临时指定host主机清单文件(默认读取 ansible.cfg 中配置)。

在执行ansible命令时,非常建议切换到 Ansible 项目目录执行命令,否则配置文件、主机清单、剧本文件都会出错

3. 模块基础认知

  • 模块本质:Ansible 内置的脚本(多数为 Python 脚本),封装了特定运维功能;
  • 模块特性:多数模块支持自定义参数,适配不同操作需求;
  • 默认模块:未指定 -m 时,默认调用 command (执行命令)模块。

4. 查找模块(模块帮助)

快速查询 Ansible 内置模块及模块帮助:

# 1. 列出 Ansible 所有内置模块
[root@control ansible]# ansible-doc -l

# 2. 过滤指定模块(如过滤 yum 相关模块)
[root@control ansible]# ansible-doc -l | grep yum

# 3. 查看指定模块的详细帮助文档(如 yum 模块)
[root@control ansible]# ansible-doc yum

# 4. 在交互式页面使用/+EXAMPLES查看模块的模板示例,稍微修改可直接粘贴进剧本
/EXAMPLES

执行命令时要切换到家目录的ansible目录下

四、Ansible 常用模块实操:覆盖核心运维场景

1. 基础命令模块:command vs shell

1.1 command 模块
  • 特性:根本不调用 Shell 进程,直接通过 SSH 执行命令
  • 限制:不支持 Bash 特性(管道 |、重定向 >、后台运行 & 等)
    (注意:Ansible 默认不支持交互式命令,如vim)
  • 实操示例:
# 查看系统运行时长
[root@control ansible]# ansible web1 -m command -a "uptime"

# 查看内核版本
[root@control ansible]# ansible web1 -m command -a "uname -r"

# 查看网卡信息
[root@control ansible]# ansible web1 -m command -a "ip a s ens160"

# 省略 -m command,默认调用 command 模块
[root@control ansible]# ansible web1 -a "ip a s ens160"

# 批量查看所有主机系统时间
[root@control ansible]# ansible all -a "date"

# 错误示例:command 不支持管道,重定向,执行会报错。因为这两个操作要新开子进程,但是command不会帮你新开子进程
[root@control ansible]# ansible web1 -m command -a "ps | wc -l"

有正常输出的字体颜色为黄色(代表改变了内容)
绿色输出代表执行/输出正常
红色输出代表出现错误
虽然“”内命令在远程主机操作,但变量是本地主机的

  • command和shell模块的区别
    • command模块的命令不启动shell,直接通过ssh执行命令
    • command不支持bash的特性,如管道和重定向等功能
    • 所有需要调用shell的功能都无法使用
    • command执行速度比shell更快,并且因为不会被shell解析导致安全性更高
1.2 shell 模块
  • 特性:启动目标主机本地 Shell 进程执行命令,支持所有 Bash 特性;
  • 限制:不支持交互命令(如 vimtoppasswd 等);

注意:shell模块不具备幂等性

  • 实操示例:
# 统计系统进程总数(支持管道)
[root@control ansible]# ansible web1 -m shell -a "ps aux | wc -l"

# 查看登录用户信息
[root@control ansible]# ansible web1 -m shell -a "who"

# 创建临时文件
[root@control ansible]# ansible web1 -m shell -a "touch /tmp/txt.txt"
  • shell模块支持判断(creates)
  • 核心参数:creates=文件名——若文件已存在,跳过命令执行(幂等性);

# 幂等性示例:若 ~/.ssh/id_rsa 已存在,不重复生成密钥
[root@control ansible]# ansible web1 -m shell \
-a "ssh-keygen -f ~/.ssh/id_rsa -N '' creates=~/.ssh/id_rsa"

虽然部分 Ansible 模块本身不具备幂等性,但通过使用模块自带的参数(如 createsremoves 等),可以让这些模块实现幂等性。
如: commandshellscript

2. 脚本执行模块:script

  • 功能:在控制节点本地编写脚本,批量拷贝到被管理节点并执行,执行之后自动删除脚本。适配复杂批量任务
    • 原理:将 ** 控制节点(本地)** 的脚本,临时传输到被管理节点,在远程主机上启动进程执行。
  • 特性:支持 Shell、Python、Perl 等各类脚本,脚本无需添加执行权限(-x);
  • 实操示例:
# 1. 在控制节点编写本地脚本 test.sh(安装并启动 httpd)
[root@control ansible]# cat test.sh
#!/bin/bash
dnf -y install httpd
systemctl start httpd

# 2. 调用 script 模块,批量执行脚本(目标:webserver 主机组)
[root@control ansible]# ansible webserver -m script -a "./test.sh"

script 模块没有幂等性

3. 文件管理模块:file、copy、fetch、lineinfile、replace

幂等性
  • 幂等性: 同一命令重复执行多次,效果和仅执行一次完全一致。(第一次执行,黄色CHANGED,后续执行,绿色SUCCESS)
    • 执行 1 次:成功
    • 执行 100 次:还是成功,不会重复创建、不会重复修改、不会报错

这是 Ansible 自动化最核心、最重要的特性。

注意:
幂等性 = 最终状态一致
≠ 不修改时间戳
≠ 不做任何操作

幂等性的设计是只要结果是正确的,绝不更改。只要第二次执行的输出结果是绿色(没有黄色changed),文件/目录时间戳就不会改变

而shell模块不具备幂等性。示例:

ansible web1 -m shell -a "sed -i '6d' 文件" #删除第六行

因为shell不具备幂等性,所以倘若你重复执行该命令,它会反复删除文件第六行内容,造成灾难性后果

3.1 file 模块(文件/目录/链接/权限/归属管理)
  • 核心特性:幂等性——重复执行命令,结果与执行一次一致(避免重复创建、修改);
  • 常用参数:
    • path:目标文件/目录/快捷方式的路径;
    • state:操作类型
      • touch=创建文件
      • directory=创建目录
      • link=创建软链接(使用src指定源文件)
      • absent=删除
    • owner/group/mode:设置文件/目录属主、属组、权限;
  • 实操示例:
# 1. 创建文件
[root@control ansible]# ansible web1 -m file -a "path=/tmp/file.txt state=touch"

# 2. 创建目录
[root@control ansible]# ansible web1 -m file -a "path=/tmp/mydir state=directory"

# 3. 修改文件权限与属主
[root@control ansible]# ansible web1 -m file \
-a "path=/tmp/file.txt owner=sshd group=adm mode=0777"

# 4. 删除目录
[root@control ansible]# ansible web1 -m file -a "path=/tmp/mydir state=absent"

# 5. 删除文件
[root@control ansible]# ansible web1 -m file -a "path=/tmp/file.txt state=absent"

# 6. 创建软链接(/etc/hosts → /tmp/host.txt)
[root@control ansible]# ansible web1 -m file \
-a "src=/etc/hosts path=/tmp/host.txt state=link"
#相当于给/etc/hosts文件创建一个快捷方式,快捷方式路径为:/tmp/hosts.txt
3.2 copy 模块(本地文件→远程主机)
  • 功能:将控制节点的本地文件/内容拷贝到远程被管理节点;
  • copy 模块具备幂等性
  • 常用参数:
    • src:(源文件路径)本地文件路径;
    • dest:(目标文件路径)远程目标路径;
    • backup=yes:远程存在同名文件时,自动备份(备份名:文件名.时间戳);
    • content:直接指定文件内容(无需本地文件。若没有目标文件则创建,若有目标文件则覆盖内容,类似于重定向);
  • 实操示例:
# 1. 控制节点创建测试文件
[root@control ansible]# echo AAA > ~/a3.txt

# 2. 批量拷贝本地文件到远程主机(webserver 组)
[root@control ansible]# ansible webserver -m copy -a "src=~/a3.txt dest=/root/"

# 3. 拷贝并重命名文件(与cp用法类似)
[root@control ansible]# ansible webserver -m copy -a "src=~/a3.txt dest=/root/3a.txt"

# 4. 直接写入内容到远程文件
[root@control ansible]# ansible webserver -m copy \
-a "content='hello the world\n' dest=/root/new.txt"
#content直接提供文件内容,\n代表回车。注意内容不能用双引号,只能用单引号

# 5.backup=yes:当远程主机存在同名文件时,将原本的旧文件(new.txt)自动备份(备份名:文件名.时间戳)
ansible webserver -m copy -a "content='hello the world\n' dest=/root/new.txt backup=yes"
3.3 fetch 模块(远程主机→本地文件)
  • 功能:与 copy 模块相反,将远程被管理节点文件下载到控制节点本地;
  • fetch 模块具备幂等性
  • 实操示例:
# 下载远程 web1 主机的 /etc/hostname 文件到本地家目录
[root@control ansible]# ansible web1 -m fetch -a "src=/etc/hostname dest=~/"

# 查看本地下载结果
[root@control ansible]# ls ~/

注意:fetch 模块下载的内容默认按主机名分别创建对应的目录存放数据
例:

ansible webservers -m fetch -a "src=/root/new.txt dest=/fetched/"


#目录结构:
/fetched/
├── web1/
│   └── root/
│       └── new.txt
├── web2/
│   └── root/
│       └── new.txt
3.4 lineinfile 模块(单行内容修改)
  • 功能:远程修改文件单行内容(注:默认在行尾添加)
    • lineinfile 模块具备幂等性
  • 实操示例:
# 向 /etc/issue 文件末尾添加一行 "hello world"
[root@control ansible]# ansible web1 -m lineinfile \
-a "path=/etc/issue line='hello world'"
#默认在行尾添加

# 幂等性验证:重复执行,不会重复添加
[root@control ansible]# ansible web1 -m lineinfile \
-a "path=/etc/issue line='hello world'"
3.5 replace 模块(关键词替换)
  • 功能:可以修改远程文件,替换全文关键词,批量替换匹配内容;
  • 实操示例:
# 将 /etc/issue.net 文件中所有 "Kernel" 替换为 "Ocean"
[root@control ansible]# ansible web1 -m replace \
-a "path=/etc/issue.net regexp=Kernel replace=Ocean"
#regexp是正则的意思

4. 用户与组管理模块:user、group

4.1 user 模块(系统账户管理)
  • 功能:批量创建、修改、删除系统账户,支持配置账户属性(UID、家目录、密码、属组、附加组等);
    • state=present幂等性
    • remove=true :与state=absent (删除用户)一起使用,同时删除用户家目录、邮箱
  • 实操示例:
# 1. 创建普通账户 tuser1
[root@control ansible]# ansible web1 -m user -a "name=tuser1"

# 2. 创建账户并配置属性(用户名,UID,基本组,附加组为daemon和root,家目录,附加组,以及幂等性)
[root@control ansible]# ansible web1 -m user \
-a "name=tuser2 uid=1010 group=adm groups=daemon,root home=/home/tuser2 state=present"

# 3. 修改账户密码,使用sha512 加密(当成固定格式来记,只要sha512)
[root@control ansible]# ansible web1 -m user \
-a "name=tuser1 password={{'abc'| password_hash('sha512')}} "
#若不进行加密,直接password=abc,会弹出警告,会导致无法登录

# 4. 修改账户附加组
[root@control ansible]# ansible web1 -m user -a "name=tuser1 groups=root,daemon"

# 5. 删除账户(只用state=absent,保留家目录)
[root@control ansible]# ansible web1 -m user -a "name=tuser1 state=absent"

# 6. 删除账户并删除家目录、邮箱(remove=true)
[root@control ansible]# ansible web1 -m user \
-a "name=tuser2 state=absent remove=true"
4.2 group 模块(系统组管理)
  • 功能:批量创建、删除系统用户组;
    • 幂等性state=present
  • 实操示例:
# 1. 用户组 devops 不存在则创建
[root@control ansible]# ansible web1 -m group -a "name=devops state=present"

# 2. 删除用户组 devops
[root@control ansible]# ansible web1 -m group -a "name=devops state=absent"

五、核心知识点总结

  1. Ansible 定位:基于 Python、SSH 架构的自动化运维工具,核心价值是批量运维、提升效率、减少人为错误
  2. 核心架构:单控制节点 + 多被控制节点,无需客户端,依赖 SSH 通信;
  3. 核心配置文件
    • ansible.cfg:主配置文件,定义主机清单路径、并发数等全局参数;
    • hosts:主机清单文件,定义被管理主机及主机组;
  4. Ad-Hoc 命令:临时批量操作核心方式,格式为 ansible 主机集合 -m 模块名 -a 参数
  5. 常用模块
    • 命令执行:command(基础)、shell(支持 Shell 特性)、script(本地脚本远程执行);
    • 文件管理:file(文件/目录/链接)、copy(本地→远程)、fetch(远程→本地)、lineinfile/replace(内容修改);
    • 用户组管理:user(账户)、group(用户组);
  6. 核心特性幂等性无客户端模块丰富支持异构架构
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐