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阵列中一块硬盘未知原因离线,热备盘自动激活上线替换离线硬盘。在热备盘上…...
MetaGPT源码 (Memory 类)
目录 MetaGPT源码:Memory 类例子 MetaGPT源码:Memory 类 这段代码定义了一个名为 Memory 的类,用于存储和管理消息(Message)对象。Memory 提供了多种操作消息的功能,包括添加单条或批量消息、按角色或内容筛选消息、删除最新消息…...
数据结构与算法复习AVL树插入过程
环境 $ cat /proc/version Linux version 6.8.0-45-generic (builddlcy02-amd64-115) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.2.0-23ubuntu4) 13.2.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #45-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 30 12:02:04 UTC 2024 #include <std…...
小迪笔记第 五十天 文件包含漏洞 远程包含 本地包含 ctf练习题实战
前言 文件包含漏洞 原理就是包含的文件如果可控就会造成这个漏洞 php文件包含的特征 : PHP:include、require、include_once、require_once等 一共是分为了2 种 一个就是 远程文件包含 这个的前提是php开启了 远程文件上传这个选项 原理应用就是…...
单片机:实现点阵汉字平滑滚动显示(附带源码)
单片机实现点阵汉字平滑滚动显示 点阵显示技术是嵌入式系统中的常见显示技术之一,广泛应用于LED矩阵显示屏、广告牌、电子时钟等设备。在本项目中,我们将实现一个基于单片机的点阵汉字平滑滚动显示系统,使用LED点阵显示屏来实现动态滚动的汉…...
C# 实现 10 位纯数字随机数
本文将介绍如何用 C# 实现一个生成 10 位纯数字随机数的功能。以下是完整的代码示例: using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace RandomTset {class Program{// 使用GUID作为种子来创建随机数生成器static…...
分布式全文检索引擎ElasticSearch-基本概念介绍
一、索引类型 索引,可以理解是我们的目录,看一本书的时候,可以根据目录准确快速定位到某一页,那么索引就可以帮我们快速定位到某条数据在庞大的数据表的哪一个位置。 我们常见的索引包括正排索引和倒排索引 1、正排索引 正排索…...
电子应用设计方案-49:智能拖把系统方案设计
智能拖把系统方案设计 一、引言 随着人们生活水平的提高和对清洁效率的追求,智能拖把作为一种创新的清洁工具应运而生。本方案旨在设计一款功能强大、操作便捷、清洁效果出色的智能拖把系统。 二、系统概述 1. 系统目标 - 实现自动清洁地面,减轻用户劳…...
汽车免拆诊断案例 | 2014款保时捷卡宴车发动机偶尔无法起动
故障现象 一辆2014款保时捷卡宴车,搭载3.0T 发动机,累计行驶里程约为18万km。车主反映,发动机偶尔无法起动。 故障诊断 接车后试车,发动机起动及运转均正常。用故障检测仪检测,发动机控制单元(DME&#x…...
电脑怎么设置通电自动开机(工控机)
操作系统:win10 第一步,电脑开机时按del键进入bios页面。 第二步,选择advanced下的IT8712 Super IO Configuration 第三步,找到Auto Power On,将其从Power off设置为Power On 第四步,F10保存,大…...
MaxKB进阶:豆包大模型驱动的智能日报小助手
MaxKB进阶:豆包大模型驱动的智能日报小助手 说明: 在本教程中,我们通过“智能日报小助手”的应用场景,全面解析MaxKB的进阶功能:从如何接入公共大模型(以豆包为例),到函数功能的灵活…...
政府网站建设管理经验汇报材料/成都网络营销推广
dagger2 和 RxJava butterknife 以及 Retrofit使用起来非常酸爽 代码非常干净清晰 动手尝试 配置编译 DaggerAppComponent的时候 出现问题 配置dagger2 在 Application中能够顺利编译,但是添加完 butterknife之后 Application中的 DaggerAppComponent编译失败。原来是dagger2和…...
如何优化移动端网站/网站关键词优化费用
终止正在运行的matlab文件,需要命令窗口按快捷键,有三种快捷键可以选择: 一: ctrl c 二: ctrlbreak 三: ctrlaltbreak如果是在服务器上跑的代码的话,按完快捷键之后有时候需…...
唐山市住房和城乡建设局官方网站/企拓客软件多少钱
这题的题意是给定N个串,某个串的子串在超过一半的串存在的话,那么这个串就是可取的,问满足这样的子串的最长长度是多少,如果有多个的话,按字典序输出。 这题我是用hash过的。大体步骤是这样的,首先保留最长…...
网站建设男装定位/成都高薪seo
Solaris 10整合apache与php过程及出错处理<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />作者:田逸([email]sery163.com[/email])发表于[url]http://os.51cto.com/art/200705/47439.htm[/url…...
网站建设有哪些软件有哪些/国内的搜索引擎有哪些
ORM百度百科上一篇分析了数据库创建相关的核心代码,这一篇主要是分析Sugar中怎么通过domain映射相关table首先分析SchemaGenerator.javacreateTable(Class> table, SQLiteDatabase sqLiteDatabase)中的getTableFields方法List fields ReflectionUtil.getTableFi…...
企业网站建设方案.doc/响应式网站 乐云seo品牌
elites alliance allies revert stewardship fringe orthodoxy creak incitement repudiate wrangle democrat credence filibuster petition disbar purge tumor ductal oncogenic mutant inflammation progenitor...