目录
前言
- 本文主要介绍了Ansible是什么和其核心模块的整理和使用,看完本文不一定说就会多懂Ansible,但是读完以后,你能掌握基本模块的使用方法,你对Ansible的认知会从陌生到认识,如果有了解的也可以通过本文快速复习和巩固基础。
- 之后我也会专门写一篇博客来通过Ansible的剧本实现我其它博客中提到的所有服务的一键部署和使用(LNMP、Docker、K8s集群等)
Kubernetes技术笔记-从理论到实践,轻松搭建K8s集群
Kubernetes技术笔记-从理论到实践,轻松搭建K8s集群Docker技术笔记-从零开始的容器技术之旅
Nginx技术笔记-从LNMP架构到反向代理、负载均衡、灰度发布的全攻略
- 注:由于目前博客数量较少,内容尚不丰富,但会随着学习的深入逐步完善。
- 注:如果觉得本文有所帮助,望点个收藏和关注。
- 注:本文中使用的Linux系统是RockyLinux 8.6版本
一、Ansible简介
- Ansible 是一款开源的自动化运维工具,广泛应用于配置管理、应用部署、任务执行和多节点协调。
- 它通过简洁易懂的 YAML 格式(Playbook)定义任务,能够高效管理成百上千台服务器,是 DevOps 领域不可或缺的工具之一。
- Ansible官方网址、Ansible官方文档
二、自动化运维的优势
- 在 IT 运维领域,自动化运维相较于传统运维具有显著优势:
- 传统运维:依赖手动操作,资源密集且易出错,通常在问题出现后才进行处理,效率低下。
- 自动化运维:借助自动化工具实现流程自动化,注重预防性维护,通过监控和报警系统提前预警,降低时间成本并减少人为错误。
- 掌握自动化运维,能够显著提升工作效率,简化运维流程。
三、Ansible工作流程
- Ansible 的工作流程的主要步骤:
- 编写配置文件:通过
ansible.cfg
配置文件指定启用的修改和配置信息。 - 配置 Inventory:定义目标主机或主机组。
- 编写 Playbook:以 YAML 格式定义任务逻辑,如安装软件或配置服务。
- 执行 Playbook:
- 通过
ansible-playbook
命令运行,Ansible 会通过 SSH 连接目标主机,传输并执行模块,最终返回执行结果。 - 任务执行完成后,Ansible会清理远程主机上的临时文件,确保不会留下残留文件。
- 通过
- 编写配置文件:通过
四、自动化运维工具对比
- 注:仅了解,这些自动化运维工具暂时我也只用过Ansible和Jenkins。
工具 | 优点 | 缺点 |
---|---|---|
Ansible |
|
|
Jenkins |
|
|
Terraform |
|
|
SaltStack |
|
|
Chef |
|
|
Puppet |
|
|
五、Ansible相关概念
(一)控制节点(Control Node)
- 运行 Ansible 的主控机器,负责执行 Playbook 并管理任务。
- 要求安装 Ansible,且运行 Linux/Unix 系统(Windows 支持有限)。
(二)被控节点(Managed Nodes)
- 被 Ansible 管理的远程主机,可以是物理机、虚拟机或云实例。
- 要求通过 SSH/WinRM 访问,并安装 Python。
(三)清单文件(inventory)
- 定义被控节点的列表及分组,通常以
hosts
文件形式存在。 - 如果
ansible.cfg
中未显式指定inventory
路径,Ansible 会默认使用/etc/ansible/hosts
。 - 确保Ansible能找到inventory文件:
- 在
ansible.cfg
中指定inventory = /root/Ansible/inventory
。 - 进入工作目录
/root/Ansible
,并确保ansible.cfg
和 inventory 文件在此目录下。 - 在命令行中通过
-i /root/Ansible/inventory
显式指定路径。
- 在
(四)配置文件(ansible.cfg)
- Ansible 的配置文件,用于定义全局参数。
- Ansible 会按以下顺序查找配置文件:
- 当前工作目录的
ansible.cfg
。 - 环境变量
ANSIBLE_CONFIG
指定的路径。 - 用户目录(如
~/.ansible.cfg
)。 - 全局默认路径
/etc/ansible/ansible.cfg
。
- 当前工作目录的
(五)YAML语法
- YAML 是一种人类可读的数据序列化格式,具备易读性、简洁性和可扩展性。
- Ansible 使用 YAML 格式编写 Playbook 和其他配置文件。
六、Ansible环境
(一)环境准备
主机准备
主机名 | IP地址 | 角色 |
---|---|---|
Ansible | 192.168.88.20 | 控制节点 |
Node1 | 192.168.88.21 | 被控节点 |
Node2 | 192.168.88.22 | 被控节点 |
Node3 | 192.168.88.23 | 被控节点 |
软件包下载和仓库搭建
- 下载Ansible及其依赖包,搭建YUM仓库
//部署ftp服务 yum -y install vsftpd //安装提供ftp服务的软件 sed -ri '/anonymous/s,YES,NO,' /etc/vsftpd/vsftpd.conf //允许匿名访问 systemctl enable --now vsftpd //设置开机自启并立即启动 mkdir /var/ftp/ansible //创建存放下载软件包的目录 //下载软件 yum wget //提供wget命令 yum -y install yum-utils && repotrack --destdir=/var/ftp/ansible ansible-core yum install -y yum-utils yumdownloader ansible-6.3.0-1.el8.noarch wget https://yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64/getPackage/ansible-core-2.13.3-1.el8.x86_64.rpm //找个包找了半天 //搭建仓库 yum createrepo //下载制作仓库清单的软件 createrepo /var/ftp/ansible //生成仓库清单文件 //配置YUM仓库 [Ansible] name = Ansible Packages baseurl = "ftp://192.168.88.20/ansible" enabled = 1 gpgcheck = 0 //更新仓库缓存 yum makecahce
节点准备
- 控制节点:安装 Ansible 软件,确保 Python 环境支持(Python>=2.6),并配置必要的模块。
- 被控节点:启用 SSH 服务,允许控制节点登录,并确保 Python 环境支持,为了之后相关模块需要在每个节点添加一块20G大小的硬盘。
(二)使用方法
- Ad-hoc临时命令:通过
ansible
命令调用模块,实现被控节点的远程管理。- 语法:
ansible [主机或组列表] -m 模块 -a "参数"
。 - 常用选项:
-i
指定主机清单文件,-k
用于使用指定密码登录。
- 语法:
- Playbook剧本:将管理任务以 YAML 格式编写在文件中,通过
ansible-playbook
命令执行。
(三)任务状态
- Ansible在执行任务时通过颜色编码直观反馈任务状态,之后关于Ansible的博客的学习中这七种颜色都能看到
- 绿色(OK)
- 含义:任务成功执行且未改变系统状态(幂等性生效)
- 场景:目标已处于期望状态(如软件已安装/服务已运行)
- 黄色(CHANGED)
- 含义:任务成功执行且系统状态发生变更
- 场景:配置更新/软件安装/服务重启等实际修改操作
- 红色(FAILED)
- 含义:任务执行失败
- 场景:权限不足/配置错误/依赖缺失等需立即干预的故障
- 紫色(UNREACHABLE)
- 含义:主机无法连接
- 场景:网络不通/SSH认证失败/主机宕机
- 蓝色(SKIPPED)
- 含义:任务被条件跳过
- 场景:
when
条件不满足/tags
未触发
- 白色(IGNORED)
- 含义:错误被显式忽略
- 场景:配置
ignore_errors: yes
后出现的失败
- 橙色(RESCUED)
- 含义:
rescue
块修复后恢复 - 场景:错误处理流程成功恢复任务
- 含义:
- 绿色(OK)
- 注:
- 以上的内容都是Ansible的一些最基础的理论,之后的内容都是关于模块的基础使用。
- 本文只通过Ad-hoc临时命令来介绍模块的使用,有些模块的部分用法无法用Ad-hoc来介绍,之后的博客会详细介绍Playbook和通过剧本来使用和补充模块的用法。
- 如果有一些概念如Ansible变量、Ansible参数、Jinja2模板等,之后的博客会详细介绍它们是什么及其用法。
七、Ansible的使用
- 配置主机清单文件
192.168.88.20 Ansible 192.168.88.21 Node1 192.168.88.22 Node2 192.168.88.23 Node3
- 在配置主机清单文件后,需要测试控制节点与被控节点之间的通信是否正常。
- 测试通信
for i in {Ansible,Node{1..3}} do ping -c 1 ${i} done //-c指定ping的包的个数
- 配置免密
ssh-keygen -t rsa -f /root/.ssh/id_rsa -N '' //非交互式生成密钥文件 //解释 //-t rsa 指定生成的密钥类型为RSA //-f /root/.ssh/id_rsa 指定生成的私钥文件路径为 /root/.ssh/id_rsa,公钥文件会自动生成为 /root/.ssh/id_rsa.pub //-N '' '' 表示不设置密码短语,私钥文件将无密码保护 for i in Node{1..3} do ssh-copy-id ${i} done //传递公钥到被控节点 for i in Node{1..3} do ssh root@${i} "hostname" done //通过ssh在远程主机执行hostname命令测试,能看到对应的被控节点的主机名的输出信息
- 准备工作目录
mkdir /root/Ansible cd Ansible //需要在工作目录下操作,否则找不到ansible.cfg和inventory文件
- 编写ansible.cfg配置文件场景:
- 编写inventory主机清单列表文件
[test1] //定义一个主机组 Node1 [test2] Node[2:3] //范围语法表示从2到3 [study:children] //定义一个嵌套组,格式为[组名:children] test1 test2
- 基础命令
ansible --version //查看ansible的版本信息
ansible-config init //根据提示查看配置条目,ansible.cfg中可以设置的配置
ansible --help //查看帮助信息
ansible all --list-hosts //查看所有被控主机列表,可以将all换成对应的组名或主机名
ansible-doc -l
//列出当前ansible所提供的模块,管道给wc可以显示总数,该警告是说某个模块的格式有误,不用管
ansible-doc -l | wc -l //模块比较多
ansible-doc -l -vvv //显示详细信息
ansible-doc yum //查看指定模块的信息(如yum)
注:如果想看对应模块的使用样例,可以通过以下命令查看
ansible-doc yum //先输入 / 再输入 EXAMPLES 后回车查看样例
Ansible模块
- 定义
- 模块(Module)是 Ansible 的核心组件,是 Ansible 执行具体任务的基本单元。
- 它本质上是一个独立的脚本(通常用 Python 编写,但也可以用其他语言如 Shell、Ruby 等),负责在远程主机上完成特定的操作。
- 作用
- 执行任务:模块是 Ansible 与远程主机交互的“工具”,通过模块可以完成几乎所有的自动化操作。
- 无状态性:每次执行模块时,Ansible 会临时将模块代码传输到远程主机运行,完成后模块会被删除,不会在远程主机上留下残留文件。
- 关键特性
- 无代理(Agentless):
- 模块通过 SSH(对 Linux 主机)或 WinRM(对 Windows 主机)传输并执行,无需在远程主机预装任何代理软件。
- 幂等性:
- 模块设计为幂等的,即多次执行同一模块产生的影响相同。
- 返回 JSON 结果:
- 模块执行后会返回结果(如
changed
、failed
状态及详细信息),Ansible 通过这些结果判断任务是否成功,并支持后续任务的条件判断(如when
条件)。
- 模块执行后会返回结果(如
- 无代理(Agentless):
模块记录表
注:只记录我使用过的模块的名字(用法的话会在博客里面更新),之后如果有接触新的模块的话也会继续更新(我提到的模块的参数的用法都有介绍,但参数有很多,我只列举了一些常见的)。
command | shell | script | file | copy | fetch | lineinfile |
replace | user | group | ping | yum_repository | yum | service |
parted | lvg | lvol | filesystem | mount | debug | setup |
firewalld | template | sysctl | package | blockinfile | ansible.builtin.copy | archive |
unarchive | cron | get_url | selinux | iptables | authorized_key |
(一)command模块
- 作用:在被控节点执行 Linux 命令,不支持 bash 特性(如管道、重定向)。
ansible test1 -m command -a "echo Thanks!"
ansible test1 -a "echo Thanks!" //默认使用command模块
ansible test1 -m command -a "hostname | wc -l" //不支持管道
(二)ping
模块
- 作用:测试是否可以管理远程主机。
ansible all -m ping //正式操作前建议先进行该测试
(三)shell模块
- 作用:在被控节点执行Linux命令,支持bash特性。
ansible test1 -m shell -a "echo Thanks! | wc -l"
- 编辑ansible.cfg文件
- 修改默认模块
[defaults]
inventory = inventory
host_key_checking = false
module_name = shell
ansible test1 -a "echo Thanks! | wc -l" //没有通过-m指定shell模块
(四)script模块
- 作用:在被控节点执行脚本,支持多种脚本语言。
- 创建简单脚本
cat >> test1.sh << EOF #/bin/bash echo "Thanks!" EOF //通过script模块无需执行权限
ansible test1 -m script -a "/root/Ansible/test1.sh"
(五)file模块
- 作用:在被控节点创建文件、目录、链接文件等,还可以修改权限和归属。
- 参数:
path
:指定文件路径。state
:touch
(创建文件)、directory
(创建目录)、link
(创建软链接)(src 原文件 dest 链接文件)、absent
(删除)。owner
、group
:设置文件所属用户和组。mode
:设置文件权限,可以是数字或字符形式
创建目录:
ansible test1 -m file -a "path=/root/Node1 state=directory owner=root group=root mode=0755"
//在/root目录下创建一个名为Node1的目录,权限为0755,所有者为root,所属组为root
创建文件:
ansible test1 -m file -a "path=/root/Node1/Node1.txt state=touch owner=root group=root mode=0644"
//在Node1目录下创建一个名为Node1.txt的文件,所有者和所属组为root,权限为0644
创建链接:
ansible test1 -m file -a "src=/root/Node1/Node1.txt dest=/root/Thanks.txt state=link "
//给Node1.txt创建软链接文件Thanks.txt
删除文件:
ansible test1 -a "ls -lR"
ansible test1 -m file -a "path=/root/Thanks.txt state=absent"
//查看结果并删除链接文件
(六)copy模块
- 作用:将控制节点的文件发送到被控节点,可理解为上传操作。
- 参数:
src
:源文件路径。dest
:目标文件路径。content
:直接写入文件的内容。mode
:设置文件权限。
touch test.txt
ansible test1 -m copy -a "src=/root/Ansible/test.txt dest=/root/Node1 mode=0644"
ansible test1 -a "cat Node1/test.txt"
//控制节点创建文件test.txt
//将文件拷贝到test1组设置文件权限为0644"
ansible test1 -m copy -a "dest=/root/Node1/test.txt content='Thanks'"
//在目标文件中写入内容 Thanks
ansible test1 -a "cat /root/Node1/test.txt"
(七)fetch
模块
- 作用:将被控节点的文件发送到控制节点,可理解为下载操作。
- 参数:
src
:源文件路径。dest
:目标文件路径。flat
:是否保留目录结构。
保留目录结构:
ansible test1 -m fetch -a "src=/root/Node1/test.txt dest=/root/Ansible"
//将test1组的test.txt文件下载到控制节点,保留了目录结构
ls //查看结果
不保留目录结构:
rm -rf Node1 test.txt //删除之前的文件
ansible test1 -m fetch -a "src=/root/Node1/test.txt dest=/root/Ansible/ flat=yes"
//将test1组的test.txt文件下载到控制节点,未保留目录结构,此时必须在dest指定的目录的末尾加上 /,否则会报错
ls //查看结果
(八)lineinfile
模块
- 作用:用于确保文件中包含指定的行。
- 参数:
path
:文件路径。line
:要确保的行内容。- regexp:用于查找文件中的内容,可用于进行替换。
state
:present
(添加)、absent
(删除)。
添加内容:
ansible test1 -m lineinfile -a "path=/root/Node1/test.txt line='Thanks' state=present"
//在test.txt中添加已有内容,虽然返回状态是黄色但是不会添加
ansible test1 -a "cat Node1/test.txt"
//查看结果,应为默认工作目录是/root,可省略/root的书写
ansible test1 -m lineinfile -a "path=/root/Node1/test.txt line='Thank you ' "
//在test.txt中添加未有内容,会添加,默认添加到行尾,present是默认动作可省略
ansible test1 -a "cat Node1/test.txt"
//查看结果
匹配替换和删除:
//在完成blockinfile模块的练习之后再进行以下操作
ansible test1 -m lineinfile -a "path=Node1/test.txt regexp='Thanks' line='Thank you'"
//如果同时匹配到多行,只会替换匹配到行中的最后一行
ansible test1 -a "cat Node1/test.txt"
//查看结果
ansible test1 -m lineinfile -a "path=Node1/test.txt state=absent regexp='Thank you' "
//通过regexp匹配删除,会将所有匹配到的内容全部删除
ansible test1 -a "cat Node1/test.txt"
//查看结果
(九)blockinfile
模块
- 作用:用于多行内容的插入。
- 参数:
path
:要插入的文本文件路径。block
:要插入的多行内容。- state:
present
(创建)、absent
(删除)。 - create:如果目标文件不存在,是否自动创建。
- backup:在修改文件前创建备份。
添加内容:
ansible test1 -m blockinfile -a "path=Node1/test.txt block='Thanks\nThank you'"
//写入多行内容,\n代表换行符,通过block添加的内容的前后会有标识行
创建不存在文件并写入内容:
ansible test1 -m blockinfile -a "path=Node1/test2.txt block='Thanks\nThank you'"
//在不存在的文件中写入内容且未启用create参数,报错
ansible test1 -m blockinfile -a "path=Node1/test2.txt block='Thanks\nThank you' create=yes"
//在不存在的文件中写入内容但启用create参数
ansible test1 -a "cat Node1/test2.txt"
//检查结果
启用备份:
ansible test1 -m blockinfile -a "path=Node1/test2.txt block='Thanks' backup=yes"
//启用备份
ansible test1 -a "ls Node1"
//检查结果
删除内容:
ansible test1 -a "cat Node1/test2.txt"
//删除前检查
ansible test1 -m blockinfile -a "path=Node1/test2.txt block='Thanks' "
//删除指定块的内容
ansible test1 -a "cat Node1/test2.txt"
//删除后检查结果
(十)replace
模块
- 作用:用于替换文件中的内容。
- 参数:
path
:文件路径。regexp
:正则表达式,用于匹配要替换的内容。replace
:替换后的内容。
ansible test1 -m replace -a "path=Node1/test.txt regexp='s' replace=' you'"
//通过正则表达式替换匹配到的指定内容,不是直接替换整行
ansible test1 -a "cat Node1/test.txt"
//查看结果
(十一)user
模块
- 作用:用于实现 Linux 用户管理。
- 参数:
name
:用户名。uid
:用户 ID。group
:主组。groups
:附加组。home
:家目录的路径。password
:用户密码(需加密)。state
:present
(创建)、absent
(删除)。remove
:删除用户时是否删除家目录和邮件等。- create_home:是否创建家目录。
ansible test1 -m user -a "name=Node1 group=Node1 groups=root,nobody uid=1000 password={{ 'password' | password_hash('sha512') }} state=present"
//主组Node1没有提前创建,报错
创建用户:
ansible test1 -m user -a "name=Node1 group=root groups=root,nobody uid=1000 password={{ 'password' | password_hash('sha512') }} state=present create_home=yes"
//创建一个名为Node1的用户,指定主组为root,附加组为root和nobody,密码为password,通过SHA512算法加密
ansible test1 -a "id Node1"
//查看结果
删除用户:
ansible test1 -m user -a "name=Node1 state=absent remove=yes"
//删除Node1用户并删除家目录和邮件等
ansible test1 -a "ls /home"
//查看结果
(十二)group
模块
- 作用:用于实现Linux 组管理。
- 参数:
name
:组名。gid
:组 ID。state
:present
(创建)、absent
(删除)。
创建用户组:
ansible test1 -m group -a "name=test1 state=present gid=1001"
//在test1主机组上创建一个名为test的组,gid为1001
ansible test1 -a "tail -1 /etc/group"
//查看结果
删除用户组:
ansible test1 -m group -a "name=test1 state=absent"
//在test1主机组上删除一个名为test的组
ansible test1 -a "tail -1 /etc/group"
//查看结果,/etc/group是存放用户组信息的文件
(十三)yum_repository
模块
- 作用:用于管理被控节点的YUM 配置文件(repo 文件)。
- 参数:
file
:指定 repo 文件名。name
:仓库唯一标识符。description
:仓库描述信息。baseurl
:仓库地址。enabled
:是否启用该仓库。gpgcheck
:是否校验密钥。state
:present
(创建)、absent
(删除)。
创建YUM仓库:
ansible test1 -m yum_repository -a "file=myrepo name=Ansible description='Ansible Packages' baseurl='ftp://192.168.88.20/ansible' enabled=yes gpgcheck=no state=present"
//创建YUM仓库配置文件
ansible test1 -a "yum makecache"
ansible test1 -a "ls /etc/yum.repos.d"
//检查结果
ansible test1 -m yum_repository -a "file=myrepo name=Ansible2 description='Ansible Packages' baseurl='ftp://192.168.88.20/ansible' enabled=yes gpgcheck=no state=present"
//给myrepo的YUM仓库配置文件再添加一个仓库,这里使用的是同一个ftp网络仓库
ansible test1 -a "cat /etc/yum.repos.d/myrepo.repo"
//检查结果
删除YUM仓库:
ansible test1 -m yum_repository -a "file=myrepo name=Ansible2 state=absent"
//先删除myrepo配置文件的一个仓库
ansible test1 -a "ls /etc/yum.repos.d"
ansible test1 -a "cat /etc/yum.repos.d/myrepo.repo"
//检查结果,此时仓库配置文件还存在
ansible test1 -m yum_repository -a "file=myrepo name=Ansible state=absent"
//删除myrepo配置文件的所有仓库
ansible test1 -a "ls /etc/yum.repos.d"
//检查结果,此时配置文件也被删除,当一个仓库配置文件中的所有的仓库被删除时该配置文件也会被删除
(十四)yum
模块
- 作用:用于管理被控节点的RPM 包,如安装、升级、卸载等。
- 参数:
name
:包名。state
:present
(安装)、latest
(安装或升级到最新版本)、absent
(卸载)。
安装软件:
ansible test1 -m yum -a "name=httpd,php-fpm state=present"
//安装httpd和php-fpm软件
ansible test1 -a "rpm -q httpd ; rpm -q php-fpm"
//查看结果
卸载软件:
ansible test1 -m yum -a "name=php-fpm state=absent"
//卸载php-fpm软件
ansible test1 -a "rpm -q php-fpm"
//查看结果
(十五)package
模块
- 作用:用于管理包,支持多种包管理器(如 YUM、APT)。
- 参数:
name
:包名。state
:present
(安装)、absent
(卸载)。
安装软件:
ansible test1 -m package -a "name=php-fpm state=present"
//类似于yum模块,但跨平台性比yum好,yum只能在RedHat系列系统中使用
//但yum模块支持高级功能(enablerepo/disablerepo是否启用仓库等),而package模块不支持
ansible test1 -a "rpm -q php-fpm"
//检查结果
卸载软件:
ansible test1 -m package -a "name=php-fpm state=absent"
//卸载php-fpm软件
ansible test1 -a "rpm -q php-fpm"
//查看结果
(十六)service
模块
- 作用:用于管理 Linux 系统服务,如启动、关闭、重启、是否开机自启动。
- 参数:
name
:服务名。state
:started
(启动)、stopped
(停止)、restarted
(重启)。enabled
:是否开机自启。
启用服务:
ansible test1 -m service -a "name=httpd state=started enabled=yes"
//启动httpd并设置为开机自启
ansible test1 -a "systemctl status httpd"
//检测结果
停止服务:
ansible test1 -m service -a "name=httpd state=stopped enabled=no"
//停止httpd并取消开机自启
ansible test1 -a "systemctl status httpd"
//检测结果
(十七)parted
模块
- 作用:用于管理被控节点磁盘分区。
- 参数:
device
:待分区的设备路径。number
:分区编号。state
:present
(创建)、absent
(删除)。part_start
:分区的起始位置。part_end
:分区的结束位置。label
:分区表类型(如MBR、GPT)。
ansible all -a "lsblk"
//查看信息确保添加了硬盘
创建分区:
ansible test1 -m parted -a "device=/dev/vdb number=1 state=present part_start=0% part_end=50% label=gpt"
//给/dev/vdb磁盘创建分区1,具体磁盘看虚拟机,比如我使用的KVM是vdb,使用VMware的是sdb等,用百分比来表示所用分区的大小,gpt代表分区表为GPT
ansible test1 -m parted -a "device=/dev/vdb number=2 state=present part_start=50% part_end=100% label=gpt"
//给/dev/vdb磁盘创建分区2
ansible test1 -a "lsblk"
//查看分区
ansible test2 -m parted -a "device=/dev/vdb number=1 state=present part_end=10GiB label=msdos"
//未写part_start表示从头开始,GiB表示二进制单位1024,GB表示十进制单位,msdos表示分区表为MBR
ansible test2 -m parted -a "device=/dev/vdb number=2 state=present part_start=10GiB label=msdos"
//未写part_end表示到结尾
ansible test2 -a "lsblk"
//查看分区
删除分区:
ansible test2 -m parted -a "device=/dev/vdb number=1 state=absent "
ansible test2 -m parted -a "device=/dev/vdb number=2 state=absent "
//删除分区
ansible tset2 -a "lsblk"
(十八)lvg
模块
- 作用:用于管理卷组,包括创建、删除等。
- 参数:
vg
:卷组名。pvs
:由哪些物理卷构成。pesize
:物理区块大小。state
:present
(创建)、absent
(删除)。
创建卷组:
ansible test1 -m lvg -a "vg=myvg pvs=/dev/vdb1 pesize=4M state=present"
//为test1主机组的/dev/vdb1磁盘创建名为myvg的卷组,PE大小为4M
//如果报错说明未安装lvm2卷管理工具,再执行上条命令即可
ansible test1 -m yum -a "name=lvm2 state=present"
ansible test1 -m lvg -a "vg=myvg2 pvs=/dev/vdb2 pesize=4M state=present"
//为test1主机组的/dev/vdb2磁盘创建名为myvg2的卷组,PE大小为4M
ansible test1 -a "vgs"
//查看结果
删除卷组:
ansible test1 -m lvg -a "vg=myvg2 state=absent"
//删除test1主机组名为myvg2的卷组
ansible test1 -a "vgs"
//查看结果
卷组扩容:
ansible test1 -m lvg -a "vg=myvg pvs=/dev/vdb1,/dev/vdb2 state=present"
//扩容test1主机组名为myvg的卷组
ansible test1 -a "vgs"
//查看结果
(十九)lvol
模块
- 作用:用于管理逻辑卷,包括创建、删除、修改逻辑卷大小。
- 参数:
vg
:卷组名。lv
:逻辑卷名。size
:逻辑卷大小。state
:present
(创建)、absent
(删除)。- force:强制执行调整逻辑卷大小等操作。
创建逻辑卷:
ansible test1 -m lvol -a "vg=myvg lv=mylv1 size=1G state=present"
//通过myvg卷组创建名为mylv1的逻辑卷,大小为1G
ansible test1 -m lvol -a "vg=myvg lv=mylv2 size=1G state=present"
//通过myvg卷组创建名为mylv2的逻辑卷,大小为1G
ansible test1 -m lvol -a "vg=myvg lv=mylv3 size=1G state=present"
//通过myvg卷组创建名为mylv3的逻辑卷,大小为1G
ansible test1 -a "lvs"
//查看结果
逻辑卷扩容:
ansible test1 -m lvol -a "vg=myvg lv=mylv3 size=2G state=present"
//通过myvg卷组扩容名为mylv3的逻辑卷,大小为2G,扩容增加的空间大小不能超过指定卷组的剩余空间
ansible test1 -a "lvs"
//查看结果
逻辑卷缩容:
ansible test1 -m lvol -a "vg=myvg lv=mylv3 size=1G state=present"
//通过myvg卷组缩容名为mylv3的逻辑卷,大小为1G,未使用强制缩容参数,失败
ansible test1 -m lvol -a "vg=myvg lv=mylv3 size=1G state=present force=yes"
//使用强制缩容参数
ansible test1 -a "lvs"
//查看结果
删除逻辑卷:
ansible test1 -m lvol -a "vg=myvg lv=mylv3 state=absent"
//删除myvg卷组的mylv3逻辑卷,如果失败需要使用force参数强制删除
ansible test1 -m lvol -a "vg=myvg lv=mylv3 state=absent force=yes"
ansible test1 -a "lvs"
//查看结果
(二十)filesystem
模块
- 作用:用于格式化分区,即创建文件系统。
- 参数:
fstype
:文件系统类型(如 ext4、xfs)。dev
:指定格式化的设备。state
:present
(创建文件系统)、absent
(擦除文件系统)。force
:是否强制操作。
创建文件系统:
ansible test1 -a "lsblk"
//查看分区信息,myvg-mylv1表示/dev下的myvg下的mylv1和mylv2
ansible test1 -m filesystem -a "fstype=ext4 dev=/dev/myvg/mylv1 state=present"
//将/dev/myvg/mylv1逻辑卷格式化为ext4文件系统
ansible test1 -m filesystem -a "fstype=xfs dev=/dev/myvg/mylv2 state=present"
//将/dev/myvg/mylv2逻辑卷格式化为XFS文件系统
ansible test1 -m filesystem -a "fstype=xfs dev=/dev/vdb2 state=present"
//将/dev/vdb2磁盘格式化为XFS文件系统
ansible test1 -m filesystem -a "fstype=xfs dev=/dev/vdb2 state=present force=yes"
//如果报错使用force参数强制操作
ansible test1 -a "blkid"
//查看结果
刷新文件系统:
ansible test1 -m filesystem -a "fstype=ext4 dev=/dev/myvg/mylv2 state=present"
//刷新文件系统,将mylv2的文件系统刷新为ext4,未加force参数,失败
ansible test1 -m filesystem -a "fstype=ext4 dev=/dev/myvg/mylv2 state=present"
//加force参数
ansible test1 -m filesystem -a "fstype=xfs dev=/dev/myvg/mylv1 state=present"
//刷新文件系统,将mylv1的文件系统刷新为xfs,加force参数
ansible test1 -a "blkid"
//查看结果
(二十一)mount
模块
- 作用:用于挂载指定分区。
- 参数:
path
:挂载点路径。src
:待挂载的设备。fstype
:文件系统类型。state
:mounted
(永久挂载,立即生效)、unmounted
(临时卸载)、present
(临时挂载)、absent
(永久挂载,只做配置准备)。
挂载文件系统:
ansible test1 -a "mkdir test1"
ansible test1 -m mount -a "path=/root/test1 src=/dev/myvg/mylv1 fstype=xfs state=mounted"
//创建test1目录,并将文件系统为XFS的分区/dev/myvg/mylv1永久并立即挂载到/root/test1
ansible test1 -a "df -h test1; tail -1 /etc/fstab"
//查看结果
ansible test1 -m file -a "path=/root/test2 state=directory"
ansible test1 -m mount -a "path=/root/test2 src=/dev/myvg/mylv2 fstype=ext4 state=present"
//创建test2目录,并将文件系统为ext4的分区/dev/myvg/mylv2挂载到/root/test2
ansible test1 -a "tail -2 /etc/fstab ; lsblk"
//查看结果
取消挂载文件系统:
ansible test1 -m mount -a "path=/root/test1 src=/dev/myvg/mylv1 state=unmounted"
ansible test1 -m mount -a "path=/root/test1 src=/dev/myvg/mylv1 state=absent"
ansible test1 -m mount -a "path=/root/test2 src=/dev/myvg/mylv2 state=absent"
//取消/dev/myvg下的mylv1和mylv2的永久挂载及mylv1的临时挂载
ansible test1 -a "tail -2 /etc/fstab"
ansible test1 -a "lsblk"
(二十二)debug
模块
- 作用:打印变量信息,需要经过Gathering Facts任务收集Facts信息后再打印。
- 参数:
msg
:打印变量值,格式为{{ 变量名 }}
。var
:打印变量值,格式为变量名。
ansible all -m debug -a "msg='主机名: {{ inventory_hostname }}'"
//Ad-hoc命令实在无法收集Facts变量来提供给debug使用,所以直接使用inventory_hostname变量,即inventory中定义的主机名,之后通过Playbook再来使用Facts变量
ansible all -m debug -a "var='inventory_hostname '"
(二十三)setup
模块
- 作用:用于获取所有Facts信息。
- 参数:
filter
:用于过滤指定信息。
ansible test1 -m setup -a "filter=ansible_os_family"
//查看操作系统属于哪一族(如RedHat、Debian、Windows等)
- 注:我会在下一篇关于Ansible的博客详细介绍常用的Ansible的Facts变量。
(二十四)firewalld
模块
- 作用:用于配置 firewalld 防火墙规则。
- 参数:
port
:声明端口。permanent
:永久生效,但不会立即生效。immediate
:立即生效,临时生效。state
:enabled
(放行)、disabled
(拒绝)。
安装和启动firewalld:
ansible test1 -m yum -a "name=firewalld state=present"
//如果未安装firewalld则进行安装
ansible test1 -m service -a "name=firewalld state=started"
//启动firewalld
启动httpd和测试:
ansible test1 -m service -a "name=httpd state=started enabled=yes"
//启动httpd并设置开机自启
ansible test1 -m copy -a "dest=/var/www/html/index.html content='Thank you'"
//编写测试网页文件
curl 192.168.88.21
//放行前测试,默认firewalld是不放行80/tcp端口的
配置firewalld:
ansible test1 -m firewalld -a "port=80/tcp permanent=yes immediate=yes state=enabled"
//配置firewalld立即并永久放行tcp协议的80端口
curl 192.168.88.21
//放行后测试
(二十五)iptables
模块
- 作用:用于配置iptables规则。
- 参数:
chain
:链名称(如 INPUT、OUTPUT)。protocol
:协议类型(如 tcp、udp)。jump
:跳转目标(如 ACCEPT、DROP)。- destination_port:目标端口。
- source_port:源端口。
state
:present
(添加)、absent
(删除)。
配置iptables:
ansible test1 -m yum -a "name=firewalld state=absent"
//卸载firewalld,避免干扰
curl 192.168.88.21
//拒绝前测试
ansible test1 -m iptables -a "chain=INPUT protocol=tcp destination_port=80 jump=REJECT state=present"
//创建INPUT链的tcp协议的80端口的动作为拒绝
curl 192.168.88.21
//拒绝后测试
ansible test1 -m iptables -a "chain=INPUT protocol=tcp destination_port=80 jump=REJECT state=absent"
//删除之前创建的动作
curl 192.168.88.21
//再次测试
(二十六)cron
模块
- 作用:用于管理定时任务(Cron 任务)。
- 参数:
name
:任务描述。minute
、hour
、day
、month
、weekday
:Cron 时间表达式。job
:要执行的命令。state
:present
(添加)、absent
(删除)。
创建定时任务:
ansible test1 -m cron -a "name='test' minute='*' hour='*' day='*' month='*' weekday='*' job='/bin/echo Thanks' state=present"
//创建每分钟执行echo Thanks的定时任务
ansible test1 -a "crontab -l"
//检查结果
ansible test1 -a "cat /var/log/cron"
//至少等待一分钟再查看
ansible test1 -m cron -a "name='test' state=absent"
//删除定时任务
ansible test1 -a "crontab -l"
//查看结果
(二十七)template
模块
- 作用:
- 用于上传具备特殊格式的文件(如文件中包含变量),文件的语法叫Jinja2,文件一般以
.j2
结尾。 - 当被控节点接收到模板文件时,其中的变量将被替换为具体的值。
- 用于上传具备特殊格式的文件(如文件中包含变量),文件的语法叫Jinja2,文件一般以
- 参数:
src
:要上传的文件。dest
:目标文件路径。
echo "{{ inventory_hostname }}" >> test.j2
//创建test.j2文件,inventory_hostname是Ansible内置的特殊变量,表示inventory中定义的主机名
ansible all -m template -a "src=test.j2 dest=/root/test.txt"
//通过test.j2文件将动态内容写入所有主机的test.txt文件中
ansible all -a "ls -l test.txt ; cat test.txt"
//查看结果
(二十八)ansible.builtin.copy
模块
- 作用:类似
content
,但可以在文件中写入动态内容。 - 参数:
content
:要写入的动态内容。dest
:目标文件路径。mode
:文件权限。
ansible all -m ansible.builtin.copy -a "content='主机名: {{ inventory_hostname }}' dest=/root/dynamic.txt mode=0644"
//创建文件并写入动态内容,inventory_hostname是Ansible的内置变量,表示当前目标主机的主机名
(二十九)archive
模块
- 作用:将远程主机上的文件或目录打包并压缩为归档文件(如
.tar.gz
、.zip
等)。 - 参数:
path
:要打包的文件或目录路径。dest
:压缩后的归档文件路径。format
:归档格式(如tar
、gz
、zip
)。mode
:设置归档文件的权限。owner
:设置归档文件的属主。
ansible test1 -m archive -a "path=/root/Node1 dest=/root/Node1.tar.gz format=tar mode=0644 owner=root"
(三十)unarchive
模块
- 作用:解压归档文件。
- 参数:
src
:要解压的归档文件路径。dest
:解压目标目录。copy
:是否将本地文件复制到远程主机。remote_src
:归档文件是否已在远程主机上。mode
:设置解压后文件的权限。owner
:设置解压后文件的属主。
ansible test1 -m fetch -a "src=/root/Node1.tar.gz dest=/root/Ansible/ flat=yes"
//先将test1组的Node1.tar.gz包下载到控制节点,且不保留下载的文件的目录结构
ansible test2 -m unarchive -a "src=/root/Ansible/Node1.tar.gz dest=/root copy=yes mode=0755 owner=root"
//将控制节点的Node1.tar.gz包解压到test2组的/root目录下
//copy参数和remote-src参数互斥,同时使用会报错
ansible test2 -a "ls"
//查看结果
(三十一)sysctl
模块
- 作用:用于管理内核参数。
- 参数:
name
:内核参数名称。value
:参数值。state
:present
(设置)、absent
(删除)。reload
:是否重新加载内核参数。
关闭ip转发:
ansible test1 -a "sysctl net.ipv4.ip_forward "
//配置前检查,通常默认为1,表示开启ip转发功能,0表示关闭ip转发功能
ansible test1 -m sysctl -a "name=net.ipv4.ip_forward value=0 state=present sysctl_set=yes sysctl_file=/etc/sysctl.conf reload=yes"
//关闭ip转发功能并立即重新加载内核参数使配置生效
ansible test1 -a "sysctl net.ipv4.ip_forward"
//配置后检查
关闭ip转发:
ansible test1 -m sysctl -a "name=net.ipv4.ip_forward value=1 state=present sysctl_set=yes sysctl_file=/etc/sysctl.conf reload=yes"
//开启ip转发功能并立即重新加载内核参数使配置生效
ansible test1 -a "sysctl net.ipv4.ip_forward"
//配置后检查
(三十二)selinux
模块
- 作用:用于管理 SELinux 状态。
- 参数:
policy
:SELinux 策略。state
:enforcing
(强制)、permissive
(宽容)、disabled
(禁用)。
设置为enforcing:
ansible test1 -a "getenforce"
//配置前查看
ansible test1 -m selinux -a "policy=targeted state=enforcing"
//设置test1组的SELINUX策略为enforcing
ansible test1 -a "getenforce"
//配置后查看
设置为disabled:
ansible test1 -m selinux -a "policy=targeted state=disabled"
//设置SELINUX策略为disabled
ansible test1 -a "reboot"
//重启生效
ansible test1 -a "getenforce"
//查看
(三十三)get_url
模块
- 作用:用于从URL下载文件到指定路径。
- 参数:
url
:文件的 URL。dest
:目标路径。
ansible test1 -m get_url -a "url=https://yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64/getPackage/ansible-core-2.13.3-1.el8.x86_64.rpm dest=/root mode=0644"
//通过get_url模块来从网上下载Ansible的核心引擎包,并设置文件权限为0644
(三十四)authorized_key
模块
- 作用:用于管理用户的 SSH 授权密钥。
- 参数:
user
:目标主机上的用户名。state
:present
(添加)、absent
(删除)。key
:SSH 公钥内容(可以是字符串或文件路径,lookup
插件读取本地文件,更推荐)。path
: 指定authorized_keys
文件的路径(默认~/.ssh/authorized_keys
)。
ansible test1 -m user -a "name=Node1 group=root groups=root,nobody uid=1000 password={{ 'password' | password_hash('sha512') }} state=present create_home=yes"
//创建测试用户
ssh Node1@Node1
//拷贝公钥前测试,此时需要输入密码
ansible test1 -m authorized_key -a "user=Node1 state=present key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}' path=/home/Node1/.ssh/authorized_keys"
//拷贝公钥给test1主机组的Node1用户
//lookup插件会读取本地公钥文件/root/.ssh/id_rsa.pub的内容作为公钥
ssh Node1@Node1
//拷贝公钥后测试,此时不需要输入密码
ansible test1 -m authorized_key -a "user=Node1 key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}' state=absent"
//删除test1主机组的Node1用户的公钥
ssh Node1@Node1
//测试