ansible 自动化运维工具(三)playbook剧本

目录

Playbook的定义

Playbook组成

Playbook命令

Playbook剧本编写格式

基本组件

Handlers处理器

tags标签

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中的一个脚本,shellplaybook,而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的格式如下:

  1. .文件的第一行应该以“---”(三个连字符)开始,表明YAML文件的开始。
  2. 常见的缩进为4格方式,也可以使用 2 个空格或制表符,但要保持一致。
  3. 在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
  4. YAML中的列表元素以“-”开头并且跟着一个空格。后面为元素内容。
  5. 同一个列表之中的元素应该保持相同的缩进,否则会被当做错误处理。
  6. 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 文档

常用过滤器:

  1. select / reject:这两个过滤器允许您根据条件选择或排除列表中的元素。
  2. unique:去除重复项元素
  3. flatten:列表包含其他列表,您可以使用 flatten 来将所有子列表中的元素提取出来合并成一个新的列表,具有一个可选参数levels,用于指定需要合并几层嵌套的列表
  4. dict2items loop本身默认的数据格式通常是一个列表,所以需要将字典转换为包含键 - 值对的列表形式
  5. 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中的变量进行讲解

变量的定义方式

  1. 通过命令行进行变量定义
  2. 在play文件中进行变量定义
  3. 通过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="这是在命令行定义的变量""

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/490009.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12.2【JAVA EXP4]next.js的各种问题,DEBUG,前端补强,前后端交互,springSecurity ,java 配置,h2数据库

在服务器组件中使用了 useState 这样的 React Hook。useState 只能在客户端组件中使用,而不能在服务器组件中使用。Next.js 的新架构(App Router)中,默认情况下,页面和布局组件是服务器组件,因此不能直接使…

Cursor重置机器码-解决Too many free trials.

参考文章:如何绕过Cursor的机器绑定限制 前言 在前面这篇文章无限使用Cursor指南中,我提到使用 无限邮箱 或者 删除账号并重新注册 的方法,来无限使用Cursor免费版。但是当在本机登录过3个账号后,就会报这个“Too many free tria…

【PlantUML系列】部署图(七)

一、部署图的组成部分 节点(Node):使用node关键字定义一个节点,节点可以是服务器、数据库或其他硬件设备。组件(Component):使用component关键字定义一个组件,组件可以是软件模块或服…

qt QCommandLineParser详解

1、概述 QCommandLineParser是Qt框架中提供的一个类,专门用于解析命令行参数。它简化了命令行参数的处理过程,使得开发者能够轻松定义、解析和验证命令行选项和参数。QCommandLineParser适用于需要从命令行获取输入的控制台应用程序,以及需要…

青少年夏令营管理系统的设计与开发(社团管理)(springboot+vue)+文档

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

vue3-tp8-Element:对话框实现

效果 参考框架 Dialog 对话框 | Element Plus 具体实现 一、建立view页面 /src/views/TestView.vue 二、将路径写入路由 /src/router/index.js import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vueconst router create…

【鸿睿创智开发板试用】移植OpenCV 4到OpenHarmony 4.1

目录 目录 引言 编译系统镜像 (1) 下载代码后解压SDK (2) 下载docker镜像   (3) 编译OH 编译OpenCV 下载OpenCV源代码 构建编译配置文件 执行编译命令 安装库和头文件 测试 结语 引言 最近有个需求是在基于RK3568的OpenHarmony 4.1系统中使用OpenCV&#xff0c…

TimesFM(Time Series Foundation Model)时间序列预测的数据研究(3)

前一篇完成了 TimesFM 的运行 TimesFM(Time Series Foundation Model)安装(2)-CSDN博客文章浏览阅读520次,点赞13次,收藏24次。决定在 小红帽ubuntu UBUNTU安装 timesFM在 ide.cloud.tencent.com 的环境上…

【潜意识Java】深入理解 Java 面向对象编程(OOP)

目录 什么是面向对象编程(OOP)? 1. 封装(Encapsulation) Java 中的封装 2. 继承(Inheritance) Java 中的继承 3. 多态(Polymorphism) Java 中的多态 4. 抽象&…

三、汇总统计

1.SUM、COUNT、AVERAGE 注意:count函数是计算区域中包含数字的单元格的个数,以上案例中两个空白单元格和一个中文列标题都是没有计算在内的。 平均函数AVERAGE也是按照17进行求平均值的。所以在使用平均值的函数时候,可以根据实际情况看是…

EXCEL的各种图形,统计图形

目录 0 EXCEL的各种图形,统计图形 1 统计图形 / 直方图 / 其实叫 频度图 hist最合适(用原始数据直接作图) 1.1 什么是频度图 1.2 如何创建频度图,一般是只选中1列数据(1个数组) 1.3 如何修改频度图的宽度 1.4 hist图的一个特…

基于Llamaindex的网页内容爬取实战

目的 本文不关注如何解析网页 html 元素和各种 python 爬虫技术,仅作为一种网页数据的预处理手段进行研究。Llamaindex 也并不是爬虫技术的集大成者,使用它是为了后续的存查一体化。 安装依赖 pip install llama-index-readers-web # pip install llam…

debian12学习笔记

前置条件 基于debian12官网的qcow2格式文件进行操作 安装ssh 登录虚拟机后安装ssh服务端 apt install openssh-server配置国内源 新增/etc/apt/sources.list.d/tsinghua.list 使用清华大学的源 https://www.cnblogs.com/shanhubei/p/18104430 deb https://mirrors.tuna.t…

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1,因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

UE5编辑器下将RenderTarget输出为UTexture并保存

在使用UE5开发项目时,RenderTarget是一种非常强大的工具,常用于生成实时纹理效果、后处理和调试。而将RenderTarget的内容转换为UTexture并储存,是许多编辑器内的需求都需要的功能。 1.材质球输出至Texture 首先创建一个Actor类&#xff0c…

电容Q值、损耗角、应用

电容发热的主要原因:纹波电压 当电容两端施加纹波电压时,电容承受的是变化的电压,由于电容内部存在寄生电阻(ESR)和寄生电感(ESL).因此电容会有能量损耗,从而产生热量,这…

go-zero(十三)使用MapReduce并发

go zero 使用MapReduce并发 一、MapReduce 介绍 MapReduce 是一种用于并行计算的编程模型,特别适合在大规模数据处理场景中简化逻辑代码。 官方文档: https://go-zero.dev/docs/components/mr 1. MapReduce 的核心概念 在 MapReduce 中,主…

入门pytorch-Transformer

前言 虽然Transformer是2017年由Google推出,如果按照读论文只读近两年的思路看,那它无疑是过时的,但可惜的是,目前很多论文的核心依然是Transformer,或者由其进行改进的,故本文使用pytorch来搭建一下Trans…

利用代理IP爬取Zillow房产数据用于数据分析

引言 最近数据分析的热度在编程社区不断攀升,有很多小伙伴都开始学习或从事数据采集相关的工作。然而,网站数据已经成为网站的核心资产,许多网站都会设置一系列很复杂的防范措施,阻止外部人员随意采集其数据。为了解决这个问题&a…

精品基于Python实现的微信小程序校园导航系统-微信小程序

[含文档PPT源码等] [包运行成功永久免费答疑辅导] 《django微信小程序校园导航系统》该项目采用技术Python的django框架、mysql数据库 ,项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、核心代码介绍视频等 软件开发环境及开发工具&#xf…