Ansible Playbook 进阶探秘:Handlers、变量、循环及条件判断全解析
192.168.60.100 | ansible.com |
192.168.60.110 | client-1.com |
192.168.60.120 | client-2.com |
192.168.60.130 | client-1.com |
一、Handlers
介绍:在发生改变时执行的操作(类似puppet通知机制)
示例:
当apache的配置文件发生改变时,apache服务才会重启。
- hosts: webservers
remote_user: root
tasks:
- name: apache
yum: name=httpd state=present
- name: apache config
copy: src=/config/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- start httpdhandlers:
- name: start httpd
service: name=httpd state=restarted
测试:
配置文件没有改变——
(可以看到没有重启服务的任务)
修改apache的配置——
[root@ansible playbook]# vim /config/httpd.conf #修改端口
Listen 8080
(当配置发生修改后,可以看到重启服务的任务已经被执行)
二、变量的使用
常用的变量一般就两种:
- 一种为用户自己定义的变量
- 一种为facts获取的变量(即ansible webserver -m setup查到的变量)
1.自定义变量
(1)用户在.yml文件自定义变量
示例:
[root@ansible playbook]# vim test1.yaml
- hosts: webservers
remote_user: root
vars:
- var1: "abc"
- var2: 123
tasks:
- name: test vars
shell: echo "{{ var1 }} {{ var2 }}" >> /tmp/var.txt
测试:
(定义的变量成功写入到被管控端主机的var.txt文件)
(2)通过-e参数传递变量
示例:
[root@ansible playbook]# vim test2.yaml
- hosts: webservers
remote_user: root
tasks:
- name: install package
yum: name={{ packname }} state=present
测试:
(使用-e传递参数安装namp)
(3)通过主机/主机组配置文件传递变量
主机——
示例:
[root@ansible playbook]# vim /etc/ansible/hosts
192.168.60.110 packname=nmap
[root@ansible playbook]# vim test3.yaml
- hosts: 192.168.60.110
remote_user: root
tasks:
- name: install package
yum: name={{ packname }} state=present
测试:
(参数成功传递)
主机组——
示例:
[root@ansible playbook]# vim /etc/ansible/hosts
[webservers]
192.168.60.110
192.168.60.120
192.168.60.130
[webservers:vars]
packname=nmap
[root@ansible playbook]# vim test4.yaml
测试:
(参数传递成功)
2.通过facts获取的系统的变量
(1)获取系统变量
即ansible webserver -m setup查到的变量
使用方法:
[root@ansible playbook]# ansible webservers -m setup > /tmp/fact.txt
[root@ansible playbook]# vim /tmp/fact.txt
在剧本中直接调用这些变量名就行,但是注意这些变量名是分级别的,对齐的就是同一级,比如ansible_default_ipv4和ansible_nodename就是同一级,address是ansible_default_ipv4的 下一级,要调用它就需要在ansible_default_ipv4后面加上一个“.”,就是写成这样ansible_default_ipv4.address。
(其实就是字典,以键值对的方式关联起来,这里说变量是为了帮助理解)
示例:
[root@ansible playbook]# vim facts.yaml #获取ip、主机名等系统变量信息
- hosts: webservers
remote_user: root
tasks:
- name: hostname ipaddrss
shell: echo "{{ ansible_default_ipv4.address }} {{ ansible_nodename }}" > /tmp/facts.txt
- name: fetch file /tmp/facts
fetch: src=/tmp/facts.txt dest=/tmp
测试:
[root@ansible playbook]# ansible-playbook facts.yaml
(2)本地facts(facts.d)自定义系统变量
解释:就是定义ansible webserver -m setup查到的变量
示例:
[root@client-1 ~]# mkdir -p /etc/ansible/facts.d #在被管控端创建如下目录
[root@client-1 ~]# touch /etc/ansible/facts.d/test.fact #创建文件
[root@client-1 ~]# vim /etc/ansible/facts.d/test.fact #写入要定义的变量名
[general]
test_test1=123
test_test2=abc
测试:
[root@ansible playbook]# ansible 192.168.60.110 -m setup | grep test_test
#获取自定义的系统变量
(获取成功!)
3.变量注册
介绍:在 Ansible 的 Playbook 里,变量注册是一项非常实用的功能。借助它,我们能够把某个命令的执行结果存储到变量中,方便后续使用。这一特性能够在很多场景下避免编写特定于站点的复杂逻辑。比如,你可以利用变量注册来检查系统中是否存在某个特定程序。具体操作时,只需使用 register 关键字指定用于存储结果的变量即可。通过这种方式,你可以在后续任务中根据存储的结果进行条件判断和进一步操作。
示例:
[root@ansible playbook]# vim test5.yaml
- hosts: webservers
remote_user: root
tasks:
- name: get user info
shell: grep ^root /etc/passwd
register: pass_content
- name: save info
shell: echo {{ pass_content }} > /tmp/user.txt
(获取root用户信息存进pass_content里面)
测试:
(可以看到存入客户端/tmp/user.txt文件下的信息是以键值对的形式,我们可以用来调用这些键值对,这个需要和后面要学的判断结合起来使用,单独看确实没什么用,下面是如何调用)
[root@ansible playbook]# vim test5.yaml #调用
- hosts: webservers
remote_user: root
tasks:
- name: get user info
shell: grep ^root /etc/passwd
register: pass_content
- name: save info
shell: echo {{ pass_content.stdout }} > /tmp/user1.txt
[root@ansible playbook]# ansible-playbook test5.yaml
[root@client-1 ~]# cat /tmp/user1.txt
三、剧本中的条件判断
ansible和puppet软件相同 是可以支持条件判断,使用when语句。
示例1
[root@ansible playbook]# vim test6.yaml
- hosts: webservers
remote_user: root
tasks:
- name: install tree
yum: name=tree state=present
when: ansible_nodename == "client-1.com"
- name: install nmap
yum: name=nmap state=present
when: ansible_nodename == "client-2.com"
(设置条件判断,当被管控端的主机名叫client-1.com时安装tree,叫client-2.com时安装nmap)
测试:
(可以看到条件判断将不符合条件的主机全部跳过去了)
示例2
条件判断+变量注册
[root@ansible playbook]# vim apache_test.yaml
- hosts: webservers
remote_user: root
tasks:
- name: get pkg info
shell: rpm -qa | grep httpd | awk -F'-' 'NR == 1 {print$1}'
register: pkginfo
- name: install httpd
yum: name=httpd state=present
when: pkginfo.stdout != "httpd"
测试:
[root@ansible playbook]# ansible-playbook apache_test.yaml
(由于我的三台被管控机都安装过了httpd,所以可以看到都跳过去了)
(紫色字体的警告不用管,没有影响,如果嫌烦可以按照下面的方式去掉)
[root@ansible playbook]# vim /etc/ansible/ansible.cfg
command_warnings=False
(这样执行就没有警告了)
示例3
源码部署nginx并启动服务
1.规划
基础功能:
- 本地部署,打包
- 需要判断目标主机是否已经安装nginx
扩展:
- 通过配置文件是否改动触发启动
2.准备本地源码包nginx
[root@ansible /]# wget https://nginx.org/download/nginx-1.27.4.tar.gz
(复制链接直接wget就行,这样就在本地下载下来了nginx的源码包)
[root@ansible /]# tar -xvf /nginx-1.27.4.tar.gz -C /usr/local/src/
[root@ansible /]# cd /usr/local/src/nginx-1.27.4/
[root@ansible nginx-1.27.4]# yum install gcc gcc-c++ pcre-devel zlib-devel
[root@ansible nginx-1.27.4]# useradd -m -s /sbin/nologin nginx
[root@ansible nginx-1.27.4]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx
[root@ansible nginx-1.27.4]# make
[root@ansible nginx-1.27.4]# make install
[root@ansible local]# cd /usr/local
[root@ansible local]# tar -zcvf /playbook/nginx.tar.gz nginx/
3.编写剧本
[root@ansible playbook]# vim snginx_install.yaml
- hosts: webservers
remote_user: root
tasks:
- name: copy nginx
copy: src=/playbook/nginx.tar.gz dest=/tmp
- name: get nginx info
shell: ls -d /usr/local/nginx
register: nginx_info
ignore_errors: yes
- name: unzip nginx
shell: tar -xvf /tmp/nginx.tar.gz -C /usr/local
when: nginx_info.rc == 2
- name: add user
user: name=nginx state=present
- name: modify nginx
file: path=/usr/local/nginx owner=nginx group=nginx recurse=yes state=directory
剧本说明:
- hosts: webservers
remote_user: root
tasks:
- name: copy nginx #拷贝源码到到管控机
copy: src=/playbook/nginx.tar.gz dest=/tmp
- name: get nginx info #注册变量用于判断是否安装了nginx
shell: ls -d /usr/local/nginx
register: nginx_info
ignore_errors: yes #未安装过nginx会报错,这里用来跳过保存,继续执行剧本
- name: unzip nginx #解压安装nginx
shell: tar -xvf /tmp/nginx.tar.gz -C /usr/local
when: nginx_info.rc == 2 #判断是否安装过nginx
- name: add user #添加nginx用户
user: name=nginx state=present
- name: modify nginx #递归设置用户和所属组为nginx
file: path=/usr/local/nginx owner=nginx group=nginx recurse=yes state=directory
相关说明:
ignore_errors: yes #当某个任务执行时出现错误,ignore_errors模块等于yes时,不会让整个剧本执行中断,而是会忽略这个错误,继续执行后续的任务
nginx.rc == 2 #这个是register的返回值,当返回值等于2的时候表明/usr/local/nginx目录已经存在
recurse=yes #这个是递归的修改权限
测试:
[root@ansible playbook]# ansible-playbook snginx_install.yaml
(可以看到注册变量任务的报错,因为没有安装过nginx,但是因为添加了ignore_errors模块,成功跳过了错误,继续执行剧本后面剩下的任务)
(被管控端的所有主机安装成功)
(这时候再执行就可以看到,注册变量模块没有再报错,因为所有节点都已经安装了nginx,而且解压nginx的任务判断成功也生效,安装过nginx的被管控机没有再次执行解压nginx的任务,这就节约了在实际运维场景下的时间)
4.扩展
[root@ansible playbook]# vim snginx_install.yaml
- hosts: webservers
remote_user: root
tasks:
- name: copy nginx
copy: src=/playbook/nginx.tar.gz dest=/tmp
- name: get nginx info
shell: ls -d /usr/local/nginx
register: nginx_info
ignore_errors: yes
- name: unzip nginx
shell: tar -xvf /tmp/nginx.tar.gz -C /usr/local
when: nginx_info.rc == 2
- name: add user
user: name=nginx state=present
- name: modify nginx
file: path=/usr/local/nginx owner=nginx group=nginx recurse=yes state=directory
- name: nginx config
copy: src=/playbook/nginx.conf dest=/usr/local/nginx/conf
notify:
- restart nginxhandlers:
- name: restart nginx
shell: /usr/local/nginx/sbin/nginx -s reload
测试:
启动管控端的nginx服务——
[root@client-1 ~]# /usr/local/nginx/sbin/nginx
[root@client-2 ~]# /usr/local/nginx/sbin/nginx
[root@client-3 ~]# /usr/local/nginx/sbin/nginx
配置文件nginx.conf没有修改——
[root@ansible playbook]# ansible-playbook snginx_install.yaml
(因为配置没有修改,所以nginx服务不会被重启,这样节约了时间)
修改nginx.conf的配置,将nginx的端口设置为8080——
[root@ansible playbook]# vim nginx.conf
listen 8080;
[root@ansible playbook]# ansible-playbook snginx_install.yaml
(配置文件发生改动,管控端重启被管控端所有主机的nginx服务)
四、剧本中的循环
剧本的循环是使用with_items关键字实现的。
(这个功能使用很少,判断功能用到的比较多)
示例1
添加abc1-abc3用户
[root@ansible playbook]# vim cycle.yaml
- hosts: webservers
remote_user: root
tasks:
- name: add user
user: name={{ item }} state=present
with_items:
- abc1
- abc2
- abc3
测试:
[root@ansible playbook]# ansible-playbook cycle.yaml
(用户再被管控端创建成功!)
示例2
依次安装软件 nmap wget tree
[root@ansible playbook]# vim cycle-1.yaml
- hosts: webservers
remote_user: root
tasks:
- name: pack install
user: name={{ item }} state=present
with_items:
- tree
- namp
- vsftpd
测试:
(软件安装成功!)
相关文章:
Ansible Playbook 进阶探秘:Handlers、变量、循环及条件判断全解析
192.168.60.100ansible.com192.168.60.110 client-1.com 192.168.60.120client-2.com192.168.60.130client-1.com 一、Handlers 介绍:在发生改变时执行的操作(类似puppet通知机制) 示例: 当apache的配置文件发生改变时,apache服务才会重启…...
解决GraalVM Native Maven Plugin错误:JAVA_HOME未指向GraalVM Distribution
目录 问题描述解决方案为什么需要这样配置? 问题描述 在你的项目中,如果你遇到了以下错误信息: [ERROR] Failed to execute goal org.graalvm.buildtools:native-maven-plugin:0.10.5:test (native-test) on project DIctSystemInJavaUsing…...
006贪心——算法备赛
跨步问题 跳跃游戏|| 问题描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j &…...
Hyperlane:高性能 Rust HTTP 服务器框架评测
Hyperlane:高性能 Rust HTTP 服务器框架评测 在当今快速发展的互联网时代,选择一个高效、可靠的 HTTP 服务器框架对于开发者来说至关重要。最近,我在评估各种服务器框架性能时,发现了一个名为 Hyperlane 的 Rust HTTP 服务器库&a…...
解锁多元养生密码,开启活力生活
在车水马龙、节奏飞快的现代社会,亚健康像阴霾一样,笼罩着不少人的生活。不少上班族长期久坐,肩颈酸痛;有的人作息混乱,皮肤状态差。想要驱散这些健康阴霾,拥抱活力生活,不妨解锁下面这些多元养…...
如何安全地访问AWS
如何安全地访问AWS 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 如何安全地访问AWS当可以使用AWS Organizations & IAM Identity Center时理想的访问方式补充:什么是IAM IIC…...
机器视觉工程师的专业精度决定职业高度,而专注密度决定成长速度。低质量的合群,不如高质量独处
在机器视觉行业,真正的技术突破往往诞生于深度思考与有效碰撞的辩证统一。建议采用「70%高质量独处30%精准社交」的钻石结构,构建可验证的技术能力护城河。记住:你的专业精度决定职业高度,而专注密度决定成长速度。 作为机器视觉工…...
Linux的 `sysctl` 命令 笔记250404
Linux的 sysctl 命令 笔记250404 sysctl 是 Linux 系统中用于 动态查看和修改内核运行时参数 的核心工具。它通过 /proc/sys/ 目录的虚拟文件系统接口,允许用户在不重启系统的前提下调整内核行为,涵盖网络、内存、文件系统等关键功能。 📜 核…...
prism WPF 导航
导航和浏览器的后退前进是一样的功能 项目结构 App.xaml.cs using Prism.Ioc; using Prism.Modularity; using Prism.Unity; using PrismWpfApp.ViewModels; using PrismWpfApp.Views; using System; using System.Collections.Generic; using System.Configuration; using S…...
Pytorch实现线性分类
目录 1.导包 2.加载数据 3.获取X与Y数据 4.将X,Y数据转化成tensor张量, tensor张量必须是二维数据 5.用封装的API实现线性分类 5.1导包 5.2建模-神经网络(二分类问题) 5.3定义损失函数 5.4定义优化器 5.5定义训练过程 5.6 计算正确…...
使用人工智能大模型kimi,如何免费高效制作PPT?
今天我们学习人工智能大模型kimi,如何免费协助我们做班会PPT。 免费手把手讲解视频,请访问 https://edu.csdn.net/learn/40402/666417 第一步使用谷歌浏览器,搜索Kimi,看到Kimi智能助手,点击,在Kimi对话框…...
YOLO学习笔记 | 基于YOLO与光流融合的车牌识别方法研究(附Matlab代码)
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓 基于YOLO与光流融合的车牌识别方法研究 🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓 摘要 针对动态场景下车牌识别易受运动模糊影响的问题,提出结合YOLO目标检测与Lucas-Kanade…...
leetcode 数组总结篇
基础理论 数组:下标时从 0 开始的,地址是连续的,不能删除,只能覆盖;数组的实现:vector动态数组 常用操作 头文件 #include <iostream> #include <vector> #include <cstdint> // IN…...
CCF GESP C++编程 四级认证真题 2025年3月
C 四级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 A B B D D C D D B B B B A A C 1 单选题(每题 2 分,共 30 分) 第 1 题 关于下述代码,说法错误的是( )。 int multiply(int x, int …...
元宇宙浪潮下,前端开发如何“乘风破浪”?
一、元宇宙对前端开发的新要求 元宇宙的兴起,为前端开发领域带来了全新的挑战与机遇。元宇宙作为一个高度集成、多维互动的虚拟世界,要求前端开发不仅具备传统网页开发的能力,还需要掌握虚拟现实(VR)、增强现实&#…...
室内指路机器人是否支持环境监测功能?
并非所有室内指路机器人都具备环境监测功能。那些支持环境监测的室内指路机器人,往往在设计上进行了针对性的优化,搭载了一系列先进且实用的传感器。温湿度传感器犹如一位敏锐的 “温度湿度侦探”,时刻精准地监测室内温度与湿度,为…...
redis的数据类型(1)
https://redis.io/docs/latest/develop/data-types/strings/ 社区版支持: String,字符串 Hash,key-value格式 List,根据插入顺序排序 Set,集合 Sorted set,有排序 Stream, Bitmap, …...
模运算核心性质与算法应用:从数学原理到编程实践
目录 🚀前言🌟数学性质:模运算的理论基石💯基本定义:余数的本质💯四则运算规则:保持同余性的关键 🦜编程实践:模运算的工程化技巧💯避免数值溢出:…...
使用 Messenger 跨进程通讯
在Android中使用Messenger进行跨进程通信(IPC)的步骤如下: 1. 服务端(Service)实现 1.1 创建Service并绑定Messenger public class MessengerService extends Service {private static final String TAG "Mess…...
css炫酷的3D水波纹文字效果实现详解
炫酷的3D水波纹文字效果实现详解 这里写目录标题 炫酷的3D水波纹文字效果实现详解项目概述技术栈核心实现1. 基础布局2. 渐变背景3. 文字效果实现3.1 基础样式3.2 文字漂浮动画 4. 水波纹效果4.1 模糊效果4.2 水波动画 5. 交互效果 技术要点项目难点与解决方案总结 项目概述 在…...
C++类的特殊成员函数:构造、拷贝构造与析构函数详解
目录 编辑一、构造函数 二、拷贝构造函数 三、析构函数 在C 编程中,类的特殊成员函数扮演着至关重要的角色,它们负责对象的创建、复制以及销毁过程。本文将深入探讨构造函数、拷贝构造函数和析构函数的概念、特性及应用场景,并结合代…...
ffmpeg常见命令3
文章目录 1. **文字水印(Text Watermark)**示例命令:更多选项: 2. **图片水印(Image Watermark)**示例命令:更多选项: 3. **画中画(Picture-in-Picture, PIP)…...
C# 中创建统一 API 接口实现方案
在 C# 中创建统一 API 接口需要从架构设计、技术选型和代码实现等多个层面进行规划。以下是详细的实现方案和完整示例代码: 一、技术选型与架构设计 框架选择 ASP.NET Core (6.0)RESTful API 规范 核心组件 统一响应格式:标准化 JSON 响应结构全局异常处…...
考研单词笔记 2025.04.04
accord n一致,符合,协议,条约v与…一致符合,给予,赠予 align v使一致,使对齐 alike a相同的,相似的ad相同地,相似地,同等地 analogous a类似的,相似的 co…...
leetcode 代码随想录 数组-区间和
题目 给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。 输入: 第一行输入:为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间&…...
Linux学习笔记7:关于i.MX6ULL主频与时钟配置原理详解
以下是关于正点原子B站课程中 i.MX6ULL主频和时钟配置实验的博客内容框架与详细解析,结合实验原理、配置流程及关键代码实现,适合嵌入式开发者参考学习: 一、 实验背景 i.MX6ULL默认启动时由内部BootROM将主频设置为396MHz,但其…...
第三期:深入理解 Spring Web MVC [特殊字符](数据传参+ 特殊字符处理 + 编码问题解析)
✨前言:传参和状态管理,看似简单其实门道不少 在 Web 开发中,前端和后端最核心的交流方式就是“传参”,而“传参”除了涉及如何写代码获取参数,还藏着很多开发者容易忽略的细节: 为什么 URL 带了中文&…...
洛谷题单3-P1075 [NOIP 2012 普及组] 质因数分解-python-流程图重构
题目描述 已知正整数 n n n 是两个不同的质数的乘积,试求出两者中较大的那个质数。 输入格式 输入一个正整数 n n n。 输出格式 输出一个正整数 p p p,即较大的那个质数。 输入输出样例 输入 21输出 7说明/提示 1 ≤ n ≤ 2 1 0 9 1 \le n\…...
Vue组件化开发深度解析:Element UI与Ant Design Vue对比实践
一、Vue组件化开发的核心优势 1.1 组件化架构的天然优势 Vue的组件系统是其最核心的特性之一,采用单文件组件(.vue)形式,将HTML、CSS和JavaScript组合在同一个文件中,形成高内聚、低耦合的代码单元。这种设计显著提升…...
ctfshow VIP题目限免 robots后台泄露
根据题目提示是 robots后台泄露,所以我们试着访问它的后台文件 robots.txt 访问之后发现了有一个/flagishere.txt 目录文件。接着拼接访问它发现了 flag...
突破传统认知:聚类算法的底层逻辑与高阶应用全景解析
一、维度革命:重新定义聚类分析的认知边界 在人工智能的浩瀚星空中,聚类算法犹如一组精密的星际导航仪,帮助我们在无序的数据宇宙中发现隐藏的秩序。这项起源于人类本能分类需求的技术,经历了从简单分组到智能识别的蜕变…...
获取ssh密钥
git bash GitHub官网: Redirecting… ssh-keygen -t rsa -C “git账号” 出现id_rsa.pub 登录github添加 将id_rsa.pub中内容复制 点击SSH and GPG keys 点击New SSH key 起个名字 将id_rsa.pub中内容复制到这里 报错: ssh: connect to host github.com port 2…...
MINIQMT学习课程Day7
在上一篇,我们安装好xtquant,qmt以及python后,这一章,我们学习如何使用xtquant 本章学习,如何获取账号的资金使用状况。 首先,打开qmt,输入账号密码,选择独立交易。 进入交易界面&…...
`accept_ra` 和 `autoconf` 和 `forwarding` 的关系 笔记250404
accept_ra 和 autoconf 和 forwarding 的关系 笔记250404 在 Linux 的 IPv6 网络配置中,accept_ra、autoconf 和 forwarding 是三个密切相关的核心参数,它们的组合直接影响设备在网络中的角色(主机或路由器)和地址配置行为。以下是…...
leetcode数组-二分查找
题目 题目链接:https://leetcode.cn/problems/binary-search/ 文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html 视频讲解:https://www.bilibili.com/video/BV1fA4y1o715 给定一个 n 个元素有序的&…...
vector的介绍与代码演示
由于以后我们写OJ题时会经常使用到vector,所以我们必不可缺的是熟悉它的各个接口。来为我们未来作铺垫。 首先,我们了解一下: https://cplusplus.com/reference/vector/ vector的概念: 1. vector是表示可变大小数组的序列容器…...
SDK中窗口调用
存在窗口A和B的win32程序 , 当点击窗口A中的按钮后会弹出窗口B #include <windows.h>// 窗口 B 的窗口过程 LRESULT CALLBACK WindowProcB(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_DESTROY:PostQuitMessage(0);break;default:ret…...
Web Service技术
Web Service 是一种基于网络的、分布式的技术,用于在不同的应用程序之间进行通信和数据交换。以下是关于它的详细介绍: 定义与概念 Web Service 是一种通过互联网协议(如 HTTP)提供服务的软件组件,它使用标准的 XML …...
使用内存数据库来为mapper层的接口编写单元测试
简介 使用内存数据库来测试mapper层的sql代码,这种方式可以让测试案例摆脱对数据库的依赖,进而变得可重复执行。 这里选择的内存数据库是h2,它是纯java编写的关系型数据库,开源免费,而且轻量级的,性能较好…...
PowerMonitor的使用步骤
PowerMonitor是功耗分析中常用的测试和分析工具,不仅精度高,而且遇到需要找方案提功耗单的时候,有时还需要PowerMonitor的数据作为辅助日志。 1.先接上假电池正负极,再按PowerMonior的电源键 2.桌面点击PowerMonitor快捷图标 3.调…...
【C++经典例题】杨辉三角问题
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:C经典例题 期待您的关注 目录 一、问题描述 二、解题思路 解法 1 思路 解法 2 思路 三、代码实现 解法 1 代码 解法 2 代码…...
java自主学习网站(springboot+ssm+mysql)含运行文档
java自主学习网站(springbootssmmysql)含运行文档 该系统是一个专注于Java编程的在线教育平台。系统的主要功能和特点如下: 导航栏:系统顶部设有导航栏,用户可以通过它快速访问不同的页面,包括首页、课程列表、分享资料列表、讲…...
T-SQL语言的链表查找
T-SQL语言的链表查找 在数据库系统中,数据结构的选择对性能优化至关重要。链表作为一种常见的数据结构,具有灵活性和动态存储的优势。尽管在SQL数据库中,传统的表结构已经足够应对大多数场景,但在某些情况下,将链表的…...
浅析 Spring AI 与 Python:企业级 AI 开发的技术分野
一、技术架构与生态体系对比 Spring AI 构建在 Spring Boot 生态之上,其核心架构包含以下模块: 模型适配层:通过统一 API 支持 OpenAI、Anthropic、Hugging Face 等主流模型提供商,实现跨平台模型调用。例如,调用 Cl…...
为 IDEA 设置管理员权限
IDEA 安装目录 兼容性选择管理员身份运行程序 之后 IDEA 中的操作(包括终端中的操作)都是管理员权限的了...
数据结构|排序算法(一)快速排序
一、排序概念 排序是数据结构中的一个重要概念,它是指将一组数据元素按照特定的顺序进行排列的过程,默认是从小到大排序。 常见的八大排序算法: 插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序、基数排序 二、快速…...
如何计算财富自由所需要的价格?
写在前面:【财富自由计算器】已上线,快算算财富自由要多少 多少钱,才能实现你的财富梦想? 需要多少,才能实现财务安全、财务独立,甚至财务自由? 看到结尾,你会很清楚地看到&…...
南京大学与阿里云联合启动人工智能人才培养合作计划,已将通义灵码引入软件学院课程体系
近日,南京大学与阿里云宣布启动人工智能人才培养合作计划,共同培养适应未来技术变革、具备跨学科思维的AI创新人才。 基于阿里云在云计算和AI大模型领域的技术优势和南京大学在人工智能领域的学科优势,双方将共同设计兼具前瞻性和应用性的人…...
基于 Python 的自然语言处理系列(70):检索增强生成(RAG)
1. 什么是 RAG? 在许多大模型(LLM)应用场景中,我们需要使用特定的用户数据,而这些数据并未包含在模型的训练集中。检索增强生成(Retrieval Augmented Generation,RAG)是一种有效的解…...
Flink CDC Pipeline mysql to doris
flink 与 flink-cdc版本兼容 运行同步程序 最终在 flink-1.20.1 与 flink-cdc-3.1.1 跑通测试 配置yaml文件 [rootchb1 flink-cdc-3.1.1]# cat mysql2doris.yaml ################################################################################ # Description: Sync…...