文章目录
- 前言
- 一、ansible概述
- 二、ansible特点
- 三、ansible工作机制
- 四、ansible角色(roles)
- 五、ansible部署安装(管理端操作)
- 六、ansible基础命令和操作
-
- 1、命令格式
- 2、常用模块示例
-
- 2.1、command模块
- 2.2、shell模块
- [2.3、cron 模块](#2.3、cron 模块)
- 2.4、user模块
- 2.5、group模块
- 2.6、copy模块
- 2.7、file模块
- 2.8、hostname
- 2.9、ping模块
- 2.10、yum模块
- 2.11、service/systemd模块
- 2.12、script模块
- 2.13、setup模块
- 总结
前言
Ansible作为自动化运维工具,凭借其无代理架构与声明式配置,在IT基础设施管理中扮演关键角色。本文将从概述、特性、机制到实操部署与模块应用,系统梳理Ansible的核心知识体系。
一、ansible概述
Ansible 是一款面向类 Unix 系统的自由开源配置和自动化工具,由 Python 编写。与 SaltStack、 Puppet、Chef 相似,但具有以下优势:
- 无需在被管理节点安装客户端,轻量级。
- 通过 SSH 协议与节点通信。
- 使用 YAML 和 Jinja2 模板语言进行配置和自动化任务编排。
总结:批量管理主机(服务器、网络设备等)的自动化工具
官网下载地址:https://www.ansible.com/

二、ansible特点
- 部署简单,管理端安装即可,被控端无需操作。
- 默认使用 SSH 协议管理设备。
- 集中化管理,支持主从模式。
- 配置简洁、功能强大、扩展性高。
- 支持 API 和自定义模块,可通过 Python 扩展。
- Playbook 可实现复杂任务配置和状态管理。
- 对云计算和大数据平台支持良好。
三、ansible工作机制
Ansible 通过 SSH 将模块推送到被管理节点执行,执行完后自动删除。可结合 SVN 等工具管理自定义模块及任务编排。
Ansible 核心组成:
- Ansible:核心引擎
- Modules:内置核心模块和自定义模块
- Plugins:补充模块功能,如连接插件、邮件插件等
- Playbooks:剧本,定义多任务操作
- Inventory:主机清单

四、ansible角色(roles)
随着数据中心环境复杂化,Playbook 会变得庞大且难以维护。角色提供了对复杂任务的模块化管理:
- 将任务组织为独立、可复用的剧本和文件
- 提供从外部加载任务、处理程序、变量的机制
- 可关联静态文件和模板
- 满足通用需求,可重复使用
- 严格的目录结构要求
五、ansible部署安装(管理端操作)
1、环境规划
管理端:192.168.10.105
被管理端:192.168.10.106
被管理端:192.168.10.107
2、下载安装ansible
bash
# yum 下载成功即可用
yum install -y epel-release
yum install -y ansible
ansible目录结构:

3、配置主机清单
设置被管理端的组别。
如:vim /etc/ansible/hosts
bash
[webservers]
192.168.10.106
[dbservers]
192.168.10.107
4、配置免密登入
方法一:
bash
ssh-keygen -t rsa # 生成密钥
# 先登入一次,触发完指纹验证,再进行公钥复制传输
# ssh第一次连接陌生主机会触发校验,不能直接sshpass去复制传输公钥
ssh root@192.168.10.106
ssh root@192.168.10.107
sshpass -p '123456' ssh-copy-id root@192.168.10.106
sshpass -p '123456' ssh-copy-id root@192.168.10.107
方法二:
直接跳过校验,使用密码去登入用户并复制公钥
bash
sshpass -p "123456" ssh-copy-id -o StrictHostKeyChecking=no root@192.168.10.106
sshpass -p "123456" ssh-copy-id -o StrictHostKeyChecking=no root@192.168.10.107
六、ansible基础命令和操作
1、命令格式
absible <组名> -m <模块> -a <参数>
2、常用模块示例
2.1、command模块
远程执行命令,不支持管道和重定向。在/etc/ansible目录下
bash
#-s 列出指定模块的描述信息和操作动作
ansible-doc -s command
#指定 ip 执行 date
ansible 192.168.10.106 -m command -a 'date'
#指定组执行 dat
ansible webservers -a 'date'
#指定组执行 date
ansible webservers -m command -a 'date'
#all 代表所有 hosts 主机
ansible all -m command -a 'date'
#如省略 -m 模块,则默认运行 command模块
ansible all -a 'ls /'
结果示例:

chdir:在远程主机上运行命令前提前进入目录
creates:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定文件是否存在,如果存在,执行后面的操作
bash
# chdir=/home:执行命令前先切换到 /home 目录
ansible test1 -m command -a 'chdir=/home ls ./'
# 示例:若 /root/ab.txt 不存在,则执行 touch /root/ab.txt 创建文件
ansible test1 -m command -a 'creates=/root/ab.txt touch /root/ab.txt'
# 示例:若 /root/ab.txt 存在,则执行 rm -f /root/ab.txt 删除文件
ansible test1 -m command -a 'removes=/root/ab.txt rm -f /root/ab.txt'

2.2、shell模块
bash
# 用于查看 shell 模块的精简帮助片段
ansible-doc -s shell
# 输出数值
ansible dbservers -m shell -a 'echo 123456'
# 输出ip地址 awk识别{print $2}失效,因为是shell脚本所以应该加转义符awk "NR==2 {print \$2}"
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}")'
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}") | cut -d " " -f2'
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print \$2}")'

2.3、cron 模块
present表示添加(可以省略),absent表示移除。
常用的参数:
minute/hour/day/month/weekday:分/时/日/月/周
job:任务计划要执行的命令
name:任务计划的名称
bash
ansible-doc -s cron #按 q 退出
ansible test1 -m cron -a 'minute="*/1" job="/bin/echo hello > /root/aaa.txt" name="testhello"'
ansible test1 -a 'crontab -l'
# 移除计划
ansible test1 -m cron -a 'name="testhello" state="absent"'

2.4、user模块
常用参数
bash
name:用户名,必选参数
state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除
system=yes|no:是否为系统账号
uid:用户uid
group:用户基本组
shell:默认使用的shell
move_home=yse|no:如果设置的家目录已经存在,是否将已经存在的家目录进行移动
password:用户的密码,建议使用加密后的字符串
comment:用户的注释信息
remove=yes|no:当state=absent时,是否删除用户的家目录
bash
ansible-doc -s user
#创建用户
ansible dbservers -m user -a 'name="test02"'
ansible dbservers -a 'tail /etc/passwd'
#删除用户
ansible dbservers -m user -a 'name="test02" state=absent'

2.5、group模块
bash
# 用户组管理
ansible-doc -s group
ansible dbservers -m group -a 'name=sjjcxk gid=306 system=yes'
ansible dbservers -a 'tail /etc/passwd'
#system=yes 明确告诉 Ansible / 系统:这个 mysql 组是为「系统服务(如 MySQL 进程)」准备的,而非给普通用户使用;
ansible dbservers -m user -a 'name="test02" uid="1005" system="yes" group=sjjcxk'
#查看用户组
ansible dbservers -a 'id test02'

2.6、copy模块
常用的参数:
bash
dest:指出复制文件的目标及位置,使用绝对路径,如果是源目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容
src:指出源文件的路径,可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录
mode:指出复制时,目标文件的权限
owner:指出复制时,目标文件的属主
group:指出复制时,目标文件的属组
content:指出复制到目标主机上的内容,不能与src一起使用
bash
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
ansible dbservers -a 'ls /opt'
ansible dbservers -a 'cat /opt/fstab.bak'
ansible dbservers -m copy -a 'content="123456" dest=/opt/a1.bak owner=root mode=640'
ansible dbservers -a 'cat /opt/a1.bak'

2.7、file模块
bash
# 设置文件属性
ansible-doc -s file
#修改文件的属主属组权限等
ansible dbservers -m file -a 'owner=root group=mysql mode=755 path="/opt/a1.bak"'
#设置/opt/fstab.link为/opt/fstab.bak的链接文件
ansible dbservers -m file -a 'path=/opt/a1.link src=/opt/a1.bak state=link'
#创建一个文件
ansible dbservers -m file -a 'path=/opt/a1.bak state=touch'
#删除一个文件
ansible dbservers -m file -a 'path=/opt/a1.bak state=absent'

2.8、hostname
bash
#管理主机名
ansible dbservers -m hostname -a "name=test02"

2.9、ping模块
测试主机联通性
bash
ansible all -m ping

2.10、yum模块
管理软件包
bash
# 在远程主机上安装和卸载软件包
ansible-doc -s yum
ansible webservers -m yum -a 'name=httpd'
ansible webservers -m yum -a 'name=httpd state=absent'

2.11、service/systemd模块
常用的参数:
name:被管理的服务名称
state=started|stopped|restarted:动作包含启动关闭或者重启
enabled=yes|no:表示是否设置该服务开机自启
runlevel:如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动
bash
absible-doc -s service
ansible webservers -m service -a 'enabled=true name=httpd state=started'

2.12、script模块
实现远程批量运行本地的 shell 脚本。将控制节点的脚本放到被控制节点去运行
bash
ansible-doc -s script
# 在对应节点写入脚本
vim /opt/test.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
chmod +x /opt/test.sh
ansible webservers -m script -a '/opt/test.sh'
ansible webservers -a 'cat /opt/script.txt'


2.13、setup模块
facts 组件是用来收集被管理节点信息的,使用 setup 模块可以获取这些信息
bash
ansible-doc -s setup
ansible webservers -m setup #获取mysql组主机的facts信息
ansible dbservers -m setup -a 'filter=*ipv4' #使用filter可以筛选指定的facts信息

总结
本文系统介绍了Ansible的核心概念、工作机制及部署流程,通过常用模块示例展示了自动化配置管理能力。掌握Ansible可极大提升运维效率,实现基础设施即代码的现代化运维转型。