ansible(不能交互)
1、定义
基于python开发的一个配置管理和应用部署工具,在自动化运维中异军突起,类似于xshell一键输入的工具,不需要每次都切换主机进行操作,只要有一台ansible的固定主机,就可以实现所有节点的操作。不需要agent客户端,只需要一台主机上配置ansible即可。ansible基于模块进行工作,只是提供一种运行架构,真正执行操作、变更的是asible的模块来实现的
2、作用
①远程操作主机功能
②自动化运维
③批量配置、部署、管理上千台主机
3、如何实现通信
asible默认通过ssh的密钥对实现通信(可以改)
4、ansible的另一个特点
所有模块都是幂等性
幂等性:多次操作或多次执行对系统资源的影响是一致的
| 是幂等性 | 不是幂等性 |
| http get …… | http post(多次执行相同的post可能会创建相同的资源) …… |
| systemctl stop firewalld …… | systemctl restart firewalld …… |
| 只要发现要停止的目标服务已经停止了,后续同样的操作,不会改变任何结果,什么也不做 | |
ansible的幂等性,决定了可以放心大胆使用,重复执行某个任务不会对结果产生任何影响(绝大多数情况下)
5、ansible的四大组件
(1)inventory主机清单(主机组):定义ansible可以远程操作的服务器
(2)模块:13个常用的模块。通过模块实现远程配置和操作
(3)Plugins插件
(4)Playbook剧本(shell脚本):yaml格式
6、ansible的优点
(1)部署简单,只要在控制主机部署即可,被控制主机需要有ssh和python2.5以上版本,基本上linux都是自带的这两个条件
(2)ansible只能控制linux系统,windows系统不行
(3)基于模块工作,可以使用任意语言开发模块(二次开发底层架构)
安装ansible实验
| 主机名 | 作用 | IP地址 | 服务 |
| test1 | 管理端 | 20.0.0.10 | ansible |
| test2 | 被管理端 | 20.0.0.20 | / |
| test3 | 20.0.0.30 | / |
1、安装epel源、ansible、tree服务




| ansible.cfg | ansible的主配置文件(一般不动) |
| hosts | 主机组,声明可以被控制的主机 |
| roles | 公共角色目录(一般不用) |
2、修改ansible配置文件
配置主机有两种方式:
①直接声明主机的IP地址(最常用)
②主机名(一定要在/etc/hosts中做映射)


3、生成密钥对
ssh-keygen -t rsa

4、把密钥对传给对应主机

被管理端同样如此

ansible安装完成

5、测试
ansible 20.0.0.20 -m command -a 'date'
tail -f /var/log/messages


①指定IP地址(只会在目标主机执行)
ansible 20.0.0.20 -m command -a 'ls /opt'


②指定执行组(组内所有声明的主机都会执行)
ansible dbservers -m command -a 'ls /opt'(dbservers是组名)

③所有声明的主机都会执行
ansible all -m command -a 'ls /opt'

ansible 20.0.0.20 -a 'ls /opt'
#不加-m也就是不声明使用的模块,默认是command模块
7、ansible的命令格式
ansible 组名/IP地址 -m 模块名称 -a ‘参数列表(执行命令)’
8、ansible的13个模块
(1)模块1:command模块:默认模块。在远程主机执行linux命令,不支持管道符及重定向输出
| command常用参数 | |
| chdir | 在远程主机上运行命令,提前进入目录(先进入目录再执行命令)
|
| creates | 判断指定文件是否存在,若存在不执行后续操作
|
| removes | 判断指定文件是否存在,若存在执行后续操作
|
(2)模块2:shell模块:在远程主机执行命令,相当于调用远程主机的shell进程,支持管道符和重定向
实题1:创建用户并加密



测试:
![]()
实题2:过滤出IP地址


注意:在ansible中,多个引号要做隔离

&&表示逻辑且,前一个命令执行成功才会执行后一个命令

;表示逻辑或,前面成功与否,后面的命令都会执行
实题3:指定主机上创建一个脚本,在脚本中写入一个内容#!/bin/bash
ifconfig,然后运行这个脚本
ansible 20.0.0.20 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/jiaoben.sh ; sh /opt/jiaoben.sh'

-e 表示换行
实题4:两个数相加,运行脚本
ansible 20.0.0.20 -m shell -a 'echo -e "#!/bin/bash\na=$((2+3))\necho \$a" > /opt/jiaoben.sh ; sh /opt/jiaoben.sh'

(3)模块3:cron模块:远程给主机设置定时任务
两种状态:
①present表示添加(默认,可以省略)
②absent表示移除(absent在整个ansible语法中都表示移除)
| 分 | 时 | 日 | 月 | 周 |
| minute | hour | day | month | weekday |
| job | 任务执行的命令 |
| name | 任务计划的名称(可以不加) |
实题1:创建定时任务,每隔5分钟执行ls /opt,任务名称test1
ansible 20.0.0.20 -m cron -a 'minute="*/5" job="ls /opt" name="test1"'

实题2:9月1号早上8点三十分,执行ls /opt,任务名称test3
ansible 20.0.0.20 -m cron -a 'minute="30" hour="8" day="1" month="9" job="ls /opt" name="test3"'

实题3:周三下午14:30分,执行ls /opt
ansible 20.0.0.20 -m cron -a 'minute="30" hour="14" weekday="*/3" job="ls /opt"'

实题4:删除定时任务
ansible 20.0.0.20 -m cron -a 'name=test1 state=absent'

ansible 20.0.0.20 -m cron -a 'name=None state=absent'

注意:多个计划任务,如果不指定名称,一旦删除None,多个None均删除,不建议使用,一定要指定任务名称
(4)模块4:user模块:用户管理模块
| user模块常用参数 | |
| name | 指定用户名(必须加) |
| state | =present创建用户(默认,可以不加) =absent删除用户(必须加) |
| system | =yes用户是一个程序用户 n=o用户不是一个程序用户 |
| uid | 用户的唯一标识 |
| group | 用户所在组 |
| create_home | =yes替换用户的家目录 =no不替换用户的家目录(可以不加) |
| password | 创建用户的密码 |
| comment | 用户的注释信息(可有可无) |
| remove | =yes删除用户的家目录(相当于userdel -r) 不需要删除用户的家目录,可以不写 |
| 注:使用ansible的user模块创建用户时,若创建普通用户可以不加system=yes和shell类型,默认是/bin/bash;若创建程序用户,一定要声明system=yes和shell=/sbin/nologin,也可以指定uid方式,给用户分配一个uid | |
实题1:创建一个程序用户yyy
程序用户uid范围1-999
普通用户1000开始


注意:在创建用户时,虽然声明一个程序用户,但默认的登录shell没有额外声明,但还是默认的/bin/bash,uid还是会安装程序用户来指定


实题2:远程创建用户,指定uid,创建密码和家目录


实题3:修改用户的家目录


实题4:删除用户并删除其家目录
ansible 20.0.0.20 -m user -a 'name=ttt remove=yes state=absent'

测试

(5)模块5:group模块:用户组的管理模块
| group常用参数 | |
| name | 指定名称(必须加) |
| gid | 设置组的id |

![]()

实题1:创建用户添加到指定组中
ansible 20.0.0.20 -m user -a 'name=rrrrr uid=1011 group=ppp'


实题2:删除组(若组里有用户,先删除用户再删除组)
ansible 20.0.0.20 -m group -a 'name=ppp state=absent'

(6)模块6:ping模块:测试主机之间的连通性
ansible all -m ping

(7)模块7:hostname模块:指定远程主机的主机名
ansible 20.0.0.20 -m hostname -a 'name=yyy'


(8)模块8:copy模块:复制指定的主机文件到远程主机的模块(主机→远程主机)
| copy模块常用参数 | |
| dest (指目标) | 指出要复制的文件位置(必须是绝对路径)。若是源目标是目录,指目标也须是目录,若目标的文件存在,会覆盖原有的内容 |
| src (源目标) | 复制文件的源(必须是绝对路径),源目标是目录,指目标也须是目录(复制的目录不能为空) |
| owner | 指定文件的所有者 |
| group | 指定文件的所在组 |
| content | 从主机复制指定的内容到目标主机(content和src冲突) |
| mode | 指定复制之后的文件的权限 |
ansible 20.0.0.20 -m copy -a 'src=/opt/123 dest=/opt/123.txt owner=yst mode=655'


ansible 20.0.0.20 -m copy -a 'content="hello world" dest=/opt/hello.txt'


实题1:在目标主机创建一个用户叫guoqi,system=yes,shell=/sbin/nologin,复制文件ky32.txt,ky32.txt,所有者和所在组都是guoqi,权限是600
ansible 20.0.0.20 -m user -a 'name=guoqi system=yes shell=/sbin/nologin'
ansible 20.0.0.20 -m copy -a 'src=/opt/ky32.txt dest=/opt/ky32.txt owner=guoqi group=guoqi mode=600'



实题2:复制目录guoqi,目标叫guoqi1,权限mode777




(9)模块9:file模块:管理文件属性(与目录无关)
| file模块常用参数 | |
| owner | 指定文件的所有者 |
| group | 指定文件的所在组 |
| mode | 指定复制之后的文件的权限 |
| state | =link创建连接文件 =touch创建文件 =absent删除文件 |
远程创建文件
ansible 20.0.0.30 -m file -a 'path=/opt/test.txt state=touch'


创建连接文件

远程删除文件

实题1:file模块创建一个文件,ky32.txt,所有者和所在组guoqi,权限700
ansible 20.0.0.20 -m file -a 'state=touch path=/opt/ky32.txt group=guoqi owner=guoqi mode=700'

实题2:给/etc/fstab创建一个软连接,这个文件是目标主机/opt/fstab.bak复制过来的文件,这个复制文件/opt/fstab.bak在目标主机的/opt下,创建一个新的文件fstab.link作为fstab.bak的软连接
ansible 20.0.0.20 -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak'
ansible 20.0.0.20 -m file -a 'state=link path=/opt/fstab.link src=/opt/fstab.bak'


(10)模块10:yum模块:在远程主机上安装和卸载软件包(在目标主机上的操作都是后台运行,不影响其他用户的使用)
①安装ansible 20.0.0.20 -m yum -a 'name=tree'


②卸载ansible 20.0.0.20 -m yum -a 'name=tree state=absent'




实题:查询远程主机httpd的状态,开启,访问this is httpd



![]()

(11)模块11:service/systemd模块
| service/systemd模块常用参数 | |
| name | 设定管理服务的名称 |
| state | =started开启 =stopped停止 =restarted重启 |
| enabled | =true开机自启 不设置表示开机不自启 |
| runlevel | 配合enabled,若是开机自启,可以设置运行级别(在命令行可以设置但不生效,必须在playbook中声明) |
ansible 20.0.0.20 -m service -a 'enabled=true name=httpd state=restarted'

实题:在目标主机安装nginx,设置为开机自启,设置访问页面this is nginx
| 安装epel源 | ansible 20.0.0.30 -m service -a 'name=epel-release' |
| 安装nginx | ansible 20.0.0.30 -m yum -a 'name=nginx' |
| 开机自启 | ansible 20.0.0.30 -m service -a 'state=started name=nginx enabled=true' |
| 查看nginx状态 | ansible 20.0.0.30 -a 'systemctl status nginx' |
| 设置访问页面 | ansible 20.0.0.30 -m shell -a 'echo "this is nginx"> /usr/share/nginx/html/index.html' |
| 访问nginx页面 | ansible 20.0.0.30 -a 'curl 20.0.0.30' |




(12)模块12:script模块:运行本地脚本,结果输出到目标主机




实题:写一个shell脚本,内容:touch 123 echo “郭琪真帅” >123,所有主机都能执行
![]()


(13)模块13:setup模块:查看目标主机的系统信息(facts)
用filter来设置过滤条件
ansible 20.0.0.20 -m setup

查看IP地址ansible all -m setup -a 'filter=*ipv4'

查看系统时间ansible all -m setup -a 'filter=ansible_date_time'

查看内存ansible all -m setup -a 'filter=*memory*'

查看内核ansible all -m setup -a 'filter=*proc*'

查看系统ansible all -m setup -a 'filter=*os*'

查看系统信息ansible all -m setup -a 'filter=*system*'

查看硬盘ansible all -m setup -a 'filter=*dev*'

9、主机清单
![]()

| 主机清单管理组中的的变量名 | |
| ansible_host | 连接时的IP地址 |
| ansible_port | 声明对方的连接端口,默认是ssh的22端口 |
| ansible_user | 指定连接时使用对方主机的用户名。不指定主机执行ansible的用户即为使用目标主机的用户名
|
| ansible_password | 指定连接ssh时的密码(目标主机的用户密码) |
| ansible_become | 提升用户权限 |
| ansible_become root ansible_become_password | 指定切换用户的密码(免密钥登录) |
(1)免密连接
20.0.0.2[2:9]声明范围,[a:f]声明主机名(声明主机名时要在/etc/hosts中做映射)
取消密钥对认证
![]()

修改配置文件
![]()
①免密连接单个主机


②免密连接多个主机

[all:vars]不能随意起,有些没效


(2)组嵌套


实题:写一个编译安装nginx的脚本,在所有主机都生效
![]()





![]()
相关文章:
ansible(不能交互)
1、定义 基于python开发的一个配置管理和应用部署工具,在自动化运维中异军突起,类似于xshell一键输入的工具,不需要每次都切换主机进行操作,只要有一台ansible的固定主机,就可以实现所有节点的操作。不需要agent客户端…...
黑马点评06分布式锁 2Redisson
实战篇-17.分布式锁-Redisson功能介绍_哔哩哔哩_bilibili 1.还存在的问题 直接实现很麻烦,借鉴已有的框架。 2.Redisson用法 3.Redisson可重入原理 在获取锁的时候,看看申请的线程和拿锁的线程是否一致,然后计算该线程获取锁的次数。一个方法…...
深度剖析知识图谱:方法、工具与实战案例
💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 知识图谱作为一种强大的知识表示和关联技术&am…...
Oracle中的dblink简介
Oracle中的dblink简介 是一种用于在不同数据库之间进行通信和数据传输的工具。它允许用户在一个数据库中访问另一个数据库中的对象,而无需在本地数据库中创建这些对象。 使用dblink,用户可以在一个数据库中执行SQL语句,然后访问另一个数据库中…...
ubuntu安装显卡驱动过程中遇到的错误,及解决办法!
ubuntu安装显卡驱动的过程中,可能会遇到以下问题,可以参考解决办法! 问题1: ERROR: An error occurred while performing the step: "Building kernel modules". See /var/log/nvidia-installer.log for details. …...
【程序】STM32 读取光栅_编码器_光栅传感器_7针OLED
文章目录 源代码工程编码器基础程序参考资料 源代码工程 源代码工程打开获取: http://dt2.8tupian.net/2/28880a55b6666.pg3这里做了四倍细分,在屏幕上显示 速度、路程、方向。 接线方法: 单片机--------------串口模块 单片机的5V-------…...
TestSSLServer4.exe工具使用方法简单介绍(查SSL的加密版本SSL3或是TLS1.2)
一、工具使用方法介绍 工具使用方法参照:http://www.bolet.org/TestSSLServer/ 全篇英文看不懂,翻译了下,能用到的简单介绍如下: 将下载的TestSSLServer4.exe工具放到桌面上,CMD命令行进入到桌面目录,执…...
新年跨年烟花超酷炫合集【内含十八个烟花酷炫效果源码】
❤️以下展示为全部烟花特效效果 ❤️下方仅展示部分代码 ❤️源码获取见文末 🎀HTML5烟花喷泉 <style> * {padding:0;margin:0; } html,body {positi...
计算机网络考研辨析(后续整理入笔记)
文章目录 体系结构物理层速率辨析交换方式辨析编码调制辨析 链路层链路层功能介质访问控制(MAC)信道划分控制之——CDMA随机访问控制轮询访问控制 扩展以太网交换机 网络层网络层功能IPv4协议IP地址IP数据报分析ICMP 网络拓扑与转发分析(重点…...
JMESPath语言
JMESPath(JSON Matching Expression Path) 一种查询语言。 主要用于从JSON文档中检索和过滤数据。 通过写表达式提取和处理JSON数据,而无需编写复杂的代码。 功能:数据提取、过滤、转换、排序。 场景:处理API响应…...
【C++高阶(七)】C++异常处理的方式
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:C从入门到精通⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你学习C 🔝🔝 异常处理的方式 1. 前言2. C语言处理异常的方式…...
在Idea中创建基于工件的本地服务
目录 1、创建基于工件的Tomcat服务器: 2、修改名称: 3、修改服务器项: 4、部署项 5、最后记得点右下角的【应用】和【确定】保存。 1、创建基于工件的Tomcat服务器: 运行->编辑配置->【Tomcat服务器】->本地 2、修…...
十六、YARN和MapReduce配置
1、部署前提 (1)配置前提 已经配置好Hadoop集群。 配置内容: (2)部署说明 (3)集群规划 2、修改配置文件 MapReduce (1)修改mapred-env.sh配置文件 export JAVA_HOM…...
自己动手写编译器:语法解析的基本原理
在前面系列章节中我们完成了词法解析。词法解析的基本任务就是判断给定字符串是否符合特定规则,如果符合那么就给这个字符串分配一个标签(token)。词法解析完成后接下来的工作就要分配给语法解析,后者的任务就是判断一系列标签的组合是否符合特定规范。 …...
VS Code解决乱码
在上边搜索栏输入“>Change File Encoding”,更改编码格式,解决乱码格式。 VS Code会帮助确认编码格式,然后选择就好。 最后完成如下:...
宝塔Linux:部署His医疗项目通过jar包的方式
📚📚 🏅我是默,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Linux》。🎯🎯 🚀无论你是编程小白,还是有…...
Vim命令大全(超详细,适合反复阅读学习)
Vim命令大全 Vim简介Vim中的模式光标移动命令滚屏与跳转文本插入操作文本删除操作文本复制、剪切与粘贴文本的修改与替换文本的查找与替换撤销修改、重做与保存编辑多个文件标签页与折叠栏多窗口操作总结 Vim是一款文本编辑器,是Vi编辑器的增强版。Vim的特点是快速、…...
爬虫持久化保存
## open方法- 方法名称及参数markdown **open(file, moder, bufferingNone, encodingNone, errorsNone, newlineNone, closefdTrue)****file** 文件的路径,需要带上文件名包括文件后缀(c:\\1.txt)**mode** 打开的方式(r,w,a,x,b,t…...
统一大语言模型和知识图谱:如何解决医学大模型-问诊不充分、检查不准确、诊断不完整、治疗方案不全面?
统一大语言模型和知识图谱:如何解决医学大模型问诊不充分、检查不准确、诊断不完整、治疗方案不全面? 医学大模型问题如何使用知识图谱加强和补足专业能力?大模型结构知识图谱增强大模型的方法 医学大模型问题 问诊。偏离主诉和没抓住核心。…...
读写分离之同步延迟测试
背景 读写分离是快速提高数据库性能的手段,主库只负责写入,从库负责查询。但在性能得到提升的同时,编程的复杂度就会提升。由其碰到主从同步延迟的情况,在数据写入后,在从库无法读取到最新数据,会对业务逻…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...
英国云服务器上安装宝塔面板(BT Panel)
在英国云服务器上安装宝塔面板(BT Panel) 是完全可行的,尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎,虽然官方主要面向中国大陆…...
华为OD机考- 简单的自动曝光/平均像素
import java.util.Arrays; import java.util.Scanner;public class DemoTest4 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint[] arr Array…...
华为云Flexus+DeepSeek征文 | MaaS平台避坑指南:DeepSeek商用服务开通与成本控制
作者简介 我是摘星,一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型,将实际使用经验分享给大家,希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 前言 一、技术架构概览 1.1 整体架构设…...
开源项目实战学习之YOLO11:12.6 ultralytics-models-tiny_encoder.py
👉 欢迎关注,了解更多精彩内容 👉 欢迎关注,了解更多精彩内容 👉 欢迎关注,了解更多精彩内容 ultralytics-models-sam 1.sam-modules-tiny_encoder.py2.数据处理流程3.代码架构图(类层次与依赖)blocks.py: 定义模型中的各种模块结构 ,如卷积块、残差块等基础构建…...
【芯片仿真中的X值:隐藏的陷阱与应对之道】
在芯片设计的世界里,X值(不定态)就像一个潜伏的幽灵。它可能让仿真测试顺利通过,却在芯片流片后引发灾难性后果。本文将揭开X值的本质,探讨其危害,并分享高效调试与预防的实战经验。 一、X值的本质与致…...




