# Linux自动化运维Day01:Ansible 的部署配置与常用模块(基础命令模块command/shell,脚本执行模块script,文件管理模块,用户与组管理模块)
在大规模服务器管理场景中,手动逐台配置、部署、维护效率极低且易出错,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.rpm 和 ansible-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; - 配置文件查找顺序(优先级从高到低):
- 环境变量
ANSIBLE_CONFIG指定的配置文件; - 当前目录下的
./ansible.cfg; - 当前用户家目录下的
~/ansible.cfg; - 系统默认配置
/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.cfg 中 inventory 配置一致(~/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 特性;
- 限制:不支持交互命令(如
vim、top、passwd等);
注意: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 模块本身不具备幂等性,但通过使用模块自带的参数(如
creates、removes等),可以让这些模块实现幂等性。
如:command,shell,script等
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"
五、核心知识点总结
- Ansible 定位:基于 Python、SSH 架构的自动化运维工具,核心价值是批量运维、提升效率、减少人为错误;
- 核心架构:单控制节点 + 多被控制节点,无需客户端,依赖 SSH 通信;
- 核心配置文件:
ansible.cfg:主配置文件,定义主机清单路径、并发数等全局参数;hosts:主机清单文件,定义被管理主机及主机组;
- Ad-Hoc 命令:临时批量操作核心方式,格式为
ansible 主机集合 -m 模块名 -a 参数; - 常用模块:
- 命令执行:
command(基础)、shell(支持 Shell 特性)、script(本地脚本远程执行); - 文件管理:
file(文件/目录/链接)、copy(本地→远程)、fetch(远程→本地)、lineinfile/replace(内容修改); - 用户组管理:
user(账户)、group(用户组);
- 命令执行:
- 核心特性:幂等性、无客户端、模块丰富、支持异构架构。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)