2024广东省职业技能大赛云计算赛项实战——Ansible部署Zabbix

Ansible部署Zabbix

前言

今年的比赛考了一道Ansible部署Zabbix的题目,要求就是用两台centos7.5的云主机,一台叫ansible,一台叫node,使用对应的软件包,通过ansible节点控制node节点安装zabbix服务。这道题还是算比较简单的题,不过也是有坑就是了。

Ansible 是一个开源的自动化工具,用于配置管理、应用程序部署、任务自动化和 IT 编排,可以简化和自动化繁琐的运维任务。
关于zabbix的了解和基础的搭建,我在这篇文章中有讲:1+X云计算运维与开发(中级)实战案例——Zabbix分布式监控系统搭建_实战案例——zabbix 分布式监控系统-CSDN博客
不了解的可以去看看,看完你就会发现Ansible部署Zabbix根本没有难点,主要就是避坑。

虚拟机使用的是自行创建的CentOS7,如果你不会,那虚拟机创建的流程可以参考我这篇文章:职业技能大赛云计算赛项实战——OpenStack搭建-CSDN博客
需要的镜像Centos7.5为CentOS-7-x86_64-DVD-1804.iso,可从阿里镜像站下载:centos-vault-7.5.1804-isos-x86_64安装包下载_开源镜像站-阿里云 (aliyun.com)
因为我没有镜像,也没那么多流量下载,所以我用7.4的CentOS-7-x86_64-DVD-1708替代需要用到的软件包:https://pan.baidu.com/s/1y9OckLD3HmIq40g_y-XYbQ?pwd=2s9q
提取码:2s9q

我为什么说这道题坑呢,因为当时我还没有想到把里面的文件搞到本地的方法,只能在他们那个平台做这道题,题目要求用7.5的云主机,而那个平台申请的主机全是7.9的。这就导致在后面安装软件包时出现依赖关系错误,比如安装zabbix需要php的版本为5.4.16-46,虽然在软件包里携带的zabbix软件仓库有,但7.9的系统源的版本是5.4.16-48,安装时系统默认安装更高版本的,又比如mariadb,需要的版本是5.5.56-2,但7.9的版本更高,是1:5.5.68-1,同时系统还默认安装了更高版本的mariadb-libs。最后我是通过指定7.5的系统源,再把mariadb-libs删掉做出来的。
7.5的系统源里,php的版本是5.4.16-45,mariadb则一样,是5.5.56-2,安装时默认安装最新版本,不会影响到过程
我用7.4的替代,php的版本更低,是php-5.4.16-42,也不会影响

节点规划如下:

主机名IP/24节点
ansible192.168.100.21ansible节点
node192.168.100.22node节点

操作过程

更改主机名

#两个节点修改好主机名
[root@localhost ~]# hostnamectl set-hostname ansible
[root@localhost ~]# bash
[root@ansible ~]# [root@localhost ~]# hostnamectl set-hostname node
[root@localhost ~]# bash
[root@node ~]# 

上传软件包

将我提供的软件包上传至ansible节点
在这里插入图片描述

解压软件包

#ansible包含了安装ansible的软件包以及依赖,我们把ansbile的软件仓库解压至/opt目录
[root@ansible ~]# tar -zxf ansible.tar.gz -C /opt
[root@ansible ~]# ls /opt/ansible/
packages  repodata
#install_zabbix.tar.gz是ansible执行任务需要用到的文件,我们把它解压到主目录即可
[root@ansible ~]# tar -zxf install_zabbix.tar.gz
[root@ansible ~]# ls install_zabbix
group_vars  install_zabbix.yaml  roles
[root@ansible ~]# ls install_zabbix/roles/zabbix/
files  handlers  meta  tasks  templates  vars
[root@ansible ~]# ls install_zabbix/roles/zabbix/files/
yum.repo  zabbix.tar.gz
#files目录存放着需要复制到目标节点的静态文件,这里包含仓库文件yum.repo和zabbix的软件包及其依赖包的压缩包,它们将在执行任务时被直接复制到node节点上
#handlers目录存放着处理器(handlers)任务,处理器会在特定条件下触发,通常用于重启服务或执行其他操作,这道题还用不到它
#meta目录包含角色的元数据,如依赖关系和其他角色相关信息,同样用不到
#tasks目录包含角色的主要任务列表,定义了角色需要执行的各种操作和配置步骤
#templates目录存放着Jinja2模板文件,这些模板可以在运行时渲染成目标节点上的配置文件,使得配置文件可以根据变量或条件动态生成
#vars目录包含角色范围内的变量,这些变量可以被任务和模板引用,用于参数化配置和操作,这里是被group_vars目录里的all文件替代了,我们也用不到

配置YUM源

#删除系统自带源
[root@ansible ~]# rm -rf /etc/yum.repos.d/*
#创建新的仓库文件
[root@ansible ~]# vi /etc/yum.repos.d/local.repo
[ansible]
name=ansible
baseurl=file:///opt/ansible
gpgcheck=0
enabled=1
#检查可用性
[root@ansible ~]# yum clean all && yum repolist
源标识                                源名称                                状态
ansible                               ansible                               22
repolist: 22
#安装ansible
[root@ansible ~]# yum -y install ansible

配置主机映射

#编辑系统的主机映射文件
[root@ansible ~]# cat >> /etc/hosts << EOF
> 192.168.100.21 ansible
> 192.168.100.22 node
> EOF
#编辑ansible的主机清单文件,可以说是ansible的主机映射文件
#我们定义一个zabbix的主机组,把node节点的ip写上
[root@ansible ~]# cat >> /etc/ansible/hosts << EOF
> [zabbix]
> 192.168.100.22
> EOF

配置免密登录

#执行ansible剧本的时候需要远程连接主机,所以我们配置ssh免密登录
[root@ansible ~]# ssh-keygen 
...
Enter file in which to save the key (/root/.ssh/id_rsa):#回车
...
Enter passphrase (empty for no passphrase):#回车
...
Enter same passphrase again:#回车
...
#将公钥复制给node节点
[root@ansible ~]# ssh-copy-id root@node
...
Are you sure you want to continue connecting (yes/no)? yes
...
root@node's password: #输入node节点密码

配置node节点

#我们做一下node节点的环境准备
#挂载好node节点的系统源
#先创建给挂载目录
[root@node ~]# mkdir /opt/centos
#挂载系统镜像
[root@node ~]# mount -o loop /dev/sr0 /opt/centos
#如果你是使用CentOS-7-x86_64-DVD-2009.iso镜像,在7.9的系统进行本实验的话,你还需要删掉系统自带的mariadb-libs,因为它的版本太高了:yum -y remove mariadb-libs

完善脚本

这道题简单的一部分原因就是我们不用从头写剧本,提供给我们的软件包已经写好了大部分,我们只需要补充关键部分即可。

#我们回到ansible节点,把ansible的文件完善一下
[root@ansible ~]# cd install_zabbix
[root@ansible install_zabbix]# 
#all文件是全局变量文件,可以通过设置值,写剧本的时候用变量替代,这里写个数据库密码的变量就行了,数据库主机名的变量没必要,就模板文件有一处用到,我们直接删掉。
[root@ansible install_zabbix]# vi group_vars/all 
DB_PASS: zabbix
#变量和值直接有空格,看清楚了
#yum.repo文件是后面我们要传给node节点的仓库文件
[root@ansible install_zabbix]# vi roles/zabbix/files/yum.repo 
[zabbix]
name=zabbix
baseurl=
gpgcheck=0
enabled=1
#我们把它补充好:
[root@ansible install_zabbix]# vi roles/zabbix/files/yum.repo 
[zabbix]
name=zabbix
baseurl=file:///root/zabbix
gpgcheck=0
enabled=1
[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1
#main文件是我们安装zabbix的任务列表
[root@ansible install_zabbix]# vi roles/zabbix/tasks/main.yaml 
---###- name: selinux configshell: "{{item}}"with_items:- sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config- name: Selinux Config Setenforceshell: getenforceregister: info#执行getenforce命令查看Selinux的执行模式,并把值赋给info- name: when_Selinuxshell: setenforce 0when: info['stdout'] == 'Enforcing'#当info的值为Enforcing时,执行setenforce 0命令临时关闭selinux- name: firewalldshell: systemctl stop firewalld && systemctl disable firewalldignore_errors: yes###这段是关闭防火墙和Selinux的操作,不需要我们补齐#通过name的描述我们可知这里是移动系统默认源的操作,需要我们补齐- name: mv yum configshell: mv     #这里是复制仓库文件的地方,需要我们补齐命令,把补充完整的yum.repo移过来- name: copy repo copy: #这里则是移动zabbix软件源压缩包的地方,需要我们补齐命令,把zabbix.tar.gz移过来- name: Copy Repo Tarcopy: #这里是解压zabbix.tar.gz的地方,需要我们补齐- name: Decompression Packageshell: #这里是安装http服务并启动的地方,需要我们补齐- name: Yum Install httpdyum: name:- httpd state: - name: Start Servicesystemd:name: httpdstate: restartedenabled: yes###- name: Install Mariadbyum: name: - mariadb-server- mariadb  state: present- name: Start Servicesystemd:name: mariadbstate: restartedenabled: yes###这一段都不需要补齐,是安装数据库并启动的操作###- name: Config Mariadb Usershell: mysqladmin -uroot password {{ DB_PASS }}ignore_errors: yes- name: Mariadb Create zabbixshell: mysql -uroot -p{{ DB_PASS }} -e ""ignore_errors: yes- name: privileages mariadbshell: "{{ item }}"with_items:- mysql -uroot -p{{ DB_PASS }} -e ""- mysql -uroot -p{{ DB_PASS }} -e ""###这段是配置数据库的地方,需要我们补齐命令###"{{ item }}"是Jinja2的模板语法,可以依次操作with_items写的的命令,而不用写两段任务。#这里是安装zabbix服务的地方,需要我们补齐需要安装的组件- name: Install zabbixyum: name:- - - - state: present#这里是导入数据库文件的地方,无需补齐   - name: sql config mariadbshell: chdir=/usr/share/doc/zabbix-server-mysql-3.4.15/ zcat create.sql.gz |mysql -uroot -p{{ DB_PASS }} zabbixignore_errors: yes#这里是设置时区的地方,无需补齐- name: Php Timezoneshell: "{{item}}"with_items:- sed -i "s/^;date.timezone.*/;date.timezone=RPC/g" /etc/php.ini- sed -i "s/#\ php_value/php_value/g" /etc/httpd/conf.d/zabbix.conf- sed -i "s/date.timezone.*/date.timezone Asia\/Shanghai/g" /etc/httpd/conf.d/zabbix.conf#这里是将模板文件复制到node节点,成为其zabbix配置文件的地方,需要我们补齐目标路径- name: Config zabbix_server.conftemplate: src=zabbix_server.conf.j2 dest=#这里是重启http和zabbix服务的地方,无需我们补齐- name: Restart Httpd And zabbix-serversystemd:name: "{{item}}"state: restartedenabled: yeswith_items:- httpd- zabbix-server
#将其补齐后的内容如下:
---- name: selinux configshell: "{{item}}"with_items:- sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config- name: Selinux Config Setenforceshell: getenforceregister: info- name: when_Selinuxshell: setenforce 0when: info['stdout'] == 'Enforcing'- name: firewalldshell: systemctl stop firewalld && systemctl disable firewalldignore_errors: yes- name: mv yum configshell: mv /etc/yum.repos.d/* /media/- name: copy repo copy: src=yum.repo dest=/etc/yum.repos.d/- name: Copy Repo Tarcopy: src=zabbix.tar.gz dest=/root/- name: Decompression Packageshell: tar -zxf /root/zabbix.tar.gz- name: Yum Install httpdyum: name:- httpd state: present- name: Start Servicesystemd:name: httpdstate: restartedenabled: yes- name: Install Mariadbyum: name: - mariadb-server- mariadb  state: present- name: Start Servicesystemd:name: mariadbstate: restartedenabled: yes- name: Config Mariadb Usershell: mysqladmin -uroot password {{ DB_PASS }}ignore_errors: yes- name: Mariadb Create zabbixshell: mysql -uroot -p{{ DB_PASS }} -e "create database zabbix character set utf8 collate utf8_bin;"ignore_errors: yes- name: privileages mariadbshell: "{{ item }}"with_items:- mysql -uroot -p{{ DB_PASS }} -e "grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix';"- mysql -uroot -p{{ DB_PASS }} -e "grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';"- name: Install zabbixyum: name:- zabbix-server-mysql- zabbix-web-mysql- zabbix-agentstate: present- name: sql config mariadbshell: chdir=/usr/share/doc/zabbix-server-mysql-3.4.15/ zcat create.sql.gz |mysql -uroot -p{{ DB_PASS }} zabbixignore_errors: yes- name: Php Timezoneshell: "{{item}}"with_items:- sed -i "s/^;date.timezone.*/;date.timezone=RPC/g" /etc/php.ini- sed -i "s/#\ php_value/php_value/g" /etc/httpd/conf.d/zabbix.conf- sed -i "s/date.timezone.*/date.timezone Asia\/Shanghai/g" /etc/httpd/conf.d/zabbix.conf- name: Config zabbix_server.conftemplate: src=zabbix_server.conf.j2 dest=/etc/zabbix/zabbix_server.conf- name: Restart Httpd And zabbix-serversystemd:name: "{{item}}"state: restartedenabled: yeswith_items:- httpd- zabbix-server#如果你了解zabbix的搭建流程,且看过我之前搭建zabbix的文章,你就会发现补充的部分,与我那篇文章的命令是一模一样的
#zabbix_server.conf.j2模板文件是我们复制给node节点当zabbix的配置文件的
#我们编辑一下先,只需要添加101行DBHost的值即可
#添加前:
[root@ansible install_zabbix]# sed -n '100,104p' roles/zabbix/templates/zabbix_server.conf.j2
DBName=zabbix
DBHost=
DBPassword=zabbix
DBSocket=/tmp/mysql.sock
#添加后:
[root@ansible install_zabbix]# sed -n '100,104p' roles/zabbix/templates/zabbix_server.conf.j2
DBName=zabbix
DBHost=localhost
DBPassword=zabbix
DBSocket=/tmp/mysql.sock

执行剧本

#首先带你们看一下剧本的内容
[root@ansible install_zabbix]# vi install_zabbix.yaml
#YAML文件的开始标记
---
#这里指定了执行这个剧本的主机组,我们前面在/etc/ansible/hosts文件里定义了zabbix主机组,里面包含了node节点
- hosts: zabbix
#这里则是指定了执行任务时使用的用户名,执行任务时会用root用户连接对方主机remote_user: root
#制定了要应用的角色列表,这个实验我们有且只有一个zabbix角色,ansible会找到zabbix角色下的task目录,执行里面的main.yaml任务roles:- zabbix#在执行剧本前,我们使用--syntax-check检查一下剧本有没有语法错误
[root@ansible install_zabbix]# ansible-playbook install_zabbix.yaml --syntax-check
#如果显示这样就说明语法没有问题,有语法错误的话会给你指出具体错误的地方
playbook: install_zabbix.yaml
#OK,一切准备就绪,我们执行剧本
[root@ansible install_zabbix]# ansible-playbook install_zabbix.yaml
...
#执行最后会给我们一个总结报告,总共执行了20个任务,19个导致了实际更改,有1个被跳过
#(临时关闭selinux那里,因为我提前关了,不满足when的条件,于是跳过了)
#其他的,unreachable是主机不可达的数量。
#failed是任务失败的数量。
#rescued是被救回的任务数量,这个需要在任务中使用rescue块,如果使用了,
#在原先任务执行到一半失败了就会执行rescue块的内容,进行恢复操作,避免剧本执行中断。
#我们这个实验没有使用,自然就没有救回的了。
#ignored是被忽略的任务数量,我们在任务后面多处添加了ignore_errors: yes
#如果那个任务执行失败,也会继续执行剧本,相应的这个数字也会增加。
PLAY RECAP *****************************************************************************************
192.168.100.22             : ok=20   changed=19   unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

验证实验结果

我们打开浏览器,在地址栏输入node节点ip/zabbix,如果跳转到了zabbix的安装界面,则说明我们剧本执行成功,没有任何问题了

在这里插入图片描述

后语

关于zabbix的一些基础使用,设置中文界面和监控主机啥的,我也在这篇文章也有提及,感兴趣的可以看一下:1+X云计算运维与开发(中级)实战案例——Zabbix分布式监控系统搭建_实战案例——zabbix 分布式监控系统-CSDN博客

ansible搭建应用考察的题目还有部署ELK、Kafka、ZooKeeper、FTP还有Mariadb的,其实只要了解了ansible,这些都不难,后续可能会再讲个ELK的。

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

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

相关文章

OAuth 2.0资源授权机制与安全风险分析

文章目录 前言OAuth2.01.1 OAuth应用1.2 OAuth基础1.3 授权码模式1.4 其它类模式1.5 openid连接 安全风险2.1 隐式授权劫持2.2 CSRF攻击风险2.3 Url重定向漏洞2.4 scope校验缺陷 总结 前言 OAuth 全称为Open Authorization&#xff08;开放授权&#xff09;&#xff0c;OAuth …

内网穿透与异地组网强强联合,这款工具屌爆了!!!

在数字化飞速发展的今天&#xff0c;远程访问的需求日益增长&#xff0c;网络已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;远程网络连接的稳定性和安全性往往是我们关注的焦点。节点小宝作为一款创新型的远程管理工具&#xff0c;凭借其使用简单&#xff0c;高速…

【计算机网络篇】数据链路层(13)共享式以太网与交换式以太网的对比

文章目录 &#x1f354;共享式以太网与交换式以太网的对比&#x1f50e;主机发送单播帧的情况&#x1f50e;主机发送广播帧的情况&#x1f50e;多对主机同时通信 &#x1f6f8;使用集线器和交换机扩展共享式以太网的区别 &#x1f354;共享式以太网与交换式以太网的对比 下图是…

【数据分享】《中国保险年鉴》1981-2022

而今天要免费分享的数据就是1981-2022 年间出版的《中国保险年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 《中国保险年鉴》自1981年首版发行以来&#xff0c;已连续出版了四十余年&#xff0c;见证了中国保险业从萌芽到繁荣的全…

怎么隐藏宝塔面板左上角绑定的手机号码?

宝塔面板后台的左上角会显示我们绑定的宝塔账号&#xff08;手机号码&#xff09;&#xff0c;每次截图的时候都要去抹掉这个号码&#xff0c;那么能不能直接将这个手机号码隐藏掉呢&#xff1f; 如上图红色箭头所示的手机号码&#xff0c;其实就是我们绑定的宝塔账号&#xff…

NavicatforMySQL11.0软件下载-NavicatMySQL11最新版下载附件详细安装步骤

我们必须承认Navicat for MySQL 支援 Unicode&#xff0c;以及本地或远程 MySQL 服务器多连线&#xff0c;使用者可浏览数据库、建立和删除数据库、编辑数据、建立或执行 SQL queries、管理使用者权限&#xff08;安全设定&#xff09;、将数据库备份/复原、汇入/汇出数据&…

API-其他事件

学习目标&#xff1a; 掌握其他事件 学习内容&#xff1a; 页面加载事件元素滚动事件页面尺寸事件 页面加载事件&#xff1a; 加载外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件。 为什么要学&#xff1f;&#xff1f; 有些时候需要等…

NodeJs 使用中间件实现日志生成功能

写在前面 今天我们实现一个记录 nodejs 服务请求日志的功能&#xff0c;大概的功能包括请求拦截&#xff0c;将请求的信息作为日志文件的内容写入到 txt 文件中&#xff0c;然后输出到指定的日志到当天日期目录中&#xff0c;从而实现后续查找用户请求信息的功能&#xff0c;下…

10分钟微调专属于自己的大模型_10分钟微调大模型

1.环境安装 # 设置pip全局镜像 (加速下载) pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ # 安装ms-swift pip install ms-swift[llm] -U# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试) pip install -r r…

《web应用技术》第十二次课后作业

1.servlet基础知识 1.定义 Java Servlet 是运行在 Web 服务器或应用服务器上的程序&#xff0c;它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。 2.生命周期 init 方法被设计成只调用一次。它在第一次创建 Servlet 时被…

如何高效使用 .http 文件记录和测试API接口

1. 前言 在现代软件开发中&#xff0c;API&#xff08;应用程序接口&#xff09;成为了系统间通信的重要桥梁。.http 文件作为一种轻量级的API请求描述方式&#xff0c;不仅便于开发者记录和分享API接口信息&#xff0c;还能够帮助自动化测试流程。本文将深入介绍如何有效地使…

暑假追高必备:ChildLife全新钙镁锌小绿钙

2024年暑假将至&#xff0c;家长们对于孩子的健康关注再次提升&#xff0c;其中补钙成为许多家长关注的重点。暑假期间&#xff0c;孩子有更多时间进行户外活动&#xff0c;加上高温流汗多&#xff0c;身体的钙更容易流失&#xff0c;因此需要额外地补充。为此&#xff0c;美国…

数据恢复篇:如何恢复丢失的Android短信?

许多用户发现自己处于重要短信意外从Android手机中删除的情况。幸运的是&#xff0c;有一些行之有效的方法可以在没有root的情况下恢复已删除的短信Android&#xff0c;这可以成为救命稻草。这些技术不需要深厚的技术知识&#xff0c;也不需要损害设备的安全性。为了帮助您摆脱…

iOS项目开发遇到问题杂项坑点记录

ios17 弹窗UIAlertController展示逻辑变化&#xff0c;单个词一行展示不下不换行&#xff08;这前版本会换行&#xff09;&#xff0c;直接截断超出部分。 UINavigationController push立刻pop会异常&#xff0c;使用用setViewCollerllers可以避免这个问题 键盘切换后立刻切页…

通过搭建 24 点小游戏应用实战,带你了解 AppBuilder 的技术原理

本文将通过一个 24 点小游戏的案例&#xff0c;详细介绍百度智能云千帆 AppBuilder 的基本技术原理和使用方法&#xff0c;帮助读者快速掌握 AI 原生应用的开发流程。 1 三步构建 AI 原生应用方法论 AI 原生应用与传统应用的最大区别是交互形态彻底的拟人化&#xff0c;通过文…

Java日志 - JUL

一、JUL学习总结 &#xff08;1&#xff09;总结 JDK自带的日志系统中已经为我们创建了一个顶层的RootLogger&#xff0c;可以针对这个顶层的RootLogger设置多个Handler&#xff08;如ConsoleHandler, FileHandler等&#xff09;&#xff0c;如果想在控制台输出debug级别以上的…

还不到6个月,GPTs黄了

相比起来&#xff0c;人们还不如使用一个足够强大、灵活且通用的AI助手来满足各类复杂需求。更严重的是一些独立GPTs显露出的安全隐患。除此之外&#xff0c;最大的问题在于OpenAI模糊不清的货币化政策。 文章正文 上周&#xff0c;不少人发现微软官网忽然更新了一条“GPT Bu…

AI论文降重:一键操作,让你的论文查重率瞬间下降

高查重率是许多毕业生的困扰。通常&#xff0c;高查重率源于过度引用未经修改的参考资料和格式错误。传统的降重方法&#xff0c;如修改文本和增添原创内容&#xff0c;虽必要但耗时且成效不一。 鉴于此&#xff0c;应用AI工具进行AIGC降重成为了一个高效的解决方案。这些工具…

聊聊 golang 中 channel

1、引言 Do not communicate by sharing memory; instead, share memory by communicating Golang 的并发哲学是“不要通过共享内存进行通信&#xff0c;而要通过通信来共享内存”&#xff0c;提倡通过 channel 进行 goroutine 之间的数据传递和同步&#xff0c;而不是通过共享…

Embedding是什么?为什么重要?

本文为 Simon Willison 在 PyBay 上发表的演讲视频的文字改进版 原文链接&#xff1a; https://simonwillison.net/2023/Oct/23/embeddings/ 演讲视频链接&#xff1a; https://youtu.be/ArnMdc-ICCM Embedding 是一个非常巧妙的技术&#xff0c;但常常和一堆令人生畏的术…