Ansible的filter
环境
- 控制节点:Ubuntu 22.04
- Ansible 2.10.8
- 管理节点:CentOS 8
filter
使用filter可以对数据做操作,比如把JSON数据转换为YAML数据,从URL中解析出hostname,提取字符串的SHA1哈希值,做数学运算,等等。可以使用Ansible特有的filter,也可以使用jinja2移植的标准filter。
因为templating发生在Ansible的控制节点,而不是目标节点,所以filter运行在控制节点,并在本地转换数据。
处理未定义变量
提供缺省值
创建文件 test1.yml 如下:
---
- hosts: alltasks:- name: task1debug:msg: "Hello {{ var1 }}"
运行结果如下:
➜ temp1105_2 ansible-playbook test1.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
fatal: [192.168.1.55]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'var1' is undefined\n\nThe error appears to be in '/root/temp/temp1105_2/test1.yml': line 4, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: task1\n ^ here\n"}PLAY RECAP *****************************************************************************************
192.168.1.55 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
这是因为变量 var1 未定义。
为避免出错,可以使用jinja2的 default filter:
---
- hosts: alltasks:- name: task1debug:msg: "Hello {{ var1 | default('ABC') }}, {{var2 | default(\"XYZ\")}}, {{ var3 | default(123) }}"
其中:
var1default值是单引号引起来的字符串var2default值是双引号引起来的字符串,所以用\来转义var3default值是数值,不需要用引号
运行结果如下:
➜ temp1105_2 ansible-playbook test1.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "Hello ABC, XYZ, 123"
}PLAY RECAP *****************************************************************************************
192.168.1.55 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
注:对于role,也可以在其 defaults/main.yml 文件里给该role的变量定义缺省值。
如果原值evaluate为false或者空字符串,则使用default时,需要将其第二个参数设置为true(默认值是false):
......msg: "aaa {{ '' | default('empty string', true) }} bbb"
......
运行结果如下:
......"msg": "aaa empty string bbb"
......
注:如果不加第二个参数,则不会替换为缺省值。
变量为空值
创建文件 test2.yml 如下:
---
- hosts: alltasks:- name: task1debug:msg: "aaa {{ item.var1 }} bbb {{ item.var2 | default(omit) }}"loop:- var1: "Tom"var2: 20- var1: "Jerry"
其中,item1指定了 var1 和 var2 ,而item2只指定了 var1 。
运行结果如下:
➜ temp1105_2 ansible-playbook test2.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => (item={'var1': 'Tom', 'var2': 20}) => {"msg": "aaa Tom bbb 20"
}
ok: [192.168.1.55] => (item={'var1': 'Jerry'}) => {"msg": "aaa Jerry bbb __omit_place_holder__ae2509bf44427378895b86e1e65511fbaaf58727"
}PLAY RECAP *****************************************************************************************
192.168.1.55 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
可见,指定了 default(omit) ,则变量默认值为空(若打印其值,则输出一个占位符)。
注:对于链式filter,官网上说,要用 "{{ foo | default(None) | <some_filter> or omit }}" 的形式,比如:
msg: " {{ var1 | default(None) | lower or omit }}"
运行结果如下:
"msg": " none"
但我试了一下,如果不这么做,比如:
msg: " {{ var1 | default(omit) | lower }}"
也不报错,运行结果如下:
"msg": " __omit_place_holder__2212ea218f1e07f0070e5184cf11ebf71e3e5e9e"
变量必须有值
如果配置了 DEFAULT_UNDEFINED_VAR_BEHAVIOR 为 false ,则变量允许为空值。此时,如果想要强制变量不得为空值,则可以使用 mandatory filter,比如:
{{ var1 | mandatory }}
根据不同值true/false/null做判断
注: ternary 是 三元 的意思。
创建文件 test6.yml 如下:
---
- hosts: alltasks:- name: task1debug:msg: "{{ (var1 == 'a') | ternary('111', '222') }}"vars:- var1: 'a'
本例中,由于 var1 == 'a' 是true,所以会打印 111 :
➜ temp1105_2 ansible-playbook test6.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "111"
}PLAY RECAP *****************************************************************************************
192.168.1.55 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
创建文件 test7.yml 如下:
---
- hosts: alltasks:- name: task1debug:msg: "{{ var1 | ternary('111', '222', omit) }}"vars:- var1: 'abc'- name: task2debug:msg: "{{ var2 | ternary('111', '222', omit) }}"vars:- var2: false- name: task3debug:msg: "{{ var3 | ternary('111', '222', omit) }}"vars:- var3: null
运行结果如下:
➜ temp1105_2 ansible-playbook test7.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "111"
}TASK [task2] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "222"
}TASK [task3] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "Hello world!"
}PLAY RECAP *****************************************************************************************
192.168.1.55 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
var1有值且不等于false,表示truevar2其值为false(注意没有引号,否则是字符串),表示falsevar3其值为null,注意打印出了Hello world!
管理数据类型
检测数据类型
创建文件 test8.yml 如下:
---
- hosts: alltasks:- name: task1debug:msg: "{{ 'abc' | type_debug }}, {{ 123 | type_debug }}, {{ 0.5 | type_debug }}, {{ true | type_debug }}"
运行结果如下:
➜ temp1105_2 ansible-playbook test8.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "str, int, float, bool"
}PLAY RECAP *****************************************************************************************
192.168.1.55 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
可见:
'abc'类型为str123类型为int0.5类型为floattrue类型为bool
强制类型转换
创建文件 test9.yml 如下:
---
- hosts: alltasks:- name: task1debug:msg: "{{ var1 | int | type_debug }}, {{ var2 | float | type_debug }}, {{ var3 |bool | type_debug }}, {{ var4 | string | type_debug }}"vars:- var1: '123'- var2: '0.5'- var3: 'true'- var4: 456
运行结果如下:
➜ temp1105_2 ansible-playbook test9.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "int, float, bool, str"
}PLAY RECAP *****************************************************************************************
192.168.1.55 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
JSON和YAML
to_json:转换为JSON格式to_nice_json:转换为可读的JSON格式(加上换行,缩进等)to_yaml:转换为YAML格式to_nice_yaml:转换为可读的YAML格式(加上换行,缩进等)
创建文件 test12.yml 如下:
---
- hosts: alltasks:- name: task1template:src: /tmp/src1dest: /tmp/dest1- name: task2template:src: /tmp/src2dest: /tmp/dest2- name: task3template:src: /tmp/src3dest: /tmp/dest3- name: task4template:src: /tmp/src4dest: /tmp/dest4
/tmp/src1 如下:
{{ ansible_facts['default_ipv4'] | to_json }}
/tmp/src2 如下:
{{ ansible_facts['default_ipv4'] | to_nice_json }}
/tmp/src3 如下:
{{ ansible_facts['default_ipv4'] | to_yaml }}
/tmp/src4 如下:
{{ ansible_facts['default_ipv4'] | to_nice_yaml }}
运行结果如下:
➜ temp1105_2 ansible-playbook test12.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
changed: [192.168.1.55]TASK [task2] ***************************************************************************************
changed: [192.168.1.55]TASK [task3] ***************************************************************************************
changed: [192.168.1.55]TASK [task4] ***************************************************************************************
changed: [192.168.1.55]PLAY RECAP *****************************************************************************************
192.168.1.55 : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
运行结束后,到目标机器上查看。
/tmp/dest1 如下:
{"gateway": "192.168.1.1", "interface": "ens33", "address": "192.168.1.55", "broadcast": "192.168.1.255", "netmask": "255.255.255.0", "network": "192.168.1.0", "macaddress": "00:0c:29:12:a6:b7", "mtu": 1500, "type": "ether", "alias": "ens33"}
/tmp/dest2 如下:
{"address": "192.168.1.55","alias": "ens33","broadcast": "192.168.1.255","gateway": "192.168.1.1","interface": "ens33","macaddress": "00:0c:29:12:a6:b7","mtu": 1500,"netmask": "255.255.255.0","network": "192.168.1.0","type": "ether"
}
/tmp/dest3 如下:
{address: 192.168.1.55, alias: ens33, broadcast: 192.168.1.255, gateway: 192.168.1.1,interface: ens33, macaddress: '00:0c:29:12:a6:b7', mtu: 1500, netmask: 255.255.255.0,network: 192.168.1.0, type: ether}
/tmp/dest4 如下:
address: 192.168.1.55
alias: ens33
broadcast: 192.168.1.255
gateway: 192.168.1.1
interface: ens33
macaddress: 00:0c:29:12:a6:b7
mtu: 1500
netmask: 255.255.255.0
network: 192.168.1.0
type: ether
注: to_yaml 和 to_nice_yaml ,默认每行包含80个字符(当超过80字符后,遇到空格就会换行),可以指定 width 选项,比如:
{{ ansible_facts['default_ipv4'] | to_yaml(width=500) }}
结果如下:
{address: 192.168.1.55, alias: ens33, broadcast: 192.168.1.255, gateway: 192.168.1.1, interface: ens33, macaddress: '00:0c:29:12:a6:b7', mtu: 1500, netmask: 255.255.255.0, network: 192.168.1.0, type: ether}
可以指定 indent 选项(默认值貌似是4),比如:
{{ ansible_facts['default_ipv4'] | to_nice_json(indent=8) }}
结果如下:
{"address": "192.168.1.55","alias": "ens33","broadcast": "192.168.1.255","gateway": "192.168.1.1","interface": "ens33","macaddress": "00:0c:29:12:a6:b7","mtu": 1500,"netmask": "255.255.255.0","network": "192.168.1.0","type": "ether"
}
可见缩进值变为8了。
from_json:读取已知的JSON数据from_yaml:读取已知的YAML数据
在目标机器上创建 json1.json 如下:
{"Name": "Tom","Age": 20,"Sports":["Football", "Swimming"]
}
在目标机器上创建 yaml1.yml 如下:
Name: Tom
Age: 20
Sports:- Football- Swimming
创建文件 test14.yml 如下:
---
- hosts: alltasks:- name: task1shell: cat /tmp/json1.jsonregister: result1- name: task2debug:msg: "{{ result1.stdout | type_debug }}"- name: task3debug:msg: "{{ result1.stdout | from_json | type_debug }}"- name: task4shell: cat /tmp/yaml1.ymlregister: result2- name: task5debug:msg: "{{ result2.stdout | type_debug }}"- name: task6debug:msg: "{{ result2.stdout | from_yaml | type_debug }}"
运行结果如下:
➜ temp1105_2 ansible-playbook test14.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
changed: [192.168.1.55]TASK [task2] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "AnsibleUnsafeText"
}TASK [task3] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "dict"
}TASK [task4] ***************************************************************************************
changed: [192.168.1.55]TASK [task5] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "AnsibleUnsafeText"
}TASK [task6] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "dict"
}PLAY RECAP *****************************************************************************************
192.168.1.55 : ok=7 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
可见,如果不加 from_json 或 from_yaml ,则读取的是字符串( AnsibleUnsafeText ),加上from_json 或 from_yaml ,则读取为 dict 。
随机数
创建文件 test15.yml 如下:
---
- hosts: alltasks:- name: task1debug:msg: "{{ 60 | random }}"
运行结果如下:
"msg": "4"
多次运行,结果也不同。
注意:取值范围是0到60,左闭右开。
如果想指定起始值,可以用 start 选项:
msg: "{{ 60 | random(start=55) }}"
则取值范围是55到60,左闭右开。
如果要求取值是特定值的整倍数,可以用 step 选项:
msg: "{{ 60 | random(step=20) }}"
则取值只能是0或20或40。
如果想在多个目标机器上各自产生不同的随机数,但要求每个机器上的随机数多次运行结果不变(幂等性),则可以添加 seed 选项,使用该种子来产生随机数,注意seed的值不要变:
msg: "{{ 60 | random(seed=inventory_hostname) }}"
"msg": "50"
多次运行,产生的随机数保持不变。
数学运算
logpowrootabsround
创建文件 test16.yml 如下:
---
- hosts: alltasks:- name: task1debug:msg: "{{ 100 | log(10) }}, {{ 2 | pow(10) }}, {{ 216 | root(3) }}, {{ -1.5 | abs }}, {{ 12.34 | round }}"
运行结果如下:
"msg": "2.0, 1024.0, 5.999999999999999, 1.5, 12.0"
注释
comment 将内容注释。默认的注释符是 # ,可以指定不同语言来做注释。
创建文件 test17.yml 如下:
---
- hosts: alltasks:- name: task1template:src: /tmp/src1dest: /tmp/dest1- name: task2template:src: /tmp/src2dest: /tmp/dest2- name: task3template:src: /tmp/src3dest: /tmp/dest3- name: task4template:src: /tmp/src4dest: /tmp/dest4- name: task5template:src: /tmp/src5dest: /tmp/dest5
创建文件 /tmp/src1 如下:
{{ 'aaa' | comment }}
创建文件 /tmp/src2 如下:
{{ 'bbb' | comment('c') }}
创建文件 /tmp/src3 如下:
{{ 'ccc' | comment('cblock') }}
创建文件 /tmp/src4 如下:
{{ 'ddd' | comment('erlang') }}
创建文件 /tmp/src5 如下:
{{ 'eee' | comment('xml') }}
运行结束后,到目标机器上查看:
/tmp/dest1 如下:
#
# aaa
#
/tmp/dest2 如下:
//
// bbb
//
/tmp/dest3 如下:
/*** ccc**/
/tmp/dest4 如下:
%
% ddd
%
/tmp/dest5 如下:
<!---- eee-
-->
字符串操作
quote:给值加上引号
shell: echo {{ var1 | quote }} > /tmp/a.txtvars:var1: "a\nb\nc"
运行结束后,目标机器 /tmp/a.txt 如下:
a
b
c
如果没有 quote ,则会报错。
join:连接字符串
debug:msg: "{{ ['a', 'b', 'c'] | join(' ') }}"
运行结果如下:
"msg": "a b c"
split:切割字符串
debug:msg: "{{ 'a,b,c' | split(',') }}"
注:需要升级到2.11,我用的是2.10,会报错。
b64encode:Base64 encode
debug:msg: "{{ 'abcdefg' | b64encode }}"
运行结果如下:
"msg": "YWJjZGVmZw=="
b64decode:Base64 decode
debug:msg: "{{ 'YWJjZGVmZw==' | b64decode }}"
运行结果如下:
"msg": "abcdefg"
UUID
to_uuid:创建UUID
debug:msg: "{{ 'abcdefg' | to_uuid }}"
运行结果如下:
"msg": "aeb26d4d-43ec-587e-b3a8-67b6ca88a4df"
参考
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_filters.htmlhttps://jinja.palletsprojects.com/en/latest/templates
相关文章:
Ansible的filter
环境 控制节点:Ubuntu 22.04Ansible 2.10.8管理节点:CentOS 8 filter 使用filter可以对数据做操作,比如把JSON数据转换为YAML数据,从URL中解析出hostname,提取字符串的SHA1哈希值,做数学运算,…...
Qt绘制各种图表
绘制柱状图: void MainWindow::iniBarChart() { //柱状图初始化QChart *chart new QChart(); //创建chartchart->setTitle("Barchart演示");chart->setAnimationOptions(QChart::SeriesAnimations);ui->chartViewBar->setChart(chart); //为…...
【科研新手指南4】ChatGPT的prompt技巧 心得
ChatGPT的prompt心得 写在最前面chatgpt咒语1(感觉最好用的竟然是这个,简单方便快捷,不需要多轮对话)chatgpt思维链2(复杂任务更适用,简单任务把他弄复杂了)机理chatgpt完整咒语1(感…...
龙蜥社区联合浪潮信息发布《eBPF技术实践白皮书》(附下载链接)
随着 eBPF 技术的高速发展,eBPF 已成为 Linux 内核顶级子系统,并扩展到内核网络、存储、内存、调度和安全等子模块。这种可编程底座内核框架构建了全系统,是云计算、运维和安全等领域技术创新的基础。 龙蜥社区在 eBPF 领域进行了广泛的实践…...
屏幕截图软件 Snagit mac中文版软件特点
Snagit mac是一款屏幕截图和视频录制软件,它可以帮助用户快速捕捉屏幕上的任何内容,并将其编辑、标注和共享。 Snagit mac软件特点 多种截图模式:支持全屏截图、窗口截图、区域截图、延时截图等多种截图模式,满足不同用户的需求。…...
四、Ribbon负载均衡
目录 一、负载均衡流程 1、我通过浏览器直接访问userservice/user/1,无法访问,说明是负载均衡做了相应的处理 2、我们来看一下代码中负载均衡的流程是怎样的 3、图像流程 二、负载均衡策略 1、修改负载均衡策略 (方式一) &a…...
【Git】第二篇:基本操作(创建本地仓库)
我们知道,git是一个版本控制器,可以帮我们控制管理电脑上所有格式的文档。 而我们需要使用git管理文件的时候,我们必须将这些文件放到git仓库中,只有在git仓库中的文件才可以被我们的git追踪管理 创建本地仓库 创建本地仓库是需…...
vuex——重置vuex数据
需求描述 登出系统时,需将 vuex 中存储的数据,恢复为最初的默认状态。 实现方法 通过 replaceState 方法,将最初的 vuex 的 state 数据作为参数传入即可 完整代码范例 src\store\index.js import Vue from "vue"; import Vuex fro…...
WebSphere Liberty 8.5.5.9 (三)
WebSphere Liberty 8.5.5.9 将资源先下载,后期本地安装 下载 passwordUtilities-1.0 D:\wlp-webProfile7-java8-8.5.5.9\wlp\bin>installUtility find password 正在建立与已配置存储库的连接... 此过程可能要花几分钟完成。已成功连接至所有已配置的存储库。…...
如何区分一个项目是react还react native
要区分一个项目是 React 还是 React Native,你可以关注以下几个方面: 项目目录结构:React 和 React Native 项目通常具有不同的目录结构。React 项目中的源代码通常位于一个名为 "src" 或 "app" 的文件夹中,包…...
网易有道开源语音合成引擎“易魔声”
概述 11 月 10 日,网易有道正式上线“易魔声”开源语音合成(TTS)引擎,所有用户可免费在开源社区 GitHub 进行下载使用,通过其提供的 web 界面及批量生成结果的脚本接口,轻松实现音色的情感合成与应用。 据…...
[量子计算与量子信息] 2.1 线性代数
2.1 线性代数 符号对照表 量子力学中,向量使用 ∣ ψ ⟩ \ket \psi ∣ψ⟩ (ket)来表示,可以理解为一个列向量。其对偶向量为 ⟨ ψ ∣ \bra \psi ⟨ψ∣ ,可以理解为行向量。 向量空间中零向量直接用 0 0 0 表示, ∣ 0 ⟩ \…...
【PG】PostgreSQL 目录结构
目录 1 软件安装目录 2 数据文件目录 base/:存储每个数据库的基本数据文件 global/:包含了全局性质的系统表空间文件 pg_tblspc/:包含了表空间的符号链接 pg_twophase/:包含了两阶段提交中使用的文件 pg_stat_tmp/ÿ…...
H5游戏源码分享-超级染色体小游戏
H5游戏源码分享-超级染色体小游戏 游戏玩法 不断地扩大发展同颜色的色块 用最少的步数完成游戏 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width,user-scalableno,init…...
NOIP 2017 宝藏----Java题解
目录 NOIP 2017 宝藏 题目描述 输入描述: 输出描述: 输入 输出 说明 输入 输出 说明 备注: 代码实现: NOIP 2017 宝藏 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO For…...
数据结构和算法的重要性
目录 1.什么是数据结构? 2.什么是算法? 3.数据结构和算法的重要性 4.如何学好数据结构和算法 1.什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合 …...
2023.11.10 信息学日志
2023.11.10 信息学日志 1. CF1613E Crazy Robot题目描述题目概况思路点拨 1. CF1613E Crazy Robot 题目描述 https://www.luogu.com.cn/problem/CF1613E 题目概况 来源:Codeforces 洛谷难度: 绿题 \color{green}绿题 绿题 CF难度: 2000…...
0基础学习VR全景平台篇第120篇:极坐标处理接缝 - PS教程
上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 紧跟上节课,我们已经学会了怎么利用PS蒙版工具来对航拍全景图补天。但是在后续工作学习中,我们会遇到天空这部分存在部分接缝的问题,如图&…...
Python---综合案例:通讯录管理系统---涉及点:列表、字典、死循环
需求: 开个一个通讯录的管理系统,主要用于实现存储班级中同学的信息(姓名、年龄、电话) 涉及点:列表、字典、死循环 相关链接:Python--列表及其应用场景---增、删、改、查。-CSDN博客 Python---字典---…...
Vite探索:构建、启程、原理、CSS艺术与插件魔法
文章目录 1 构建工具1.1 什么是构建工具1.2 主流构建工具1.3 vite相较于webpack的优势 2 vite启动项目初体验2.1 你必须要理解的vite脚手架和vite2.2 vite开箱即用2.3 vite的预加载2.4 vite配置文件处理细节2.5 vue环境变量配置 3 vite 原理篇3.1 vite是怎么让浏览器可以识别.v…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
