当前位置: 首页 > news >正文

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) }}"

其中:

  • var1 default值是单引号引起来的字符串
  • var2 default值是双引号引起来的字符串,所以用 \ 来转义
  • var3 default值是数值,不需要用引号

运行结果如下:

➜  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指定了 var1var2 ,而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_BEHAVIORfalse ,则变量允许为空值。此时,如果想要强制变量不得为空值,则可以使用 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 ,表示true
  • var2 其值为 false (注意没有引号,否则是字符串),表示false
  • var3 其值为 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' 类型为 str
  • 123 类型为 int
  • 0.5 类型为 float
  • true 类型为 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_yamlto_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_jsonfrom_yaml ,则读取的是字符串( AnsibleUnsafeText ),加上from_jsonfrom_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"

多次运行,产生的随机数保持不变。

数学运算

  • log
  • pow
  • root
  • abs
  • round

创建文件 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.html
  • https://jinja.palletsprojects.com/en/latest/templates

相关文章:

Ansible的filter

环境 控制节点&#xff1a;Ubuntu 22.04Ansible 2.10.8管理节点&#xff1a;CentOS 8 filter 使用filter可以对数据做操作&#xff0c;比如把JSON数据转换为YAML数据&#xff0c;从URL中解析出hostname&#xff0c;提取字符串的SHA1哈希值&#xff0c;做数学运算&#xff0c…...

Qt绘制各种图表

绘制柱状图&#xff1a; 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&#xff08;感觉最好用的竟然是这个&#xff0c;简单方便快捷&#xff0c;不需要多轮对话&#xff09;chatgpt思维链2&#xff08;复杂任务更适用&#xff0c;简单任务把他弄复杂了&#xff09;机理chatgpt完整咒语1&#xff08;感…...

龙蜥社区联合浪潮信息发布《eBPF技术实践白皮书》(附下载链接)

随着 eBPF 技术的高速发展&#xff0c;eBPF 已成为 Linux 内核顶级子系统&#xff0c;并扩展到内核网络、存储、内存、调度和安全等子模块。这种可编程底座内核框架构建了全系统&#xff0c;是云计算、运维和安全等领域技术创新的基础。 龙蜥社区在 eBPF 领域进行了广泛的实践…...

屏幕截图软件 Snagit mac中文版软件特点

Snagit mac是一款屏幕截图和视频录制软件&#xff0c;它可以帮助用户快速捕捉屏幕上的任何内容&#xff0c;并将其编辑、标注和共享。 Snagit mac软件特点 多种截图模式&#xff1a;支持全屏截图、窗口截图、区域截图、延时截图等多种截图模式&#xff0c;满足不同用户的需求。…...

四、Ribbon负载均衡

目录 一、负载均衡流程 1、我通过浏览器直接访问userservice/user/1&#xff0c;无法访问&#xff0c;说明是负载均衡做了相应的处理 2、我们来看一下代码中负载均衡的流程是怎样的 3、图像流程 二、负载均衡策略 1、修改负载均衡策略 &#xff08;方式一&#xff09; &a…...

【Git】第二篇:基本操作(创建本地仓库)

我们知道&#xff0c;git是一个版本控制器&#xff0c;可以帮我们控制管理电脑上所有格式的文档。 而我们需要使用git管理文件的时候&#xff0c;我们必须将这些文件放到git仓库中&#xff0c;只有在git仓库中的文件才可以被我们的git追踪管理 创建本地仓库 创建本地仓库是需…...

vuex——重置vuex数据

需求描述 登出系统时&#xff0c;需将 vuex 中存储的数据&#xff0c;恢复为最初的默认状态。 实现方法 通过 replaceState 方法&#xff0c;将最初的 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 将资源先下载&#xff0c;后期本地安装 下载 passwordUtilities-1.0 D:\wlp-webProfile7-java8-8.5.5.9\wlp\bin>installUtility find password 正在建立与已配置存储库的连接... 此过程可能要花几分钟完成。已成功连接至所有已配置的存储库。…...

如何区分一个项目是react还react native

要区分一个项目是 React 还是 React Native&#xff0c;你可以关注以下几个方面&#xff1a; 项目目录结构&#xff1a;React 和 React Native 项目通常具有不同的目录结构。React 项目中的源代码通常位于一个名为 "src" 或 "app" 的文件夹中&#xff0c;包…...

网易有道开源语音合成引擎“易魔声”

概述 11 月 10 日&#xff0c;网易有道正式上线“易魔声”开源语音合成&#xff08;TTS&#xff09;引擎&#xff0c;所有用户可免费在开源社区 GitHub 进行下载使用&#xff0c;通过其提供的 web 界面及批量生成结果的脚本接口&#xff0c;轻松实现音色的情感合成与应用。 据…...

[量子计算与量子信息] 2.1 线性代数

2.1 线性代数 符号对照表 量子力学中&#xff0c;向量使用 ∣ ψ ⟩ \ket \psi ∣ψ⟩ (ket)来表示&#xff0c;可以理解为一个列向量。其对偶向量为 ⟨ ψ ∣ \bra \psi ⟨ψ∣ &#xff0c;可以理解为行向量。 向量空间中零向量直接用 0 0 0 表示&#xff0c; ∣ 0 ⟩ \…...

【PG】PostgreSQL 目录结构

目录 1 软件安装目录 2 数据文件目录 base/&#xff1a;存储每个数据库的基本数据文件 global/&#xff1a;包含了全局性质的系统表空间文件 pg_tblspc/&#xff1a;包含了表空间的符号链接 pg_twophase/&#xff1a;包含了两阶段提交中使用的文件 pg_stat_tmp/&#xff…...

H5游戏源码分享-超级染色体小游戏

H5游戏源码分享-超级染色体小游戏 游戏玩法 不断地扩大发展同颜色的色块 用最少的步数完成游戏 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width,user-scalableno,init…...

NOIP 2017 宝藏----Java题解

目录 NOIP 2017 宝藏 题目描述 输入描述: 输出描述: 输入 输出 说明 输入 输出 说明 备注: 代码实现&#xff1a; NOIP 2017 宝藏 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO For…...

数据结构和算法的重要性

目录 1.什么是数据结构&#xff1f; 2.什么是算法&#xff1f; 3.数据结构和算法的重要性 4.如何学好数据结构和算法 1.什么是数据结构&#xff1f; 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合 …...

2023.11.10 信息学日志

2023.11.10 信息学日志 1. CF1613E Crazy Robot题目描述题目概况思路点拨 1. CF1613E Crazy Robot 题目描述 https://www.luogu.com.cn/problem/CF1613E 题目概况 来源&#xff1a;Codeforces 洛谷难度&#xff1a; 绿题 \color{green}绿题 绿题 CF难度&#xff1a; 2000…...

0基础学习VR全景平台篇第120篇:极坐标处理接缝 - PS教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 紧跟上节课&#xff0c;我们已经学会了怎么利用PS蒙版工具来对航拍全景图补天。但是在后续工作学习中&#xff0c;我们会遇到天空这部分存在部分接缝的问题&#xff0c;如图&…...

Python---综合案例:通讯录管理系统---涉及点:列表、字典、死循环

需求&#xff1a; 开个一个通讯录的管理系统&#xff0c;主要用于实现存储班级中同学的信息&#xff08;姓名、年龄、电话&#xff09; 涉及点&#xff1a;列表、字典、死循环 相关链接&#xff1a;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…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...