ansible 自动化运维工具(三)playbook剧本
目录
Playbook的定义
Playbook组成
Playbook命令
Playbook剧本编写格式
基本组件
Handlers处理器
Facts组件
Register:注册变量
Debug模块
Playbook循环
With_items循环
With_dict循环(字典循环)
With_nested循环(嵌套循环)
Loop循环
playbook条件
when判断
Black:定义任务组
Ansible变量
通过vars定义变量
通过vars_files定义变量
通过变量目录定义变量
通过命令行定义变量
Playbook的定义
Playbook其实是Ansible服务的一个配置文件,Ansible使用Playbook的YAML语言配置编写成操作需求,实现对远端主机的策略部署,以及对远端主机的控制与管理。如果说单个模块执行类似于Linux系统中的命令,那么Playbook就类似于shell脚本,将多个模块组合起来实现一组的操作。
Playbook组成
剧本(Playbook):
Playbook是一个或多个"play"的集合。
一个playbook文件可以包含多个play,每个play定义了一组要执行的任务。
剧目(Play):
一个play定义了一组要执行的任务,以及这些任务适用的主机或主机组。
Play包含一个或多个任务(task),这些任务按顺序执行。
每个play开始时,可以指定要应用任务的主机或主机组,以及一些可选的设置,如变量、角色等。
(这里可以这样来理解,play就相当于是shell中的一个脚本,shell≈playbook,而shell中可以有很多脚本,所以playbook中也可以有很多play,而task就相当于是shell中封装的函数,一个脚本中可以有多个函数,所以play中也可以有多个task,每个task就是为了实现一个功能)
其核心元素
任务(Task):
任务是playbook的基本执行单元。
每个任务都是一个模块的调用,用于在目标主机上执行特定的操作。
任务可以有名称(name),用于描述任务的目的。
任务可以使用变量来参数化模块的参数。
变量(Variable):
变量用于存储和传递playbook中的动态值。
变量可以在playbook的不同位置定义,如inventory文件、play中的vars部分、任务中的参数等。
变量可以在任务中使用Jinja2模板语法进行引用和操作。
条件和循环:
Ansible支持在任务中使用条件语句(when)来控制任务的执行。
可以根据变量的值、主机的状态等条件来决定是否执行某个任务。
Ansible还支持使用循环(loop)来重复执行任务,可以遍历列表或字典等数据结构。
处理程序(Handler):
处理程序是一种特殊的任务,在满足特定条件时触发执行。
处理程序通常用于重启服务、重新加载配置等操作。
任务可以使用notify关键字来通知处理程序,当任务执行成功时,处理程序将被触发。
模板(Template):
模板是一种使用Jinja2模板语言编写的文件。
模板允许你在文件中使用变量、条件语句、循环等功能,动态生成配置文件。
Ansible的template模块用于将模板文件渲染并复制到目标主机上。
Playbook命令
执行剧本的格式:
ansible-playbook [参数] playbook.yml
常用参数:
参数 | 解析 |
-T | 建立SSH连接的超时时间 |
-i | 指定Inventory文件 |
-f | 并发执行的进程数,默认为5 |
- -list-hosts | 匹配的服务器列表 |
- -list-tasks | 列出任务列表 |
- -step | 每执行一个任务后停止,等待用户确认 |
- -syntax-check | 语法检测 |
- -list-tags | 列出此yml文件中的所有tag标签 |
- -skip-tags | 执行–skip-tags之外的标签任务 |
-C | 检查当前这个Playbook是否会修改受控端,模拟执行 |
Playbook剧本编写格式
从上文定义可知,playbook剧本的配置文件为YAML格式的文件
YAML的格式如下:
- .文件的第一行应该以“---”(三个连字符)开始,表明YAML文件的开始。
- 常见的缩进为4格方式,也可以使用 2 个空格或制表符,但要保持一致。
- 在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
- YAML中的列表元素以“-”开头并且跟着一个空格。后面为元素内容。
- 同一个列表之中的元素应该保持相同的缩进,否则会被当做错误处理。
- play中hosts、variables、roles、tasks等对象的表示方法都是以键值中间以“:”分隔表示,并且“:”之后要加一个空格。
基本组件
这里通过一个http.yml文件来对组件进行解析
---- name: apachehosts: web01remote_user: rootbecome: yestasks:- name: Install httpd Serveryum:name: httpdstate: present
name:定义一个Playbook的名称,用于标识Playbook的用途;
hosts:指定要在哪个主机上执行,也是写主机或主机组名,需要提前在/etc/ansible/hosts中配置好;
remote_user: 指定playbook运行时的用户身份,可以写在hosts下,也可以每个tasks做定义;
become:yes表示使用特权用户;一般和remote_user一起使用
tasks:属于是一个任务列表,主要写具体执行什么的(可以有多个);
name:每个任务的名称,用于描述干什么的;上述yml中则是安装httpd服务;
yum:表示使用哪个模块来进行操作;模块的参数可以看ad-hoc中的,用的都是一样的,写法不一样就是;
name:要安装的服务名称,我们这里是httpd:
state:要进行的操作,可以是安装、卸载、更新;
生产环境中为了可读性与可维护性通常一个playbook中只编写一个play,如果某些主机需要执行多个play,那么可以使用include关键字在一个playbook中导入其他的playbook。
Handlers处理器
Handlers 不会自动执行,只有当被notify语句调用时才会执行。
handlers和notify指定的名称必须相同,否则无法触发。
handlers 中需要- name指定名称 ,handlers只会在所有的tasks执行完后执行,并且,即便一个handlers被触发多次,也只会执行一次。 handlers是一种特殊的tasks。
Handlers多用于重启服务等操作
下面举一个redis示例:
---- name: redishosts: web01tasks:- name: install redisyum:name: redisstate: installed- name: copy_filecopy:src: /etc/redis.confdest: /etc/redis.conf.bak#给任务打标签tags: copy_file#触发开关:触发的名称notify: restart- name: startservice:name: redisstate: startedenabled: yes#触发后的一个动作handlers:- name: restartservice:name: redisstate: restarted
测试是否能够启动
tags标签
这里举例到了tags组件,就把tags来讲一下吧
默认情况下,Ansible在执行一个playbook时,会执行playbook中定义的所有任务;Ansible playbook中的tags标签是一种用于选择性运行特定任务或任务集的机制。通过为每个任务指定标签,您可以在运行playbook时选择只运行带有特定标签的任务,而不运行其他任务。这对于控制和管理Ansible playbook的执行非常有用,特别是当playbook中包含许多任务时。
如果只需要运行单独的任务就可以通过标签指定
通过任务列表可以看到它只执行了copy模块
Facts组件
Ansible facts是在被管理主机上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。比如:被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。
前面setup模块也说过可以指定facts组件的内置变量去获取主机信息,原理是一样的
使用shell模块引用facts组件变量,存储输出的信息,利用debug把存储的信息输出到终端
[root@localhost ansible]# cat facts.yml---- hosts: web01tasks:- shell: echo {{ ansible_memory_mb }}register: my_memory- debug:var: my_memory.stdout_lines
setup模块输出和playbook利用facts输出
上述编写的剧本中用到register和debug,下面对此展开讲解
Register:注册变量
它用于将一个任务的执行结果存储到一个变量中,以便在后续的任务中可以引用这个变量,进行条件判断、输出显示或者其他操作。这个变量可以包含任务执行的返回码、标准输出、标准错误输出等信息。常和debug结合使用,register用于存储,debug用于输出。
[root@web01 ansible]# cat register.yml---- hosts: web01tasks:- shell: echo "这是一个register"register: shell_print- debug:var: shell_print.stdout_lines
测试
Debug模块
debug模块在 Ansible Playbook 中主要用于输出调试信息,帮助你了解变量的值、任务执行情况等内容,以便排查问题、验证配置是否符合预期。它可以将指定的变量值或者自定义的消息打印出来,使得整个 Playbook 的执行过程更加的清晰
常用参数:
msg: 调试输出的消息
var: 将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出,一般会和register的变量配合输出
verbosity: debug的级别(默认是0级)
这里举例msg参数,自定义信息
[root@web01 ansible]# cat debug.yml---- hosts: web01tasks:- yum: name=httpd state=installed- debug:msg: "httpd安装完成"
Playbook循环
With_items循环
with_items是 Ansible 中最常用的循环机制之一。它允许你在一个任务中对一个列表中的每个元素执行相同的操作。这个列表可以包含各种数据类型,如字符串、数字、字典等。
这里直接举实例
批量创建用户:
[root@web01 ansible]# cat user.yml---- name: creathosts: web01tasks:- name: create useruser:name: "{{ item }}"state: presentwith_items:- ha1- ha2- ha3
验证:
With_dict循环(字典循环)
由于ansible是由python开发的,所以ansible字典完全遵守python字典的定义
字典即由键值对组成,键值对的键和键值对的值讲究 一 一对应,且在同一个字典中键必须唯一,值任意。
键值对格式:item.key:item.value
- 概念:当你有一个字典数据结构,并且想对字典中的每个键值对进行操作时,可以使用with_dict循环。在循环中,item.key表示字典的键,item.value表示字典的值。
这里有新添的内容,还没讲到,其实前面主机清单提到过,大致用法相同不多做赘述,大致先来讲一下
Vars定义了一个变量services,这个变量里包含两个字典service1,service2,他们下面分别有两个键值对
[root@web01 ansible]# touch /etc/services.conf[root@web01 ansible]# cat dict.yml---- name: using a dictionaryhosts: web01vars:services:service1:port: 8080protocol: tcpservice2:port: 8888protocol: udptasks:- name: Configure Service Portslineinfile:path: /etc/services.confline: "{{ item.key }} {{ item.value.port }}/{{ item.value.protocol }}"with_dict: "{{ services }}"
With_nested循环(嵌套循环)
- with_nested是 Ansible 中用于实现嵌套循环的一种方式。它允许你在一个任务中对多个嵌套的列表进行迭代,生成所有可能的组合来执行任务。这在处理多层数据结构,需要对组合后的元素进行操作时非常有用。
例如:有两个列表,一个是服务器类型列表(server_types),另一个是数据中心列表(data_centers),你想要为每个服务器类型在每个数据中心创建一个配置文件。
[root@web01 playbook_file]# mkdir /root/configs[root@web01 playbook_file]# cat nested.yml---- name: with_nested 循环hosts: web01vars:server_types: ["web", "db"]data_centers: ["dc1", "dc2"]tasks:- name: Create config filescommand: touch /root/configs/{{ item.0 }}_{{ item.1 }}.confwith_nested:- "{{ server_types }}"- "{{ data_centers }}"
通过这个结果可以得到item.0在这里代表着server_types列表里的所有元素,item.1代表着data_centers列表的所有元素,所以最后才得到了这4个配置文件,且是进行的有序创建,那么可以得到item可以同时包含多个值,且为有序序列,所以item是一个元组。
Loop循环
- 概念:是 Ansible 2.5 版本引入的一种更通用的循环结构。它可以用于遍历多种数据类型,包括列表(list)、字典(dict)等,对嵌套也能进行操作,提供了一种统一的循环语法,相当于是with_*的升级版。
推荐使用loop循环,它能够更好地与 Ansible 的其他新特性(如条件判断、标签等)相结合,而with_items在一些复杂场景可能会受限制。
也可以参考官方文档:循环 — Ansible 社区文档 - Ansible 文档
常用过滤器:
- select / reject:这两个过滤器允许您根据条件选择或排除列表中的元素。
- unique:去除重复项元素
- flatten:列表包含其他列表,您可以使用 flatten 来将所有子列表中的元素提取出来合并成一个新的列表,具有一个可选参数levels,用于指定需要合并几层嵌套的列表
- dict2items: loop本身默认的数据格式通常是一个列表,所以需要将字典转换为包含键 - 值对的列表形式
- product:在我理解来看,这个过滤器主要用于计算两个或多个列表时的的组合问题,在数学中称它为笛卡尔积,例如,若 A = {1,2},B = {3,4},则 A×B = {(1,3),(1,4),(2,3),(2,4)}这4个组合。
基本格式:loop :{{变量名 | 过滤器(可选)}}
使用loop循环,遍历字典时,需要使用dict2items过滤器,将其转换成可被loop遍历的列表形式,其中每个元素都是一个包含key和value属性的对象
[root@web01 ansible]# cat dict.yml---- name: Configure services using a dictionaryhosts: web01vars:services:service1:port: 8080protocol: tcpservice2:port: 8888protocol: udptasks:- name: Configure Service Portslineinfile:path: /etc/services.confline: "{{ item.key }} {{ item.value.port }}/{{ item.value.protocol }}"loop: "{{ services | dict2items }}"
使用loop做一个嵌套循环
这里使用了product过滤器,最后通过list将结果组合转化为列表
[root@web01 playbook_file]# cat loop.yml---- name: Loop with custom variable namehosts: localhostvars:my_list: ["apple", "banana", "cherry"]your_list: ["orange", "peach", "pear"]tasks:- name: Print elements with custom loop variabledebug:msg: "This is what you and I like to eat {{ item.0 }}_{{ item.1 }}"loop: "{{ my_list|product(your_list)|list }}"
playbook条件
when判断
在 Ansible - Playbook 中,when语句用于条件判断,它决定了任务是否执行。只有当when条件为真时,对应的任务才会被执行。
通过判断内置变量是否正确,从而下载服务
[root@web01 playbook_file]# cat when.yml---- name: System judgmenthosts: web01tasks:- shell: echo {{ ansible_os_family }}register: my_family #存储shell输出的变量- debug:var: my_family.stdout #打印内置变量- name: Install serveryum:name: redisstate: installedwhen: ansible_os_family == "RedHat"
通过定义变量判断下载服务
[root@web01 playbook_file]# cat when2.yml---- name: Install a packagehosts: web01vars:install_package: truetasks:- name: Installyum:name: httpdstate: installedwhen: install_package
Black:定义任务组
- 在 Ansible 2.4 及以上版本中,block通常用于组织一些做重复任务的结构。它允许将多个相关的任务组合在一起,形成一个逻辑单元。这个逻辑单元可以看作是一个任务块,这些任务要么全部成功执行,要么在出现错误时按照特定的错误处理机制(如rescue和always)进行处理。
通过black定义任务块
[root@web01 playbook_file]# cat black.yml---- name: blockhosts: web01vars:install_package: truemy_info: "文件已创建"tasks:- name: blockblock:- name: Task 1 in blockfile:path: /root/httpd.confstate: touch- name: Task 2 in blockdebug:msg: "{{ my_info }}"when: install_package
通过rescue进行错误处理
如果block中的任务出错,rescue中的任务会执行。
[root@web01 playbook_file]# cat black.yml---- name: blockhosts: web01vars:install_package: truemy_info: "文件已创建"tasks:- name: blockblock:- name: Task 1 in blockfile:path: /root/httpd.confstate: touch- name: Task 2 in blockdebug:msg: "{{ 错误变量 }}" #通过自定义一个不存在的变量,让task2,出错when: install_packagerescue:- name: other taskdebug:msg: "前面任务执行失败了,现在通过rescue处理"
通过always处理进行追加任务
always中的任务无论block中的任务成功与否都会执行。
[root@web01 playbook_file]# cat black.yml---- name: blockhosts: web01vars:install_package: truemy_info: "文件已创建"tasks:- name: blockblock:- name: Task 1 in blockfile:path: /root/httpd.confstate: touch- name: Task 2 in blockdebug:msg: "{{ 错误变量 }}"when: install_packagerescue:- name: other taskdebug:msg: "前面任务执行失败了,现在通过rescue处理"always:- name: add taskdebug:msg: "{{ my_info }}"
Ansible变量
其实前面已经对变量有很多的应用了,不论是在主机清单中设置变量,还是在play文件中设置变量
这里主要对playbook中的变量进行讲解
变量的定义方式
- 通过命令行进行变量定义
- 在play文件中进行变量定义
- 通过Inventory主机信息文件中进行变量定义
变量读取的优先级为: 命令行 > playbook文件 > Inventory文件
通过vars定义变量
通过vars定义变量packages_name,下载mariadb-server服务
---- name: mysqlhosts: web01vars:packages_name:- mariadb-servertasks:- name: install mysqlyum:name: "{{packages_name}}"state: present
通过vars_files定义变量
当变量较少时,使用vars定义没有问题,当变量较多时,可以将变量保存到一个独立的文件中;
创建一个专门保存变量的文件
[root@web01 playbook_file]# cat my_vars.yml---httpd_package: httpd
通过主文件调用变量文件
[root@web01 playbook_file]# cat vars.yml---- name: mysqlhosts: web01vars:packages_name:- mariadb-servervars_files:- my_vars.yml #调用文件操作tasks:- name: install mysqlyum:name: "{{packages_name}}"state: present- name: install httpdyum:name: "{{ httpd_package }}"state: present
通过变量目录定义变量
这里需要注意这是官方制订的定义方法所以目录名字不能做修改
主机目录:host_vars
在host_vars目录中定义的变量,只能给对应的主机使用,没有定义变量的主机不能使用此处的变量
host_vars目录,然后在创建一个文件夹,文件的文件名称要与inventory清单中的主机名称要保持完全一致,如果是IP地址,则创建相同IP地址的文件即可。
在ansible目录下创建一个host_vars目录
[root@web01 ansible]# tree.├── ansible.cfg├── hosts├── host_vars #目前的一个目录结构│ └── web01 # 此为文件,非目录[root@web01 ansible]# cat host_vars/web01---my_info: "这是定义在host_vars中的变量"
主机组目录:group_vars
在项目目录中创建group_vars目录,然后在创建一个文件,文件的文件名称要与清单文件中定义的组名保持完全一致。
在ansible目录下创建一个group_vars目录
[root@web01 ansible]# tree.├── ansible.cfg├── group_vars│ └── web_group├── hosts├── host_vars│ └── web01[root@web01 ansible]# cat group_vars/web_groupgroup_info: "这是在group_vars里的信息"
主机清单:inventory.ini
ansible-playbook命令提供-i选项,用于在命令行定义主机清单(inventory.ini),命令行定义主机清单的优先级最高。
命令行主机清单(inventory.ini)> /etc/ansible/hosts
[root@web01 ansible]# tree.├── ansible.cfg├── group_play.yml├── group_vars│ └── web_group├── hosts├── host_vars│ └── web01├── inventory.ini
主机清单的配置
配置这个inventory.ini文件如果直接填写主机名,需要在/etc/hosts文件添加映射,且需要给填写主机配置免密登录
[root@web01 ansible]# cat inventory.ini#主机web01web02#主机组[web_group]web01web02
最后创建play.yml文件,来调用主机变量host_vars/web01
├── ansible.cfg├── group_vars│ └── web_group├── hosts├── host_vars│ └── web01├── inventory.ini├── play.yml[root@web01 ansible]# cat play.yml---- name: infohosts: web01tasks:- name: 记录信息debug:msg: "{{ my_info }}"
执行play.yml文件
创建group_play.yml文件,来调用主机变量group_vars/web_group
[root@web01 ansible]# tree.├── ansible.cfg├── group_play.yml├── group_vars│ └── web_group├── hosts├── host_vars│ └── web01├── inventory.ini├── play.yml[root@web01 ansible]# cat group_play.yml---- name: infohosts: web_grouptasks:- name: 记录信息debug:msg: "{{ group_info}}"
执行group_play.yml文件
通过命令行定义变量
ansible-playbook命令提供-e选项,用于在命令行定义变量,命令行定义变量的优先级最高。
[root@web01 ansible]# cat group_play.yml---- name: infohosts: web_grouptasks:- name: 记录信息debug:msg: "{{ group_info}}"
命令行定义变量,暂时替代group_vars/web_group中的变量
[root@web01 ansible]# ansible-playbook -i inventory.ini group_play.yml -e "group_info="这是在命令行定义的变量""
相关文章:

ansible 自动化运维工具(三)playbook剧本
目录 Playbook的定义 Playbook组成 Playbook命令 Playbook剧本编写格式 基本组件 Handlers处理器 tags标签 Facts组件 Register:注册变量 Debug模块 Playbook循环 With_items循环 With_dict循环(字典循环) With_nested循环&…...

图论【Lecode_HOT100】
文章目录 1.岛屿数量No.2002.腐烂的橘子No.9943.课程表No.2074.实现Trie(前缀树)No.208 1.岛屿数量No.200 class Solution {public int numIslands(char[][] grid) {if (grid null || grid.length 0) {return 0;}int numIslands 0;int rows grid.len…...

day10性能测试(2)——Jmeter
【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、LoadRunner vs Jmeter 1.1 LoadRunner 1.2 Jmeter 1.3 对比小结 2、Jmeter 环境安装 2.1 安装jdk 2.2 安装Jmeter 2.3 小结 3、Jmeter 文件目录结构 4、Jmeter默认配置修改 5、Jmeter元件、组…...

Y3编辑器文档4:触发器
文章目录 一、触发器简介1.1 触发器界面1.2 ECA语句编辑及快捷键1.3 参数设置1.4 变量设置1.5 实体触发器1.6 函数库与触发器复用 二、触发器的多层结构2.1 子触发器(在游戏内对新的事件进行注册)2.2 触发器变量作用域2.3 复合条件2.4 循环2.5 计时器2.6…...

1. 机器学习基本知识(3)——机器学习的主要挑战
1.5 机器学习的主要挑战 1.5.1 训练数据不足 对于复杂问题而言,数据比算法更重要但中小型数据集仍然很普遍,获得额外的训练数据并不总是一件轻而易举或物美价廉的事情,所以暂时不要抛弃算法。 1.5.2 训练数据不具有代表性 采样偏差&#…...

prometheusgrafana实现监控告警
Prometheus负责集群数据的监控和采集,然后传递给grafana进行可视化,集成睿象云可实现监控报警,为了方便操作,可以通过iframe嵌套grafana到指定的页面。 文章目录 1.Grafana集成Prometheus2.iframe内嵌grafana3.监控告警 1.Grafana…...
Ubuntu防火墙管理(五)——ufw源规则解读与修改
firewalld与nftables 在 /etc/firewalld/firewalld.conf 文件中,FirewallBackend 选项用于指定 Firewalld 使用的防火墙后端实现。具体来说: nftables:这是当前的默认选项,表示 Firewalld 将使用 nftables 作为防火墙后端。nftab…...

Docker如何运行一个python脚本Hello World
Docker如何运行一个python脚本Hello World 1、编写Python的Hello World:script.py #!/usr/bin/python #_*_coding:utf-8_*_ print("Hello World") 2、Dockerfile文件 #拉取Docker环境 FROM python #设置工作目录 WORKDIR /app #将dockerfile同级文件copy到…...

人工智能-自动驾驶领域
目录 引言自动驾驶与人工智能的结合为什么自动驾驶领域适合发表文章博雅智信的自动驾驶辅导服务结语 引言 自动驾驶技术的崛起是当代交通行业的一场革命。通过结合先进的人工智能算法、传感器技术与计算机视觉,自动驾驶不仅推动了技术的进步,也使得未来…...
[ubuntu18.04]ubuntu18.04安装json-c操作说明
ubuntu18.04安装json-c 代码下载 rootw1804-virtual-machine:/home/w1804/tr069# git clone https://github.com/json-c/json-c.git Cloning into /opt/git/json-c... remote: Enumerating objects: 6398, done. remote: Counting objects: 100% (1067/1067), done. remote:…...

华为eNSP:VRRP
一、VRRP背景概述 在现代网络环境中,主机通常通过默认网关进行网络通信。当默认网关出现故障时,网络通信会中断,影响业务连续性和稳定性。为了提高网络的可靠性和冗余性,采用虚拟路由冗余协议(VRRP)是一种…...

Linux--top系统资源命令查看--详解
top命令用法 图: top命令用法: top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。 top的使用方式: top [-d number] | top [-bnp] top参数解释: -…...
es的join是什么数据类型
在 Elasticsearch 中,parent 并不是一个独立的数据类型,而是与 join 数据类型一起使用的一个概念。join 数据类型用于在同一个索引中建立父子文档之间的关系,允许你在一个索引内表示层级结构或关联关系。通过 join 字段,你可以定义不同类型的文档(如父文档和子文档),并指…...

KV Shifting Attention Enhances Language Modeling
基本信息 📝 原文链接: https://arxiv.org/abs/2411.19574👥 作者: Mingyu Xu, Wei Cheng, Bingning Wang, Weipeng Chen🏷️ 关键词: KV shifting attention, induction heads, language modeling📚 分类: 机器学习, 自然语言处…...

软错误防护技术在车规MCU中应用
在大气层内,宇宙射线粒子与大气分子发生核反应生成大气中子。大气中子入射微电子器件或电路将会诱发单粒子效应(SEE),效应类型主要有单粒子翻转(SEU)、单粒子瞬态(SET)、单粒子锁定&…...

遥感图像处理二(ENVI5.6 Classic)
1 实验目的和内容 1.1 实验目的 本次上机旨在继续深入了解ENVI软件的基本使用,并对提供的实验数据进行基本的图像分割和地物分类等操作并分析结果。 1.2 实验内容 1.2.1 图像分割 对教材示例数据“C7图像分割”中的风景图、兰花图和娃娃图分别进行图像分割操作…...

经典文献阅读之--A Fast Dynamic Point Detection...(用于驾驶场景中的动态点云剔除方法)
0. 简介 现有的基于3D点的动态点检测和移除方法存在显著的时间开销,使其难以适应激光雷达-惯性测程系统。《A Fast Dynamic Point Detection Method for LiDAR-Inertial Odometry in Driving Scenarios》提出了一种基于标签一致性的动态点检测和移除方法࿰…...

百度搜索应适用中文域名国家标准,修复中文网址展示BUG
12月1日中文域名国家标准正式实施。该标准“明确了中文域名在编码、解析、注册、字表等方面的技术要求,适用于中文域名注册管理机构、注册服务机构、网络软硬件服务商及终端用户”。 00:23 显然,百度作为网络软硬件服务商,是包括在国家标准的…...
设计模式学习之——适配器模式
适配器模式(Adapter Pattern),又称作变压器模式(因为这两者都体现了“转换”或“适配”的核心概念),是一种结构型设计模式。它将一个类的接口转换成客户端所期望的另一种接口,从而使得原本因接口…...

服务器数据恢复—热备盘上线过程中硬盘离线导致raid5阵列崩溃的数据恢复案例
服务器数据恢复环境: 两组分别由4块SAS接口硬盘组建的raid5阵列,两组raid5阵列划分LUN并由LVM管理,格式化为EXT3文件系统。 服务器故障: RAID5阵列中一块硬盘未知原因离线,热备盘自动激活上线替换离线硬盘。在热备盘上…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...