一种Ansible剧本编写方法、装置和电子设备
技术领域
本发明涉及网络运维技术领域,具体涉及一种Ansible剧本编写方法、装置和电子设备。
背景技术
Ansible是自动化运维工具,用于配置管理和应用部署,即在管理主机上操作一些命令就能在节点主机上进行相应的动作。由Python语言编写,由模块组成,模块即执行动作的实体,Ansible默认提供了核心模块、自定义模块等供使用,在Ansible上都是靠着相应的模块执行动作,比如拷贝copy模块、执行command模块、shell模块、文件file模块等。在Linux中,可以通过ansible-doc-l命令查看到当前Ansible都支持哪些模块,通过ansible-doc-s模块名可以查看该模块有哪些参数可以使用。
Playbook是Ansible用于配置、部署和管理托管主机的命令和工作机制。通过读取预先编写好由一个或多个“play”组成的Playbook文件实现批量管理,Playbook可以理解为按一定条件组成的Ansible任务集,play的主要功能在于将事先归并为一组的主机装扮成事先通过Ansible中的任务定义好的角色,从根本上来讲,所谓任务无非是调用Ansible的一个模块(module)。
Playbook的字面意思即剧本,Playbook可以反复使用编写的代码,可以放到不同的机器上,像函数一样最大化的利用代码,在使用Ansible的过程中,处理的大部分操作都是在编写Playbook。
由上可知,Playbook的编写是运维人员必须掌握的技能之一。但是,现有技术中部分运维人员对Ansible工具了解不深,编写剧本困难,影响了运维工作顺利开展。
发明内容
本发明提供了一种Ansible剧本编写方法、装置和电子设备,通过利用浏览器插件生成交互式图表,将剧本编写过程在页面展现出来,使得运维人员不需要关注剧本复杂格式要求及相关代码,只需要通过可视化的界面元素进行编辑即可,大大降低了掌握Ansible剧本编写的难度,有利于提高运维效率。
根据本申请的一个方面,提供了一种Ansible剧本编写方法,包括:
将Ansible剧本编写中使用的多个模块的模块名称以及参数信息存入数据库;
利用加载的浏览器插件读取所述数据库中的模块名称以及参数信息,根据读取的模块名称以及参数信息生成交互式图表后展现在页面上;
接收对所述页面上展现的所述交互式图表的元素的编辑指令,并根据编辑完成后触发的剧本生成请求,生成剧本。
可选地,所述将Ansible剧本编写中使用的多个模块的模块名称以及参数信息存入数据库包括:
将Ansible剧本编写中使用的多个模块划分成若干个分组,获取各分组中的模块的模块名称以及参数信息,将获取的信息存入关系数据库。
可选地,所述根据读取的所述模块名称以及所述参数信息生成交互式图表包括:
根据读取的各分组中的模块的所述模块名称以及参数信息,生成包含分组元素的交互式图表后展现在页面上,
其中,分组元素与分组对应,分组包括命令管理分组、文件管理分组、系统管理分组、网络工具分组、逻辑管理分组以及辅助模块分组;
各所述分组元素中包括一个或多个模块元素。
可选地,所述接收对所述页面上展现的所述交互式图表的元素的编辑指令包括:
接收对所述模块元素的拖拽指令并记录拖拽指令的先后顺序,将所述拖拽指令的先后顺序作为生成的剧本中对应模块的执行顺序,其中所述模块元素位于所述页面上展现的所述交互式图表中的模块区;
根据所述拖拽指令将选择的所述模块元素移动至所述交互式图表中的工作区,
接收对所述交互式图表中的参数区内与所述模块元素对应的参数信息的输入指令,
以及,接收对所述工作区内所述模块元素间的连线指令,根据所述连线指令在选择的模块元素间添加连线。
可选地,所述接收对所述页面上展现的所述交互式图表的元素的编辑指令还包括:
接收对所述交互式图表中添加条件模块元素的拖拽指令,根据所述拖拽指令将所述添加条件模块元素移动至所述工作区内指示条件判断的模块元素的下方,
根据接收的所述连线指令将所述添加条件模块元素与所述指示条件判断的模块元素用连线连接并为所述添加条件模块元素设置两个条件分支连线,接收在所述参数区内的所述指示条件判断的模块元素对应的参数信息处输入的判断条件内容;
以及,接收将满足判断条件内容时对应执行的模块元素拖拽至条件分支连线的目的端的拖拽指令,根据所述拖拽指令将所述模块元素移动至条件分支连线的目的端。
根据本申请的另一个方面,提供了一种Ansible剧本编写装置,包括:
数据处理单元,用于将Ansible剧本编写中使用的多个模块的模块名称以及参数信息存入数据库;
页面展现单元,用于利用加载的浏览器插件读取所述数据库中的模块名称以及参数信息,根据读取的所述模块名称以及参数信息生成交互式图表后展现在页面上;
剧本生成单元,用于接收对所述页面上展现的所述交互式图表的元素的编辑指令,并根据编辑完成后触发的剧本生成请求,生成剧本。
可选地,所述数据处理单元,用于将Ansible剧本编写中使用的多个模块划分成若干个分组,获取各分组中的模块的所述模块名称以及参数信息,将获取的信息存入关系数据库。
可选地,所述页面展现单元,具体用于根据读取的各分组中的模块的所述模块名称以及参数信息,生成包含分组元素的所述交互式图表后展现在页面上,其中,分组元素与分组对应,分组包括命令管理分组、文件管理分组、系统管理分组、网络工具分组、逻辑管理分组以及辅助模块分组;各分组元素中包括一个或多个模块元素。
可选地,所述剧本生成单元,具体用于接收对所述模块元素的拖拽指令并记录拖拽指令的先后顺序,将所述拖拽指令的先后顺序作为生成的剧本中对应模块的执行顺序,其中所述模块元素位于所述页面上展现的所述交互式图表中的模块区;根据所述拖拽指令将选择的模块元素移动至交互式图表中的工作区,接收对所述交互式图表中的参数区内与模块元素对应的参数信息的输入指令,以及,接收对所述工作区内模块元素间的连线指令,根据连线指令在选择的模块元素间添加连线。
根据本申请的再一个方面,提供了一种电子设备,电子设备包括:存储器和处理器,所述存储器和所述处理器之间通过内部总线通讯连接,所述存储器存储有能够被所述处理器执行的程序指令,所述程序指令被所述处理器执行时能够实现本申请一个方面所述的方法。
应用本发明实施例的Ansible剧本编写方法、装置和电子设备,将Ansible剧本编写中使用的多个模块的信息存入数据库,利用加载的浏览器插件读取数据库中的信息并生成交互式图表后展现在页面上;后续接收对页面上展现的交互式图表的元素的编辑指令,即可根据编辑完成后触发的剧本生成请求,自动生成剧本。由此,使运维人员不需要关注剧本自身复杂的格式要求、相关代码和各模块包含哪些参数,只需要对可视化的界面元素进行编辑,比如在页面上拉取模块组成一个完整的流程,填写各模块参数即可由后台代码自动生成剧本(即Playbook),大大降低了掌握Ansible剧本编写的难度,有利于提高运维效率。
附图说明
图1是本发明一个实施例的Ansible剧本编写方法的流程图;
图2是应用图1所示方法编写实现tomcat自动部署的剧本的页面展示图;
图3是图2中的模块的参数信息的展示图;
图4是图2中的模块添加条件判断的示意图;
图5是本发明一个实施例点击图4中的条件分支连线后展示的参数信息的示意图;
图6是本发明一个实施例的Ansible剧本编写装置的框图;
图7是本发明一个实施例的电子设备的结构示意图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的设计构思在于,针对现有技术中部分运维人员对Ansible工具了解不深,编写剧本困难,影响了运维工作顺利开展的技术问题,提出一种Ansible工具的剧本编写方案,通过将Ansible剧本编写中使用的多个模块的信息存入数据库,利用浏览器插件读取数据库中的信息生成交互式图表后展现在页面上,用户只需对页面上的交互式图表元素进行编辑即可自动生成剧本,降低了Ansible剧本编写难度。
需要说明的是,本发明实施例中的剧本是自动化运维工具Ansible中的一种Playbook文件,在Playbook中可以编排有序的执行过程,并且可以同步或异步的发起任务。
图1是本发明一个实施例的Ansible剧本编写方法的流程图,参见图1,本实施例的Ansible剧本编写方法包括下列步骤:
步骤S101,将Ansible剧本编写中使用的多个模块的模块名称以及参数信息存入数据库;
步骤S102,利用加载的浏览器插件读取所述数据库中的模块名称以及参数信息,根据读取的所述模块名称以及参数信息生成交互式图表后展现在页面上;
步骤S103,接收对所述页面上展现的所述交互式图表的元素的编辑指令,并根据编辑完成后触发的剧本生成请求,生成剧本。
由图1所示可知,本发明实施例的剧本Playbook编写方法,通过将Ansible剧本编写中使用的多个模块的模块名称以及参数信息存入数据库,利用加载的浏览器插件读取数据库中的信息,根据读取的信息生成交互式图表后展现在页面上,接收用户对页面上展现的交互式图表的元素的编辑指令,并根据编辑完成后触发的剧本生成请求,后台Java代码即可根据用户在页面上的确定的流程图自动生成剧本,解决了现有技术中运维人员对Ansible了解不深,编写剧本困难的技术问题,方便使用Ansible工具进行运维,提高了运维工作的效率。
总的来说,本发明实施例的Ansible剧本编写方法是通过将Ansible剧本编写中常用的模块数据化后存入数据库,然后利用浏览器插件GoJs将剧本的编写过程在web页面展现出来,达到可视化的目的。这里的数据化是指对Ansible的一些模块,比如那些常用的模块进行整理,整理的内容包括模块名称、模块内的参数名以及参数值,如果参数的值对应有固定值,则将这些固定参数值一并存入数据库;后续对于有固定值的参数和没有固定值的参数以不同的形式展现,比如没有固定值的参数,页面以输入框的形式展现,而有固定值的参数,页面以下拉复选框或者单选框的形式展现。
在一次应用过程中,本实施例的方法先将Ansible剧本编写中使用的多个模块划分成若干个分组,获取各分组中的模块的模块名称以及参数信息,将获取的信息存入关系数据库。也就是说,将Ansible剧本的常用模块分成若干个分组,如:命令管理、文件管理、网络工具、逻辑管理等分组。网络工具分组中包含下载文件、接口请求等Ansible模块,整理每个Ansible模块的参数信息,将信息录入关系数据库。
需要说明的是,本实施例中对Ansible模块分组是为了更直观、简洁的看到模块的大致分类。具体可以依据Ansible自身的分组并加上用户自身的需求和理解将Ansible模块中的英文转化为中文展现,比如将其中关于文件操作的模块归纳为文件管理分组、将关于网络操作的模块归纳为网络工具,将创建目录单独作为一个文件管理模块,将下载文件模块单独作为一个网络工具模块。
一个实施例中,Ansible剧本编写方法对Ansible进行简单归纳封装,并选取关系数据库来存储模块的具体信息,其他实施例中也可以选用其他数据库,对数据库不做限定。
接着,利用插件GoJS根据读取的模块名称以及参数信息生成交互式图表,具体包括:根据读取的各分组中的模块的模块名称以及参数信息,生成包含分组元素的交互式图表后展现在页面上,其中,分组元素与分组对应,分组包括命令管理分组、文件管理分组、系统管理分组、网络工具分组、逻辑管理分组以及辅助模块分组;各分组元素中包括一个或多个模块元素。即,读取关系数据库存入的Ansible模块的信息,在页面上以分组形式展现出来。
这样,用户就可以在页面上操作和编辑来实现自己想要编写的剧本了。比如,接收对页面上展现的交互式图表中右侧模块区内的模块元素的拖拽指令并记录拖拽指令的先后顺序,将拖拽指令的先后顺序作为生成的剧本中对应模块的执行顺序;根据拖拽指令将选择的模块元素移动至交互式图表中左侧工作区,接收对所述交互式图表中右侧参数区内与模块元素对应的参数信息的输入指令,以及,接收对工作区内模块元素间的连线指令,根据连线指令在选择的模块元素间添加连线。
又比如,当需设置条件判断时,接收对交互式图表中添加条件模块元素的拖拽指令,根据拖拽指令将添加条件模块元素移动至左侧工作区内一个指示条件判断的模块元素的下方,根据接收的连线指令将添加条件模块元素与指示条件判断的模块元素用连线连接并为添加条件模块元素设置两个条件分支连线,接收在交互式图表中右侧参数区指示条件判断的模块元素对应的参数信息处输入的判断条件内容;以及,接收在满足判断条件内容时对应执行的模块元素拖拽至条件分支连线的目的端的拖拽指令,根据拖拽指令将模块元素移动至条件分支连线的目的端。
注:GoJS是一个功能丰富的JavaScript库,用于在现代Web浏览器和平台上实现自定义交互式图表和复杂可视化。GoJS使用可自定义的模板和布局轻松构建复杂节点、链接和组的JavaScript图表。GoJS为用户交互提供了许多高级功能,例如拖放、复制粘贴、文本编辑、工具提示、上下文菜单、自动布局、模板、数据绑定和模型、事务状态和撤消管理、调色板、概述、事件处理程序、命令和用于自定义操作的可扩展工具系统。GoJS是纯JavaScript,因此用户可以获得交互性,而无需往返服务器和插件。GoJS通常在浏览器中完全运行,呈现为HTML5Canvas元素或SVG,没有任何服务器端要求。GoJS不依赖于任何JavaScript库或框架,因此它应该适用于任何HTML或JavaScript框架或根本没有框架。
本实施例中,利用了GoJS的特性在页面加载的时候调用后台接口读取已入库的数据信息,封装成GoJS需要的数据格式返回前端,前端会自动生成JavaScript图表,JavaScript图表包括多个模块元素的右侧模块区,接收和支持拖拽需要的Ansible模块到GoJS的编辑区,按照需要实现的剧本的顺序组织各个Ansible模块,并接收各Ansible模块的参数值的录入。
需要说明的是,本实施例中以开源的GoJS插件为例来说明如何生成JavaScript图表页面的,本发明实施例对浏览器插件不做限制,只要能够实现读取入库信息,生成交互式图表展现在页面上即可。
最后,触发生成剧本请求(比如点击页面上的展示的生成剧本请求控件),后台利用java代码自动生成剧本。
下面结合一个具体的应用场景对本发明实施例的Ansible剧本编写方法的实现过程进行说明。
以自动生成部署tomcat8的剧本为例,结合图2至图5,对本实施例的方法的流程说明如下:
参见图2,图2是利用GoJS的特性生成的JavaScript图表,图2所示交互式图表的右侧模块区展示了多个分组元素,分别是:命令管理分组、文件管理分组、系统管理分组、网络工具分组、逻辑管理分组以及辅助模块分组,这里的分组是将Ansible常用的模块进行分组,实际应用中分组的数量,各分组包含的模块可以根据需要调整,不以此为限。
如图2所示,各分组元素中包括一个或多个模块元素。用户可以根据需要拖拽相应的模块元素到左侧工作区,拖拽的先后顺序指示了剧本执行的先后顺序。
步骤一,将图2右侧的模块区的创建文件模块元素拖拽到左侧工作区。
也就是说,接收位于图2所示交互式图表右侧的模块区内的模块元素的拖拽指令,并记录拖拽指令的先后顺序,根据拖拽指令将选择的模块元素移动至交互式图表中左侧的工作区,将拖拽指令的先后顺序作为生成的剧本中对应模块的执行顺序。
步骤二,将左侧工作区内的各个模块连接成流程图;
在这一步骤中接收对所述工作区内模块元素间的连线指令,根据连线指令在选择的模块元素间添加连线,比如鼠标移动并停留在每个已拖拽到工作区的模块的周边时,模块上呈现阴影,这时,按下鼠标左键并持续拖动鼠标到下一个模块的周边,即可实现两个模块之间的有向连线,方向代表了模块执行的先后顺序。
步骤三,点击左侧工作区内的创建文件模块,右侧自动出现该模块需要编辑的参数,方便接收对交互式图表中的参数区内与模块元素对应的参数信息的输入指令。如图3所示,在图3中示意的右侧的参数区的自定义模块名称这一参数信息下方的输入框中填写“创建tomcat安装目录”来定义创建文件模块元素的名称,参见图3中左侧工作区中第一个方框中显示的创建tomcat安装目录这一模块元素。
本实施例中还在右侧参数区的目录全路径参数信息下方对应的输入框中接收录入的路径信息“/ultra/tomcat8”。可以理解,这里的模块名称以及路径仅用作示例,实际应用中应当根据需要进行设置。图3还示意了接收在右侧参数区中输入权限参数信息,例如,输入的权限信息的值为0777。
需要说明的是,每个Ansible模块包含的参数信息不尽相同,实际应用时应将各模块的全部或部分必要的信息整理好后存入到关系数据库中,后续GoJS根据关系数据库中的信息生成交互式图表的界面元素,供用户编辑和输入参数的值从而方便自动生成需要的剧本。
重复上述步骤一和步骤三,按顺序将其余各个需要的模块元素拖拽到左侧的工作区并在右侧的参数区设置对应的参数信息,每新拖拽一个模块元素到左侧工作区之后使用连线依次将新添加的模块元素与已有模块元素连接起来,构成流程图。
需要说明的是,在本发明的其他实施例中,也可以先整理好一个剧本中各模块的流程,将整个流程用连线连起来。
此外,参见图4和图5,当需要设置条件判断时本实施例的交互式图表的右侧模块区内展示有一“辅助模块”分组,该分组包含一模块名称为“条件添加”的模块元素,添加判断条件的过程例如是:
(一)在交互式图表左侧的工作区内的添加条件(参见图4中的“添加条件12”)这一模块元素的上一个模块元素上,即指示条件判断的模块元素(见图4中的“是否存在tomcat进程”)添加执行命令,并在右侧参数区内输入要执行的条件判断命令内容,如图4所示的“ps-ef|grep tomcat|grep–v grep|awk‘{print$2}’”。
一个实施例中,还可以设置动作结果保存变量这一高级参数,如果勾选动作结果保存变量这一高级参数对应的单选框,则是否存在tomcat进程这一模块执行后的结果会以变量的形式保存在剧本中,那么在该模块后面的模块中,尤其是执行命令的时候可以调用这个变量来执行操作。动作结果保存变量属于高级参数,高级参数默认不展开。图4中为了便于理解,示意了高级参数展开的情况,由图4所示可知,保存动作结果到变量的单选框被勾选,则将保存动作结果到变量,变量名为shellCsaVar11。
(二)点击交互式图表左侧工作区的条件分支连线(即图5左侧所示流程图中添加条件12这一模块元素左右两端的带“是”“否”文字的那两条连线),交互式图表右侧参数区展现分支判断语言,连线的目的端就是满足此条件下执行的模块信息,如图5所示,对是否存在tomcat进程添加两个分支,存在tomcat进程,以及不存在tomcat进程,将这两个分支的模块元素与添加条件模块元素用连线连接起来,连线的起始端为添加条件模块,目的端是满足此条件下执行的模块。
需要说明的是,在剧本执行过程中会出现执行条件判断的情况,这时就需要加入添加条件这一模块,该模块分出两个分支,如图5所示添加条件12的左右两边,用户点击每个分支的连线则出现右侧的参数区,用户再这里输入如shellCsaVar11.stdout!=”这样的判断条件,满足此条件的情况下,连接的模块才会被执行。图5给出的是点击判断条件12左侧连线出现的参数区,参数区内已示意出条件的具体内容。
通过添加条件判断模块和各个分支满足了剧本执行过程中的条件判断需求。
步骤三,完成整个工作区的流程之后,即可生成Ansible剧本。
本实施例中,生成的剧本代码示意如下:
由上述可知,通过应用本发明实施例的Ansible剧本编写方法,使得运维人员不需要关注剧本本身的复杂格式要求及相关代码和各模块包含哪些参数,只需要拉取页面上的模块组成一个完整的流程图,然后填写各模块的参数即可由后台自动生成剧本,有利于提高运维工作的效率。
与前述Ansible剧本编写方法同属于一个技术构思,本发明实施例还提供了一种Ansible剧本编写装置,图6是本发明一个实施例的Ansible剧本编写装置的框图,参见图6,本实施例的Ansible剧本编写装置600包括:
数据处理单元601,用于将Ansible剧本编写中使用的多个模块的模块名称以及参数信息存入数据库;
页面展现单元602,用于利用加载的浏览器插件读取所述数据库中的模块名称以及参数信息,根据读取的模块名称以及参数信息生成交互式图表后展现在页面上;
剧本生成单元603,用于接收对所述页面上展现的所述交互式图表的元素的编辑指令,并根据编辑完成后触发的剧本生成请求,生成剧本。
在本发明的一个实施例中,数据处理单元601,用于将Ansible剧本编写中使用的多个模块划分成若干个分组,获取各分组中的模块的模块名称以及参数信息,将获取的信息存入关系数据库。
在本发明的一个实施例中,页面展现单元602,具体用于根据读取的各分组中的模块的模块名称以及参数信息,生成包含分组元素的交互式图表后展现在页面上,其中,分组元素与分组对应,分组包括命令管理分组、文件管理分组、系统管理分组、网络工具分组、逻辑管理分组以及辅助模块分组;各分组元素中包括一个或多个模块元素。
在本发明的一个实施例中,剧本生成单元603具体用于接收对所述模块元素的拖拽指令并记录拖拽指令的先后顺序,将所述拖拽指令的先后顺序作为生成的剧本中对应模块的执行顺序,其中所述模块元素位于所述页面上展现的所述交互式图表中的模块区;根据所述拖拽指令将选择的模块元素移动至交互式图表中的工作区,接收对所述参数区内与模块元素对应的参数信息的输入指令,以及,接收对所述工作区内模块元素间的连线指令,根据所述连线指令在选择的模块元素间添加连线。
需要说明的是,关于图6所示的装置中的各单元所执行的各功能的举例解释说明,与前述方法实施例中的举例解释说明一致,这里不再赘述。
图7是本发明一个实施例的电子设备的结构示意图。如图7所示,该电子设备包括存储器701和处理器702,存储器701和处理器702之间通过内部总线703通讯连接,存储器701存储有能够被处理器702执行的程序指令,程序指令被处理器702执行时能够实现上述的Ansible工具的剧本编写方法。
此外,上述的存储器701中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本发明的另一个实施例提供一种计算机可读存储介质,计算机可读存储介质存储计算机指令,计算机指令使所述计算机执行上述的Ansible工具的剧本编写方法。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图的一个流程或多个流程和/或方框图的一个方框或多个方框中指定的功能的装置。
需要说明的是术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本发明的说明书中,说明了大量具体细节。然而能够理解的是,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。类似地,应当理解,为了精简本发明公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,正如权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
以上所述,仅为本发明的具体实施方式,在本发明的上述教导下,本领域技术人员可以在上述实施例的基础上进行其他的改进或变形。本领域技术人员应该明白,上述的具体描述只是更好的解释本发明的目的,本发明的保护范围以权利要求的保护范围为准。