cloudstack简介

CloudStack是一个开源的具有高可用性及扩展性的云计算平台。目前Cloudstack支持管理大部分主流的hypervisors,如KVM,XenServer,VMware,Oracle VM,Xen等。同时CloudStack是一个开源云计算解决方案。可以加速高伸缩性的公共和私有云(IaaS)的部署、管理、配置。使用CloudStack作为基础,数据中心操作者可以快速方便的通过现存基础架构创建云服务。

cloudstack概念架构

  • 用户:通过网络访问属于“我”的虚拟机、存储空间、管理“我”的个人模板。
  • 管理员:部署配置,管理账户,监控资源,安排作业,排除故障。
  • 开发人员:开发计费、监控、统计报表等功能模块,定制图形界面、工作流。

cloudstack部署架构

上图中的各个组件介绍如下:

  • Regions:为了提高云的可靠性,可以选择将资源分为多个地理区域。区域是CloudStack部署中最大的可用组织单位。一个区域由几个可用性zones组成,其中每个zone大致相当于一个数据中心。每个Regions均由其在一个zone中运行的管理服务器集群控制。regions中的zones通常相隔非常近。Regions 是用于提供容错和灾难恢复的有用技术。

  • Zone:Zone 对应于现实中的一个数据中心。

  • Pod:Pod 对应着一个机架。同一个 pod 中的机器在同一个子网(网段)中。

  • Cluster:Cluster 是多个主机组成的一个集群。同一个 cluster 中的主机有相同的硬件,相同的 Hypervisor,和共用同样的存储。同一个 cluster 中的虚拟机,可以实现无中断服务地从一个主机迁移到另外一个上。

  • Host:Host 就是运行虚拟机(VM)的主机。

  • CloudStack存储按用途分为主存储(Primary Storage)二级存储(Secondary Storage),主存储用来存储虚拟机的卷,二级存储用来存放虚拟机的模板,ISO镜像和快照
  • Primary storage:一级存储与 cluster 关联,它为该 cluster 中的主机的全部虚拟机提供磁盘卷。一个 cluster 至少有一个一级存储,且在部署时位置要临近主机以提供高性能。

  • Secondary storage:二级存储与 zone 关联,它存储模板文件,ISO 镜像和磁盘卷快照。

    • 模板:可以启动虚拟机的操作系统镜像,也包括了诸如已安装应用的其余配置信息。
    • ISO 镜像:包含操作系统数据或启动媒质的磁盘镜像。
    • 磁盘卷快照:虚拟机数据的已储存副本,能用于数据恢复或者创建新模板。

即从包含关系上来说,一个regions包含多个zone,一个 zone 包含多个 pod,一个 pod 包含多个 cluster,一个 cluster 包含多个 host。

cloudstack和kvm一起部署的架构

如上所述:在每个kvm的宿主机上都需要部署agent程序。

如果部署vmware的产品就必须部署vcenter server。

cloudstack部署实践

关于这部分内容,请阅读官方文档

主要是介绍cloudstack支持的存储协议、架构模式、机器配置等建议。

cloudstack和openstack比较

难易度 适合规模 参考资料 是否开源 市场占有率
cloudstack 组件少,较易 小、中、大 较少
openstack 组件多,较难 中、大 较多

部署cloudstack

环境准备

OS 主机名 IP rules services explain
cenots 7.7 management 10.10.10.5 管理节点 chronyd、cloudstack-management、mariadb、nginx 用于管理整个cloudstack,最少2c4g
cenots 7.7 kvm1 10.10.10.22 计算节点 kvm 用于运行租户创建的虚拟机,建议4c4g
cenots 7.7 nfs 10.10.10.5 存储节点 nfs 提供主存储、二级存储,最少2g1c,一块100G磁盘

系统初始化

系统初始化这一小节,如果没有特别说明,均需在所有节点执行。

修改主机名


  1. $ hostnamectl set-hostname management
  2. $ hostnamectl set-hostname kvm1
  3. $ hostnamectl set-hostname nfs
  4. source /etc/profile

关闭防火墙及selinux

在生产环境中,建议防火墙放行内网网段即可。selinux设置为permissive模式。(视频资料中说selinux设置为disable会有问题,具体待验证。)


  1. $ systemctl stop firewalld && systemctl disable firewalld
  2. setenforce 0
  3. sed -i 's#^SELINUX=.*#SELINUX=permissive#g' /etc/selinux/config
  4. sed -i 's#^SELINUX=.*#SELINUX=permissive#g' /etc/sysconfig/selinux

配置yum源

这一步主要是将默认的国外yum源配置为国内阿里的yum,如果你有自己内网的yum源服务器,请跳过此步骤。

  1. # 更换为阿里云源
  2. wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  3. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  4. cat > /etc/yum.repos.d/cloudstack.repo << 'EOF'
  5. [cloudstack]
  6. name=cloudstack
  7. baseurl=http://download.cloudstack.org/centos/$releasever/4.15/
  8. enabled=1
  9. gpgcheck=0
  10. EOF

配置nfs服务

(此步骤在nfs节点执行)

  1. yum -y install nfs-utils
  2. cat >> /etc/exports << EOF
  3. /export/secondary *(rw,async,no_root_squash,no_subtree_check)
  4. /export/primary *(rw,async,no_root_squash,no_subtree_check)
  5. EOF
  6. # 创建共享目录
  7. mkdir /export/{primary,secondary}
  8. # 启动nfs
  9. systemctl enable rpcbind nfs
  10. systemctl start rpcbind nfs
  11. 其他任意节点确保可查看到共享目录:
  12. showmount -e 10.10.10.5

安装cloudstack-management

yum install -y cloudstack-management cloudstack-common

导入数据库(此处使用已有的mysql作为存储)

  1. # 可通过 cloudstack-setup-databases --help 查看其他命令选项及其含义
  2. $ cloudstack-setup-databases cloud:epai706@localhost:3306 --deploy-as=root:epai706
  3. # cloud:epai706:表示执行成功后,mysql数据库将创建一个密码为epai706的cloud用户供管理节点使用。
  4. # --deploy-as:指定你本次使用哪个数据库用户导入数据

输出如下信息,表示数据库初始化成功:

启动manager server

  1. # 第一次启动请这样启动
  2. $ cloudstack-setup-management
  3. # 执行后将输出如下信息,则表示启动成功:
  4. Starting to configure CloudStack Management Server:
  5. Configure Firewall ... [OK]
  6. Configure CloudStack Management Server ...[OK]
  7. CloudStack Management Server setup is Done!
  8. # 后续启动方式请使用
  9. $ systemctl restart cloudstack-management

访问dashboard

访问management的8080端口,可以看到如下界面,则表示management安装成功(默认用户名/密码:admin/password):

上传系统虚机镜像

cloudstack默认依赖几个虚机运行,当cloudstack添加区域后,他将自动启动相关虚机,所以还需要将镜像导入到二级存储中。

下载虚拟机系统模板,放到二级存储目录上

  1. #官方下载地址http://cloudstack.apt-get.eu/systemvm/4.15/
  2. wget http://cloudstack.apt-get.eu/systemvm/4.15/systemvmtemplate-4.15.0-kvm.qcow2.bz2
  3. wget http://cloudstack.apt-get.eu/systemvm/4.15/systemvmtemplate-4.15.0-vmware.ova
  4. wget http://cloudstack.apt-get.eu/systemvm/4.15/systemvmtemplate-4.15.0-ovm.raw.bz2
  5. wget http://cloudstack.apt-get.eu/systemvm/4.15/systemvmtemplate-4.15.0-xen.vhd.bz2
  6. wget http://cloudstack.apt-get.eu/systemvm/4.15/systemvmtemplate-4.15.0-hyperv.vhd.zip
  1. #kvm
  2. /usr/share/cloudstack-common/scripts/storage/secondary/cloud-install-sys-tmplt \
  3. -m /export/secondary -f /root/systemvmtemplate-4.15.0-kvm.qcow2.bz2 -h kvm -F
  4. #vmware
  5. /usr/share/cloudstack-common/scripts/storage/secondary/cloud-install-sys-tmplt \
  6. -m /export/secondary -f /root/systemvmtemplate-4.15.0-vmware.ova -h vmware -F

输出如下,则表示上传成功:

配置计算节点

注:此步骤只需在计算节点上执行。

修改网络配置

主要是生成一个网桥设备,以便VM都可以连接到此网桥。

  1. # 备份源网卡配置文件
  2. $ cp /etc/sysconfig/network-scripts/ifcfg-ens33{,_$(date +%F_%H).bak}
  3. # 修改网卡配置文件
  4. cat > /etc/sysconfig/network-scripts/ifcfg-ens33 << EOF
  5. TYPE=Ethernet
  6. DEVICE=ens33
  7. ONBOOT=yes
  8. BRIDGE=cloudbr0
  9. EOF
  10. cat > /etc/sysconfig/network-scripts/ifcfg-cloudbr0 << EOF
  11. DEVICE=cloudbr0
  12. TYPE=Bridge
  13. ONBOOT=yes
  14. BOOTPROTO=static
  15. IPADDR=10.10.10.22
  16. GATEWAY=10.10.10.1
  17. DNS1=223.5.5.5
  18. EOF
  19. # 修改完成后,务必检查是否修改正确,网卡名称、IP地址与你的实际环境是否一致
  20. # 确认无误后,重启网络服务
  21. $ systemctl restart network
安装cloudstack-agent
  1. yum -y install cloudstack-agent cloudstack-common
确认加载kvm模块
  1. $ lsmod | grep kvm # 输出如下,则表示已加载
  2. [root@WT-TEST-10-22 ~]# lsmod | grep kvm
  3. kvm_intel 188688 15
  4. kvm 636969 1 kvm_intel
  5. irqbypass 13503 21 kvm
  6. [root@WT-TEST-10-22 ~]#
安装ibvirt

yum -y install qemu-kvm libvirt python-virtinst bridge-utils

修改libvirt默认配置

  1. 修改vnc默认监听地址
  2. sed -i 's/^#vnc_listen =.*/vnc_listen = "0.0.0.0"/g' /etc/libvirt/qemu.conf
  3. # 指定cloudstack-management地址
  4. sed -i "s/host=.*/host=10.10.10.5/g" /etc/cloudstack/agent/agent.properties
  5. # 重启libvirt
  6. systemctl restart libvirtd
启动cloudstack-agent并加入开机自启

$ systemctl start cloudstack-agent && systemctl enable cloudstack-agent

规划cloustack网络

在cloudstack中,提供了两种网络:基本网络和高级网络。这篇博文将基于基本网络进行配置,如果要配置高级网络,那么这篇博文不用继续往下看了,移步即可。

基本网络

基本网络模式采用传统扁平网络,与现有网络完美兼容,其网络通信拓扑如下:

基础网络模式只提供了简单的网络模型,管理网络、来宾网络、存储网络、V-Route(只提供了DNS、dhcp,并不提供网关服务)等。

高级网络

高级网络模式中,每个租户获得一个或多个来宾网络,每个网络属于独立的VLAN,由虚拟路由器为这些来宾网络提供网关服务。

虚拟路由器(系统虚拟机提供)在高级网络中十分重要,它将成为租户私有网络与公共网络之间的接口,并未租户私有网络提供各种网络服务,包括NAT、静态NAT、DHCP、DNS、Load Balancing、Port Forwording、Firewalls、Site-to-Site 虚拟专用网、VPC等。

高级网络架构图如下:

两种不同的网络,对来宾网络(Guest Network)采用的隔离方式不同,在基本模式下,采用安全组(Security Group)方式进行隔离;而在高级网络中,采用VLAN方式进行隔离。

具体网络规划(内网实验用)

角色 网络
management+nfs 10.10.10.5
kvm1 10.10.10.22
虚拟机(来宾网络) 10.10.10.150-10.10.10.160
创建zone

登录到cloudstack-management的管理控制台,进行如下操作,以便添加第一个zone:

1、网络选择基本的:



2、资源域详细信息:

网络方案介绍:

  • DefaultSharedNetworkOfferingWithSGService:带有安全组的网络方案,推荐选择此选项。

  • DefaultSharedNetworkOffering:不带安全组功能。

  • DefaultSharedNetscalerEIPandELBNetworkOffering:如果你在CLOUDSTACK内安装了Citrix NetScaler应用,并且你需要Elastic IP和Elastic Load Balancing这些功能的话,那就选择这个选项。EIP 和ELB技术在安全组启用的情况下,可以提供1:1的NAT映射和负载均衡功能。此功能需要citrix硬件支持,一般很少用。

  • QuickCloudNoServices:表示什么都不用,新增选项,不建议使用。

3、网络

4、添加提供点

5、设置来宾网络

6、设置群集名称

7、添加kvm主机节点

8、配置主存储

9、配置二级存储

11、启用资源域

激动人心的时刻到了,这一步,将检验你之前所有的操作是否正确。

验证cloudstack可用性

至此,你必须保证下面的任意资源都为“UP” 状态,如下:

1、资源域状态为“Enabled”

2、提供点状态状态为“Enabled”

3、群集状态“Enabled”

4、主机状态必须为 “Up”

5、主存储状态必须为 “Up”

6、二级存储状态必须为 “Up”

7、系统VM必须正常状态必须为 “Up”

至此,可以说你的集群完全可用了,但虚拟路由器现在数量为 “0”,当我们创建第一个实例后,虚拟路由器就被创建了。

注册ISO

现在,我们就来启动一个实例进行验证。需要自行准备一张系统盘。最好是centos的。附:centos镜像下载链接

注册ISO镜像支持两种方式,一种是从本地上传,一种是从一个URL主机,为了速度考虑,建议自行准备http服务器,然后配置为文件服务器,进行注册ISO(本地上传功能不靠谱)。

1、安装nginx

任意节点安装即可,既然博文开头规划在了management节点,那就在这个节点吧。

  1. server {
  2. listen 80;
  3. server_name 10.10.10.5;
  4. location / {
  5. root /data;
  6. autoindex on;
  7. autoindex_exact_size off;
  8. autoindex_localtime on;
  9. }
  10. }
  11. #可以看到在正常下载即可:
  12. wget http://10.10.10.5/CentOS-7-x86_64-DVD-2009.iso

2、定义允许哪些网络可以访问二级存储(不配置iso安装的时候会拒绝

3、重启cloudstack-management生效

systemctl restart cloudstack-management

重启后,需要稍等片刻,待8080端口在监听,才可以继续访问控制台:

4、注册ISO

访问控制台,进行如下操作:

查看镜像上传进度:

自行刷新页面,直至完成:

稍等片刻,看到镜像状态如下,则表示成功:

创建vm虚拟机

启动VM后,进入虚机控制台,则可以和正常一样装系统了

此处省略一万字...............

取消附加ISO

当装完系统后,重启VM,默认还会进入装系统的界面,我们需要进行如下操作,才可以正常使用虚机,如下(需在VM关机状态下执行):

安装centos系统后 ,没有IP地址

  • 配置网卡及初始化系统
  1. #必须要修改网络接口的配置文件,编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件
  2. DEVICE=eth0
  3. TYPE=Ethernet
  4. BOOTPROTO=dhcp
  5. ONBOOT=yes
  6. DNS1=223.5.5.5
  7. #----------系统初始化操作可以放在此处---------------------
  8. #移除udev持久设备规则
  9. rm -f /etc/udev/rules.d/70*
  10. rm -f /var/lib/dhclient/*
  11. #移除SSH Keys这步是为了确认所有要作为模板的VMs的SSH Keys都不相同,否则这样会降低虚拟机的安全性。
  12. rm -f /etc/ssh/*key*
  13. #清除日志文件,从主模板移除旧的日志文件是一个好习惯。
  14. cat /dev/null > /var/log/audit/audit.log 2>/dev/null1
  15. cat /dev/null > /var/log/wtmp 2>/dev/null
  16. logrotate -f /etc/logrotate.conf 2>/dev/null
  17. rm -f /var/log/*-* /var/log/*.gz 2>/dev/null
  18. #清除用户历史bash命令。
  19. history -c
  20. unset HISTFILE
  21. #关闭selinux和防火墙
  22. sed -i "s/SELINUX=enforcing/SELINUX=disable/g" /etc/selinux/config
  23. systemctl stop firewalld.service;systemctl disable firewalld.service
  • 关闭VM
  • 基于关闭vm的模板并且创建新模板

从当前实例进来,点击**卷**

基于卷创建模板

等待最终模板的状态是"Download Complete"

从此可以使用"tmp_centos7"模板创建虚拟机了

API操作

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # @Time : 2022/2/11 14:41
  4. # @Author : XuLiLiang
  5. # @File : cloudstack-api.py
  6. import base64
  7. import hashlib
  8. import hmac
  9. import json
  10. import requests
  11. from urllib import parse
  12. baseurl = 'http://10.10.10.5:8080/client/api?'
  13. api_key = 'g1Z0AutTl4Fbl3OeNX_rLJjaecOwMHkY3iUy6OiXlC6S3deP4s2NeLM2u8hGLqBHz509CHeC9eInPGvAqJ5KBg'
  14. secret_key = b'MiX6r_vBgO3c9ZUnadq8aOzHg18Y0FnHjP-NPLfCcS1wOsLYcoJdVXEU4aUK6reHjsB7Z4sP4pQbV8yLLmzIyA'
  15. class CloudApi:
  16. def __init__(self):
  17. self.baseurl = baseurl
  18. self.api_key = api_key
  19. self.secret_key = secret_key
  20. def GetSing(self, command,**kwargs):
  21. request = {}
  22. request['command'] = command
  23. request['response'] = 'json'
  24. request['apikey'] = self.api_key
  25. for k,v in kwargs.items():
  26. request[k]=v
  27. request_str = '&'.join(['='.join([k, parse.quote_plus(request[k])]) for k in request.keys()])
  28. sig_str = '&'.join(['='.join([k.lower(), parse.quote_plus(request[k].lower().replace('+', '%20'))]) for k in
  29. sorted(request.keys())]).encode("utf-8")
  30. sig = hmac.new(self.secret_key, sig_str, hashlib.sha1).digest()
  31. sig = base64.encodebytes(hmac.new(self.secret_key, sig_str, hashlib.sha1).digest())
  32. sig = base64.encodebytes(hmac.new(self.secret_key, sig_str, hashlib.sha1).digest()).strip()
  33. sig = parse.quote_plus(base64.encodebytes(hmac.new(self.secret_key, sig_str, hashlib.sha1).digest()).strip())
  34. req = self.baseurl + request_str + '&signature=' + sig
  35. return req
  36. def listClusters(self):
  37. req=self.GetSing('listClusters')
  38. s = requests.get(req)
  39. print(json.loads(s.content.decode("utf-8"))['listclustersresponse']['cluster'])
  40. def listVirtualMachines(self):
  41. req = self.GetSing('listVirtualMachines')
  42. s = requests.get(req)
  43. print(json.loads(s.content.decode("utf-8"))['listvirtualmachinesresponse']['virtualmachine'])
  44. def listTemplates(self):
  45. req = self.GetSing('listTemplates',templatefilter='all',aaa='123123')
  46. s = requests.get(req)
  47. response=json.loads(s.content.decode("utf-8"))['listtemplatesresponse']['template']
  48. print(response)
  49. if __name__ == '__main__':
  50. api = CloudApi()
  51. api.listVirtualMachines()
  52. api.listClusters()
  53. api.listTemplates()

cloudstack-4.1.5版本最全入门笔记【2022】的更多相关文章

  1. sentinel (史上最全+入门教程)

    文章很长,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈 为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 < Java 高并发 三部曲 > 面试必备 + 大厂 ...

  2. MySQL入门笔记

    MySQL入门笔记 版本选择: 5.x.20 以上版本比较稳定 一.MySQL的三种安装方式: 安装MySQL的方式常见的有三种: ·          rpm包形式 ·          通用二进制 ...

  3. Linux 入门笔记

    一开始对linux总有些抵触,黑黑的命令框不知道如何下手,这次因为工作交接的缘故需要负责之前同事的Node后端部分,node,redis这些都是部署在Linux上的,看了几次运维的同学噼里啪啦的敲命令 ...

  4. 「Android 开发」入门笔记

    「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...

  5. redis入门笔记(1)

    redis入门笔记(1) 1. Redis 简介 •Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure serv ...

  6. MySQL入门笔记(一)

    一.数据类型 1. 整型 2. 浮点型 3. 字符型 4. 日期时间型 二.数据库操作 1. 创建库 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_nam ...

  7. kafka 入门笔记 #1

    kafka 入门笔记(#1) 单机测试 下载版本,解压 tar -xzf kafka_2.11-0.10.1.1.tgz cd kafka_2.11-0.10.1.1 启动服务 Kafka用到了Zoo ...

  8. Django入门笔记

    Django入门笔记 **文档包含Django安装包.学习的笔记.代码等 安装 Django参考附件,只需要把附件拷贝到你需要的目录就行.Django是1.8.16版本 Python:在附件中,其中有 ...

  9. MySQL入门笔记(二)

    MySQL的数据类型.数据库操作.针对单表的操作以及简单的记录操作可参考:MySQL入门笔记(一) 五.子查询   子查询可简单地理解为查询中的查询,即子查询外部必然还有一层查询,并且这里的查询并非仅 ...

随机推荐

  1. 简单查看windows蓝屏原因

    相信各位在使用windows(xp.7.8.1.10...)过程中都遇到过蓝屏的情况,而蓝屏时,系统会将其记录起来,并追踪到引起蓝屏的程序,以下内容将简单介绍一下如何查看引起windows蓝屏的原因: ...

  2. 基于机器学习和TFIDF的情感分类算法,详解自然语言处理

    摘要:这篇文章将详细讲解自然语言处理过程,基于机器学习和TFIDF的情感分类算法,并进行了各种分类算法(SVM.RF.LR.Boosting)对比 本文分享自华为云社区<[Python人工智能] ...

  3. Swoole 中使用 Atomic 实现进程间无锁计数器

    使用示例: $atomic = new Swoole\Atomic(); $serv = new Swoole\Server('127.0.0.1', '9501'); $serv->set([ ...

  4. 关于APP设计规范和一些图层命名

    首先,本人大学计算机专业出身,学过编程,工作的时候做过 产品经理,设计师,前端工程师,对工作的流程都有一些见解. 现在主攻前端工程师,做Web APP.今天收到设计师的设计稿,一看图层分类,这让我感觉 ...

  5. 兼容h5在ios上登录窗口input失焦后页面不会滚

    $("#logincode").blur(function(){ //滚动到顶部 window.scrollTo(0, 0); })一般多用于密码框失焦后,页面不回滚

  6. 使用.NET 6开发TodoList应用(27)——实现API的Swagger文档化

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在日常开发中,我们需要给前端提供文档化的API接口定义,甚至需要模拟架设一个fake服务用来调试接口字段.或者对于后端开发人员 ...

  7. 使用HTMLTestRunner在目标目录下并未生成HTML文件解决办法

    使用pycharm工具应用HTMLTestRunner模块时,测试用例可以顺利运行,但在目标目录下并未生成HTML文件.使用python的IDLE,能够正常运行并创建写入测试结果. 测试环境:pyth ...

  8. 【记录一个问题】铁威马NAS,升级系统后,所有安装的配置项都丢失了

    因为铁威马的系统功能真的是弱,所以写了一些家庭照片处理的系统. 上上周升级了系统后,丢失了以下内容: anaconda 2.及其conda下python3环境的各种库 3.nginx的转发配置 铁威马 ...

  9. 论文解读《The Emerging Field of Signal Processing on Graphs》

    感悟 看完图卷积一代.二代,深感图卷积的强大,刚开始接触图卷积的时候完全不懂为什么要使用拉普拉斯矩阵( $L=D-W$),主要是其背后的物理意义.通过借鉴前辈们的论文.博客.评论逐渐对图卷积有了一定的 ...

  10. (3)ESP32 Python 制作一个办公室温度计

    因为经常在办公室里面不知道实际室内温度是多少,所以用ESP32做了一个工具来进行温度&湿度的监测.在之前的文章当中,已经完成了ESP32的数据上云工作,如果要进行温度/湿度的检测.从原理上就是 ...