2025-2026学年广东省职业院校学生专业技能大赛云计算应用赛项题目
收集自网络等公开渠道，如有雷同纯属巧合。仅为个人学习使用，如有侵权请联系下架。【实操题】1.1.1 集群主机环境配置（0.5分）使用已提供创建两台云主机搭建OpenStack两节点集群，检测2台主机的网络互通情况，以确保网络正常通信与ssh连接，然后按以下要求配置服务器：（1）设置控制节点主机名为controller，设置计算节点主机名为compute；（2）修改hosts文件将IP地址映射为主机名；（3）使用提供的安装包文件，并分别修改好controller节点和compute节点的yum源文件“/etc/yum.repos.d/local.repo”。（4）配置controller节点可以无秘钥访问compute节点。完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.1.2 基础软件包安装（0.5分）在控制节点和计算节点上分别安装iaas-yoga软件包，根据表2配置两个节点脚本文件中的基本变量（配置脚本文件为/etc/1cloud/openrc.sh）。表2 云平台配置信息服务名称变量参数/密码Mysqlroot000000Keystone000000 Glance000000 Nova000000 Neutron000000 Heat000000 Zun000000 KeystoneDOMAIN_NAMEdemoAdmin000000 Rabbit000000 Glance000000 Nova000000 Neutron000000 Heat000000 Zun000000 NeutronMetadata000000External Networketh1（以实际为准） 完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.1.3 数据库及消息服务安装与使用（0.5分）在控制节点上使用安装Mariadb、RabbitMQ等服务。并进行相关操作。在controller节点上使用iaas-install-mariadb.sh 脚本安装Mariadb、Memcached、RabbitMQ等服务。安装服务完毕后，修改/etc/my.cnf文件，完成下列要求：1.设置数据库支持大小写；2.设置数据库缓存innodb表的索引，数据，插入数据时的缓冲为4G；3.设置数据库的log buffer为64MB；4.设置数据库的redo log大小为256MB；5.设置数据库的redo log文件组为2。6.设置数据库允许的最大通信包大小为64M。7.修改Memcached的相关配置，将内存占用大小设置为512MB，调整最大连接数参数为2048；8.调整Memcached的数据摘要算法（hash）为md5；完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.1.4 Keystone服务安装与使用（0.5分）在控制节点上安装Keystone服务并创建用户。在controller节点上使用iaas-install-keystone.sh脚本安装Keystone服务。Keystone服务安装完成后，在/etc/keystone/目录下编写admin-openrc.sh文件，此文件用于组件之间的认证。然后创建OpenStack域210Demo，其中包含Engineering与Production项目，在域210Demo中创建组Devops，其中需包含以下用户：1.Robert用户是Engineering项目的用户（member）与管理员（admin），email地址为：Robert@lab.example.com。2.George用户是Engineering项目的用户（member），email地址为：George@lab.example.com。3.William用户是Production项目的用户（member）与管理员（admin），email地址为：William@lab.example.com。4.John用户是Production项目的用户（member），email地址为：John@lab.example.com。完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.1.5 Glance安装与使用（0.5分）在控制节点上安装Glance 服务。上传镜像至平台，并设置镜像启动的要求参数。在controller节点上使用iaas-install-glance.sh脚本安装glance服务。然后将cirros-0.5.2-x86_64-disk.img镜像上传到OpenStack平台中，镜像名称为cirros-0.5.2。完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.1.6 Nova安装（0.5分）在控制节点和计算节点上分别安装Nova服务。安装完成后，完成Nova相关配置。在controller节点和compute节点上分别使用iaas-install-nova-controller.sh脚本、iaas-install-nova-compute.sh脚本安装Nova服务。在OpenStack中，修改相关配置文件，修改调度器规则采用缓存调度器，缓存主机信息，提升调度时间，修改完成后，不要重启nova服务。配置完成后提交controller点的用户名、密码和IP地址到答题框。【实操题】1.1.7 Neutron安装（0.5分）在控制和计算节点上正确安装Neutron服务。使用提供的脚本iaas-install-neutron-controller-openvswitch.sh和iaas-install-neutron-compute-openvswitch.sh，在controller和compute节点上安装neutron服务。完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.1.8 Dashboard安装（0.5分）在控制节点上安装Dashboard服务。安装完成后，将Dashboard中的 Django数据修改为存储在文件中。在controller节点上使用iaas-install-horizon.sh脚本安装Dashboard服务。安装完成后，修改相关配置文件，完成下列两个操作：1.将Dashboard中的Django数据修改为存储在文件中。2.将登陆页面的“云计算基础架构平台”修改为“私有云云计算基础架构平台”。完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.1.9 Swift安装（0.5分）在控制节点和计算节点上分别安装Swift服务。安装完成后，将cirros镜像进行分片存储。在控制节点和计算节点上分别使用iaas-install-swift-controller.sh和iaas-install-swift-storage.sh脚本安装Swift服务。安装完成后，使用命令创建一个名叫examcontainer的容器，将cirros-0.3.4-x86_64-disk.img镜像上传到examcontainer容器中，并设置分段存放，每一段大小为10M。完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.1.10 Cinder安装与创建硬盘（0.5分）在控制节点和计算节点分别安装Cinder服务，请在计算节点，对块存储进行扩容操作。在控制节点和计算节点分别使用iaas-install-cinder-controller.sh、iaas-install-cinder-storage.sh脚本安装Cinder服务，请在计算节点，对块存储进行扩容操作，即在计算节点再分出一个5G的分区，加入到cinder块存储的后端存储中去。完成后提交计算节点的用户名、密码和IP地址到答题框。【实操题】1.2.1 Cgroup运维（1分）在 OpenStack 云主机上，使用 cgroup 技术创建名为 cpu_limit 的组，将 yes命令的 CPU 使用率限制在最多 20% 单核。注意：cg系列命令可通过libcgroup软件包下载。完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.2.2 Glance调优（1分）在OpenStack云平台中，Glance的镜像缓存目录会因为缓存过多的镜像而占用大量的磁盘空间，请为Glance配置镜像缓存目录，并设置缓存最大容量为50GB，缓存超过12个小时未访问则会被自动清理掉。完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.2.3 Glance API调优（1分）在 OpenStack 云平台中，Glance 在上传大体量镜像时经常出现连接中断的问题，请对 Glance API 进行稳定性调优，设置 socket 超时时间为 180 秒，并启用 KeepAlive 机制，以确保大镜像能够稳定、完整地上传。完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.2.4 监控系统部署与应用（1分）在centos7.9系统的云主机，使用prometheus_monitor.zip软件包安装Prometheus和grafana服务，然后再申请一台centos7.9的云主机，安装node_exporter服务，并为Prometheus、grafana、node_exporter服务配置systemd，将Prometheus设置为Grafana的数据源，数据源名字为Prometheus，使用提供的可视化JSON文件，创建监控面板监控第二台云主机的性能数据，修改监控面板的“网络进带宽”和“网络出带宽”，使其可以正常监控到云主机的网络数据。Prometheus和grafana解压到/opt/monitor/目录下，名字更改为prometheus和grafana；node_exporter解压到/usr/local/目录下，名字更改为node_exporter。注意：配置systemd时，文件名格式必须为服务名+service，例如prometheus.service，不用大写，grafana的用户名和密码均设置为admin/admin。完成部署服务后，提交Prometheus节点的IP地址、用户名和密码到答题框。【实操题】1.2.5 OpenStack镜像压缩（1分）使用自行搭建的OpenStack平台。在HTTP服务中存在一个镜像为CentOS7.5-compress.qcow2的镜像，使用qemu相关命令，对该镜像进行压缩，压缩后的镜像命名为chinaskill-js-compress.qcow2并存放在/root目录下。完成后提交controller点的用户名、密码和IP地址到答题框。【实操题】1.2.6 Nova调优（1分）在OpenStack平台上创建虚拟机的时候，可以选择虚拟机的创建数量，如果一次过多的话会导致机器创建失败，这个时候可以通过修改nova的配置文件来限制虚拟机的并发创建数量,限制同时只能创建3台虚拟机。配置完成后提交改动节点的用户名、密码和IP地址到答题框。【实操题】1.2.7 ISCSI存储配置（1分）在自行搭建的OpenStack云平台上，控制节点为客户端，计算节点为服务端，自行预留磁盘存储，进行iscsi存储服务器的配置，要求如下：1.创建target，target名称为iqn.2024-11.com.chinaskills:compute；2.创建名为chinaskills.iscsi_store的存储设备；3.将存储设备绑定到后端存储；4.设置控制列表，只允许主机名controller的客户端可以进行访问；5.关闭账号密码验证访问；6.客户端可以连接到服务端共享的存储设备；完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.2.8 keystone调优（1分）在自行搭建的OpenStack云平台上，Keystone服务因频繁查询数据库导致认证延迟高，如令牌生成时间超过200ms，此时需要对keystone进行优化，请修改keystone相关配置文件，启用memcached缓存，减少数据库负载并提升认证响应速度。注意：在进行配置中涉及到填写IP处均以controller主机名代替。完成后提交控制节点的用户名、密码和IP地址到答题框。【实操题】1.2.9 Nova组件优化（1分）请修改OpenStack相关参数，缩短nova/neutron等组件调用系统命令的时间，优化系统命令的调用速度。在OpenStack中，非root用户想执行需要root权限相关的命令时，比如在启动虚拟机的过程中，会多次调用系统命令，调用命令时，会经过某命令进行封装，这个命令在每次允许过程中，都会加载命令白名单，最终再调用实际命令运行，这个过程会产生额外的耗时。这种情况可以通过修改nova相关配置文件，来进行减少耗时，节省调用时间。配置完成后提交改动节点的用户名、密码和IP地址到答题框。【实操题】1.2.10 使用Heat模板创建容器（1分）在自行搭建的OpenStack私有云平台上，在/root目录下编写Heat模板create_container.yaml，要求执行yaml文件可以创建名为heat-swift的容器。完成后提交控制节点的用户名、密码和IP地址到答题框。（说明：竞赛系统会远程执行create_container.yaml文件，提交前先清理heat中测试数据）【实操题】1.3.1 MariaDB 数据库操作开发（3分）使用提供的AIpython3.7.3.tar.gz软件包在controller节点安装开发环境，在/root目录下创建mysql_db_manager.py脚本，基于python的sqlalchemy库进行数据库的管理，实现对OpenStack内指定服务的MariaDB数据库管理功能，实现该数据库下表创建、删除、数据插入、更新等操作，OpenStack MariaDB数据库的账户root、密码000000保存不变：该表(table)用于描述OpenStack成员信息，表结构如下：表名称"member",该表有4个字段：id INTEGER 主键，自动递增；name VARCHAR(256);level INTEGER；place varchar(256);（1）mysql_db_manager内部实现DM_Manager类，类初始化方法def __init__(self, db_name)，参数db_name是OpenStack内部指定的某一服务数据库名称。（2）DM_Manager类实现create_table(self)方法。实现创建表功能，表指member表。（3）DM_Manager类实现insert_table_data(self,**kwargs)方法。实现表中表数据插入功能，参数kwargs参数为要插入数据记录信息，key与表字段名称一致。（4）DM_Manager类实现update_table_data(self,**kwargs)方法。实现表中数据记录更新功能，参数kwargs参数为要更新数据记录信息，key与表字段名称一致。（5）DM_Manager类实现run_table_raw_sql(self, raw_sql:str): 方法，无参数。实现表中直接执行sql语句功能，raw_sql参数为sql语句。（6）DM_Manager类实现delete_table(self)方法。实现删除表功能，表指member表。注意：运行代码命令格式为python37 xxxx.py。如果出现libssl.so.10库文件找不到的情况，可以参考文件服务器中的openssl_install.txt文件，来进行库文件的编译。完成后提交 controller节点的IP地址，用户名和密码提交。【实操题】1.3.2 OpenStack用户命令行管理工具开发（7分）使用已建好的OpenStack Python运维开发环境，在OpenStack Python3.7.3运维开发环境中，使用FastAPI框架和argparse库，服务端口为9046，在/root/onecloud目录下编写onecloud.py文件，基于OpenStack user资源封装命令行客户端，代码编写完成后，自行启动该服务。命令行参数说明要求：位置参数“stack”表示解析器，位置参数“user”表示操作类型，动作类型包括“list”“show”“create”“delete”；（1）“list”：查看所有的user；（2）“show”：查看user的详细信息；（3）“create”：表示创建用户，后续参数有“--name”、“--password”；“delete”：表示删除用户；（4）“delete”：删除指定的user；功能要求如下：（1）查询所有用户的信息；使用tabulate库将数据进行表格化处理，字段名为ID、Name，表格格式为圆角轮廓。（2）查询用户的详细信息，要求可以通过ID或者Name来查询用户的详细信息。使用tabulate库将数据进行表格化处理，字段名为Field、Value，表格格式为圆角轮廓。（3）创建用户，通过指定参数创建出一个在OpenStack平台中的user资源。（4）删除用户，要求可以通过用户的ID和名字来删除掉用户。注意：如果出现libssl.so.10库文件找不到的情况，可以参考文件服务器中的openssl_install.txt文件，来进行库文件的编译。命令格式为onecloud stack user <list/show/create/delete> <参数>完成后提交该云主机的用户名、密码和IP地址到答题框。【实操题】2.1.1 部署Kubernetes容器云平台（2分）使用已创建两台云主机，云主机类型使用4vCPU/12G/100G类型，分别作为Kubernetes集群的Master节点和node节点，然后完成Kubernetes集群部署。完成后提交Master节点的用户名、密码和IP到答题框。【实操题】2.1.2 部署Harbor镜像仓库（1分）在Kubernetes集群中完成Harbor镜像仓库部署。完成后提交Master节点的用户名、密码和IP到答题框。【实操题】2.1.3 部署Istio服务网格（1分）在Kubernetes集群中完成Istio服务网格组件部署。完成后提交Master节点的用户名、密码和IP到答题框。【实操题】2.1.4 部署kubeVirt 虚拟化组件（1分）在Kubernetes集群中完成kubeVirt虚拟化组件部署。完成后提交Master节点的用户名、密码和IP到答题框。【实操题】2.2.1 容器化部署Node-Exporter（0.5分）编写Dockerfile构建monitor-exporter:v1.0镜像，具体要求如下：（需要用到的软件包：Monitor.tar.gz）（1）基础镜像：centos:centos7.9.2009；（2）使用二进制包node_exporter-0.18.1.linux-amd64.tar.gz安装node-exporter服务；（3）声明端口：9100；（4）设置服务开机自启。完成后提交master节点的IP地址、用户名和密码到答题框。【实操题】2.2.2容器化部署Alertmanager（0.5分）编写Dockerfile构建monitor-alert:v1.0镜像，具体要求如下：（需要用到的软件包：Monitor.tar.gz）（1）基础镜像：centos:centos7.9.2009；（2）使用二进制包alertmanager-0.19.0.linux-amd64.tar.gz安装Alertmanager服务；（3）声明端口：9093、9094；（4）设置服务开机自启。完成后提交master节点的IP地址、用户名和密码到答题框。【实操题】2.2.3 容器化部署Grafana（0.5分）编写Dockerfile构建monitor-grafana:v1.0镜像，具体要求如下：（需要用到的软件包：Monitor.tar.gz）（1）基础镜像：centos:centos7.9.2009；（2）使用二进制包grafana-6.4.1.linux-amd64.tar.gz安装grafana服务；（3）声明端口：3000；（4）设置nacos服务开机自启。（5）Grafana用户名和密码设置为admin/admin。完成后提交master节点的IP地址、用户名和密码到答题框。【实操题】2.2.4 容器化部署Prometheus（0.5分）编写Dockerfile构建monitor-prometheus:v1.0镜像，具体要求如下：（需要用到的软件包：Monitor.tar.gz）（1）基础镜像：centos:centos7.9.2009；（2）使用二进制包prometheus-2.13.0.linux-amd64.tar.gz安装promethues服务；（3）编辑/data/prometheus/prometheus.yml文件，创建3个任务模板：prometheus、node和alertmanager，并将该文件拷贝到/data/prometheus/目录下；（4）声明端口：9090；（5）设置服务开机自启。完成后提交master节点的IP地址、用户名和密码到答题框。【实操题】2.2.5 编排部署监控系统（1分）编写docker-compose.yaml文件，使用镜像exporter、alert、grafana和prometheus完成监控系统的编排部署。编写docker-compose.yaml文件，具体要求如下：（1）容器1名称：monitor-node；镜像：monitor-exporter:v1.0；端口映射：9100:9100；（2）容器2名称：monitor- alertmanager；镜像：monitor-alert:v1.0；端口映射：9093:9093、9094:9094；（3）容器3名称：monitor-grafana；镜像：monitor-grafana:v1.0；端口映射：3000:3000；（4）容器4名称：monitor-prometheus；镜像：monitor-prometheus:v1.0；端口映射：9090:9090。完成后编排部署监控系统，将Prometheus设置为Grafana的数据源，并命名为Prometheus。grafana的密码设置为admin/admin。然后提交master节点的IP地址、用户名和密码到答题框。【实操题】2.2.6 部署GitLab（0.5分）将GitLab部署到Kubernetes集群中，设置GitLab服务root用户的密码，使用Service暴露服务，并将提供的项目包导入到GitLab中。在Kubernetes集群中新建命名空间gitlab-ci，将GitLab部署到该命名空间下，Deployment和Service名称均为gitlab，以NodePort方式将80端口对外暴露为30880，设置GitLab服务root用户的密码为admin@123，将项目包demo-2048.tar.gz导入到GitLab中并命名为demo-2048。完成后提交Master节点的用户名、密码和IP地址到答题框。（需要用到的软件包：CICD-Runners-demo2048.tar.gz）【实操题】2.2.7 部署GitLab Runner（1分）将GitLab Runner部署到Kubernetes集群中，为GitLab Runner创建持久化构建缓存目录以加速构建速度，并将其注册到GitLab中。将GitLab Runner部署到gitlab-ci命名空间下，Release名称为gitlab-runner，为GitLab Runner创建持久化构建缓存目录/home/gitlab-runner/ci-build-cache以加速构建速度，并将其注册到GitLab中。完成后提交Master节点的用户名、密码和IP地址到答题框。（需要用到的软件包：CICD-Runners-demo2048.tar.gz）【实操题】2.2.8 部署GitLab Agent（1分）将Kubernetes集群添加到GitLab项目中指定名称和命名空间。将Kubernetes集群添加到demo-2048项目中，并命名为kubernetes-agent，项目命名空间选择gitlab-ci。完成后提交Master节点的用户名、密码和IP地址到答题框。（需要用到的软件包：CICD-Runners-demo2048.tar.gz）【实操题】2.2.9 构建CI/CD（0.5分）编写流水线脚本触发自动构建，要求基于GitLab项目完成代码的编译、镜像的构建与推送，并自动发布应用到Kubernetes集群中。编写流水线脚本.gitlab-ci.yml触发自动构建，具体要求如下：（1）基于镜像maven:3.6-jdk-8构建项目的drone分支；（2）构建镜像的名称：demo:latest；（3）将镜像推送到Harbor仓库demo项目中；（4）将demo-2048应用自动发布到Kubernetes集群gitlab-ci命名空间下。完成后提交Master节点的用户名、密码和IP地址到答题框。（需要用到的软件包：CICD-Runners-demo2048.tar.gz）【实操题】2.2.10 Etcd配额优化（2分）etcd的数据库空间配额大小默认限制为2G，当数据达到2G的时候就不允许写入。这里如果想继续写入，必须对历史数据进行压缩，或者调整etcd数据库的空间配额大小限制。请扩容etcd数据库空间的配额大小，将其扩容至8G。完成后提交master节点的用户名、密码和IP地址到答题框。【实操题】2.2.11 Kubernetes控制器调优（2分）当kubernetes集群中运行了多个Service，在配置更新后，对应的Endpoint和LoadBalancer资源需要长达十几分钟才会生效，经过排查，是服务控制器的处理队列堆积严重，请对服务控制器进行调优配置,增加Service资源的并发为100。完成后提交master节点的IP地址、用户名和密码到答题框。【实操题】2.3.1 通过Docker Restful API 实现容器创建（5分）Docker容器运维脚本开发，使用Restful APIs方式管理Docker容器服务。在已建好的Kubernetes环境云平台上，使用提供的AIpython3.7.3.tar.gz软件包，进行Python3.7.3的开发环境安装。自行开启Docker REST API端口，端口号为2375，可以使用python request库，在/root目录下，创建api_docker_manager.py文件，要求编写python代码，代码实现以下任务：（1）使用提供的nginx:latest镜像创建容器，容器主机名为chinaskills-nginx，开机自启动，声明端口为8010，标签为chinaskill: nginx，网络模式选择bridge；（2）创建完成之后，查询该容器的信息，查询的body部分通过控制台输出，并以json格式的文件输出到当前目录下的api_containers.json文件中；完成后提交Master节点的用户名、密码和IP地址到答题框。【实操题】2.3.2 Kubernetes资源监控开发（5分）在Master节点上使用提供的AIpython3.7.3.tar.gz软件包安装Python3.7.3，在Kubernetes Python3.7.3运维开发环境中，使用FastAPI框架，在/root/k8s目录下编写main.py文件，服务端口为9089，host为0.0.0.0，自行通过uvicorn来启动服务，并开启热重启模式，功能代码要求如下：定义接口为/cluster/metrics/，方法为GET，数据格式为列表格式，调用此接口时，返回的信息为集群中的节点名称、CPU数量、内存容量、可分配内存容量、可分配CPU数量等信息，若调用接口失败，则使用FastAPI内置的异常类，将相应的HTTP状态码抛出；完成后提交Master节点的用户名、密码和IP地址到答题框。【实操题】3.1.1 云端部署（3分）使用OpenStack集群中k8s-allinone-v1.22.1镜像创建云主机（该镜像启动后内置一个完整的kubernetes服务），该云主机作为KubeEdge的云端Kubernetes 1.22节点。然后下载软件包kubernetes_kubeedge.zip到云端节点并部署KubeEdge1.11边缘计算系统，在云端节点部署KubeEdge cloudcore云端模块、启动cloudcore服务并配置该服务可被systemd管理。完成后提交云端节点的IP地址、用户名和密码到答题框。【实操题】3.1.2 边端部署（4分）使用OpenStack集群中申请2台CentOS7.9的云主机，主机名分别为edge-node1、edge-node2。在http文件服务器中下载kubernetes_kubeedge.zip、mqtt_package.zip软件包和编译工具说明文档MakeInstall.txt，使用该软件包在虚拟机编译部署MQTT服务和KubeEdge edgecore边端模块，并启动edgecore服务。加入成功之后，启用metrics监控服务。完成后提交云端节点的IP地址、用户名和密码到答题框。【实操题】3.1.3 边缘应用部署（3分）利用搭建好的边缘计算平台，在云端节点上使用提供的相关镜像（k8simage目录下）和yaml文件（kubeedge-counter-demo目录下），自行编写DeviceModel、Device资源，要求如下：DeviceModel名字为counter-model；属性为status，类型为字符串，存储模式为读写模式，默认值为空；Device名字为counter；引用counter-model设备模型；将此设备通过节点选择器与edge-node1节点进行绑定；在status字段中的twins字段定义属性名称为status、理想值为“OFF”、真实值为“0”；编写完成后，按照顺序分别部署好DeviceModel、Device以及云端计数应用控制器和计数应用。部署完成后，将计数器打开。完成后提交云端节点的用户名、密码和IP到答题框。模块三边缘计算 任务二、边缘计算云服务开发（当前任务共2道题目）【实操题】3.2.1 基于FastAPI框架封装AI识别服务（3分）利用搭建好的边缘计算平台与 Python 3.7.3开发环境，并安装开发所需的依赖包，将提供的代码包ai_face.tar.gz导入解压到Linux服务器root目录下，打开ai_face工程目录，代码包中已经提供了人脸识别器 XML 文件和人脸视频，基于提供的XML识别文件在apps目录下编写face_recognition.py 文件定义人脸识别接口，服务端口为7047，地址要求为0.0.0.0。要求识别接口为/detect_face，实现人脸视频material_video.mp4识别，将识别后的人脸信息坐标保存到字典中进行返回。注意：选手需要手动启动AI识别服务。完成后提交运行服务节点的用户名、密码和IP到答题框。模块三边缘计算 任务二、边缘计算云服务开发（当前任务共2道题目）【实操题】3.2.2 边缘设备管理开发（7分）利用搭建好的边缘计算平台与 Python 3.7.3开发环境，将提供的fastapi_device.zip代码包导入到Linux服务器root目录下，打开fastapi_device工程目录，基于FastAPI框架和Kubernetes SDK实现了一组API，来进行管理边缘设备的后端服务，端口为8070，编码要求功能如下：1、定义获取设备资源的路由，接口为/cloud_edge_service/node/cloudnode，请求为GET，直接返回数据结果。2、定义获取单个设备资源的路由，接口为 /device/{name}，请求方式为 GET，根据设备名称 name 查询 default 命名空间中的 Device 资源，返回的数据类型为 JSON对象类型。3、定义更新设备期望状态的路由，接口为 /device/device，请求方式为 PUT，根据请求体中的 name 获取对应 Device 资源，并根据 desired 字段更新设备 status.twins.desired.value 的值，返回的数据类型为 JSON对象类型。4、定义创建设备资源的路由，接口为 /device/device，请求方式为 POST，根据请求体中的 name、dmName 和 nodeName 参数，首先获取对应的 DeviceModel 资源，并读取 spec.properties 字段生成设备属性 twins，然后构建 Device 资源结构在 default 命名空间中创建设备，返回的数据类型为 JSON对象类型。5、定义删除设备资源的路由，接口为 /device/device，请求方式为 DELETE，根据请求体中的 name 删除 default 命名空间中的 Device 资源，返回的数据类型为 JSON对象类型。注意：选手需要手动启动该服务，创建Device资源之前，必须要先创建DeviceModel资源，DeviceModel资源名称为test-devicemodel。完成后提交运行服务节点的用户名、密码和IP到答题框。【实操题】4.1.1 Dify服务部署（5分）dify是一款开源的大语言模型(LLM) 应用开发平台，融合了后端即服务和 LLMOps 的理念，使开发者可以快速搭建生产级的生成式 AI 应用。使用Centos7.9镜像申请一台云主机，并使用提供的docker-20.10.20.tgz软件包自行安装docker服务，服务安装完成后，使用提供的dify-1.9.1.zip、dify_images.zip软件包，进行dify服务的镜像导入，完成以下要求之后进行dify服务部署：（1）修改相关文件，将Python初始化超时时间设置为320秒；（2）修改相关文件，将插件最大执行时长设置为2400秒；（3）修改相关文件，将知识库上传文件的大小限制改为100M；完成后提交dify节点的用户名、密码和IP地址到答题框。【实操题】4.1.2 Ollama服务部署（5分）Ollama 是一个用于在本地轻松运行大语言模型的工具，可以用来管理大数据语言模型，并且可以通过调用其接口来完成对模型的使用。延用上一道题目环境的云主机，部署ollama服务， 容器名称为ollama，并暴露11434端口。服务部署完成后，将models.tar.gz软件包中提供的离线大模型通过ollama服务来进行管理。完成后提交ollama节点的用户名、密码和IP地址到答题框。【实操题】4.2.1 智能聊天机器人开发（10分）在搭建好 Ollama 服务的机器中，使用提供的 AIpython3.7.3.tar.gz 软件包安装 Python 3.7.3 开发环境，编写 /root/chatbot.py 文件，实现基于 Streamlit框架 + Ollama 模型服务的多轮对话流式智能聊天机器人，服务端口为 7860，host 为 0.0.0.0，手动启动该服务。开发要求如下：（1）实现对话历史展示功能：在 Web 界面中实时显示完整对话记录；用户消息与模型回复需清晰区分；多轮对话历史能够在当前会话中保持。（2）实现文件解析功能：系统支持上传文件，并解析内容；可以解析docx、txt、pdf这三种类型的文件；文件内容解析后可以作为上下文参与问答。（3）实现清空对话功能：提供“清空对话”按钮；点击后立即清除所有历史聊天记录；页面显示区域即时更新为空的对话状态（4）实现多轮流式对话功能：聊天机器人能够连续多轮回答用户问题；模型回答采用流式生成方式，逐步显示内容；支持在浏览器端实时查看生成过程。（5）实现多模型切换功能：系统界面提供模型选择下拉框；切换模型后，对话上下文仍然可用；不同模型的回答可实时展示在聊天界面。完成后提交运行服务节点的用户名、密码和 IP 地址到答题框。
cloudflare worker中new Date().getTime()返回0的解决办法
在cloudflare worker中编写JavaScript代码时，可能会需要获取时间，如果代码在全局范围中，那么获取到的时间就会为0，例如以下代码：const data = new Date().getTime(); export default { async fetch(request, env, ctx) { return new Response(data, { headers: { "Content-Type": "text/plain" } }); }, };这样编写毫无疑问会得到0，按照Cloudflare Workers 架构师 Kenton Varda 的解释：“原因在于，Cloudflare Workers 在一个未指定的时间运行全局作用域。这可能是在请求到达时按需运行，但也可能会更早。从理论上讲，Workers 甚至可能只执行一次全局作用域，然后快照其状态，并在边缘执行时从快照开始。为了确保这种不同的实现选项不会影响已部署 Workers 的行为，Workers 运行时必须确保全局作用域的执行是完全确定性的。其中一个方面是，Date.now() 在全局作用域中执行时必须始终返回相同的值——0。”参考文献：https://stackoverflow.com/questions/58491003/how-to-get-the-current-date-in-a-cloudflares-worker因为我们只需要改动一下代码的位置，修改后的代码如下：export default { async fetch(request, env, ctx) { const data = new Date().getTime(); return new Response(data, { headers: { "Content-Type": "text/plain" } }); }, };这样就能的到正确的效果了。
逻辑思维与写作导论逻辑逻辑是思维的形式规则，是思维的语法。思维和性格，不自觉的会表现在逻辑之中。思维的形式结构古希腊——形式逻辑古印度——三支论式中国——墨家的以”矛盾统一“为逻辑起点的辩证体系写作文章千古事，得失寸心知。文学作品的分类偶成赋得逻辑与写作的关系综合性写作的基础就是逻辑。文章中的逻辑文章体裁的概念文章内容的概念文章材料的选取文章讲述、推理的方法和章节、段落的逻辑推演关系议论文论证命题的两种方式议论文是对命题的证明。直接展示命题，运用各种逻辑方法加以证明陈述相关材料、事实，让读者根据材料和事实得出作者希望的命题结果归纳证明的两点注意是否有反例现象和命题是否具有因果关系第一章 概述逻辑学的历史起源独立起源古代中国——名辩之学古代印度——因明之学古代希腊——逻辑学由于古希腊逻辑学最为系统，因而在逻辑学发展史上影响最大、最深。古代中国逻辑学发源地之一。中国古代的逻辑思想先秦名辩学说惠施公孙龙墨子《墨经》荀子《正名篇》韩菲梁启超：《墨经》殆世界最古名学书之一。梁启超：论理学为一切学问之母。以后无论做何种学问，总不要抛弃论理精神。那么，真的知识，自然日日加深了。1917年胡适的《先秦名学史》对中国逻辑学史进行系统梳理。胡适：近代中国哲学与科学的发展曾极大地受害于没有适当的逻辑方法。《墨经》思想以名举定，以辞抒意，以说出故。所谓"名”，相当于概念;所谓"辞“，相当于命题;所谓“说”，相当于推理。公孙龙”白马非马“说求马，黄、黑马皆可致;求白马，黄、黑马不可致。故曰，白马非马。黄马(黑马)是马。白马不是黄马(黑马)。所以，白马不是马。公孙龙著名逻辑论断"狗非犬"”孤驹未尝有母”“火不热”“矩不方，规不可以为圆”“飞鸟之影未尝动也“世界三大传统逻辑体系中国名辩学体系欧洲形式逻辑印度因明逻辑古代印度古代印度的逻辑学正理论——婆罗门因明学——佛教因明是佛家逻辑的通称。因明学"因”指推理的依据;“明”即知识、智慧;“因明”就是古代印度关于推理、论证的学说。古代印度逻辑著作《因明正理门论》陈那《因明入正理论》商羯罗主三支论——陈那每一个推理形式都是由"宗”"因” "喻” 这三部分组成的。“宗”相当于三段论的结论;“因”相当于三段论的小前提;"喻"相当于三段论的大前提。三支论宗：此山有火因：此山有烟喻：(固喻)凡有烟的地方皆有火，如厨房;(异喻)凡无烟的地方都无火，如湖泊。由于古代中国和古代印度逻辑学都有所中断，又因古代推崇“融会贯通”的思想，没有将逻辑学作为一门独立的学科分离出来系统化，因此非常遗憾无缘与逻辑学的诞生地之美称。古代希腊言必称希腊，言必称亚氏。古希腊哲学家亚里士多德亚里士多德《工具论》一部划时代的逻辑著作。德谟克里特德谟克里特(约公元前460-前370年)研究概念的定义以及类比、假设、归纳等逻辑问题。苏格拉底苏格拉底(约公元前469-前399年)研究演绎和归纳的意义。柏拉图柏拉图(约公元前427-前347年)研究划分以及判断的逻辑形式。亚里士多德的《工具论》是一部划时代的逻辑著作。古希腊学者亚里士多德是传统逻辑的奠基人，被后世尊称为“逻辑学之父”。亚里士多德创立的逻辑被称为形式逻辑。斯多噶学派假言命题、选言命题、联言命题以及由它们所组成的推理形式。并且提出了 不同类型的推理规则和逻辑公式，这是传统形式逻辑的一个重大发展。斯多噶学派的“命题逻辑”著作《逻辑大全》对一些逻辑问题进行了新的探讨，发展了斯多噶学派的命题逻辑;研究了语义悖论及其解决方法等。演绎逻辑和归纳逻辑由于科学发展水平的限制，亚里士多德及其后继者创立的逻辑学呈现出”重演绎、轻归纳“的特点，因此被后世称为演绎主义者。逻辑学早期呈现出”重演绎、轻归纳“的特点。演绎逻辑可以在正确的前提下得出正确的结论。是人都会死，苏格拉底是人，所以，苏格拉底会死。正确的前提使用归纳逻辑不一定得到正确的结论。德谟克里特会思维，苏格拉底会思维，柏拉图会思维，，德谟克里特、苏格拉底、柏拉图是人，是人就会思维。英国哲学家弗朗西斯·培根奠定了归纳逻辑的基础。弗朗西斯·培根著《新工具》“知识就是力量”——《新工具》17世纪开始逻辑学的特点转变为”重归纳、轻演绎“《波尔 - 罗亚尔逻辑》法国 A.阿尔诺 和 P.尼柯尔 著从《波尔 - 罗亚尔逻辑》出版开始，演绎、归纳和一般逻辑方法融为一体，使传统逻辑研究范式有了一个雏形。英国哲学家约翰·穆勒《逻辑体系：归纳和演绎》（《穆勒名学》）约翰·穆勒继承和发展了培根的归纳逻辑。《逻辑体系：归纳和演绎》系统地阐述了寻求现象间因果联系的五种方法，即契合法、差异法、契合差异并用法、共变法和剩余法，逻辑史上通称为"穆勒五法"。弗里德里希·恩格斯：归纳和演绎，正如分析和综合一样是必然联系着的。不应当牺牲一个而把另一个捧到天上，应当把每个都用到该用的地方。课后思考为什么古希腊得以成为诸多学科（包括逻辑学）的发源地？我认为这和古希腊的社会环境是息息相关的。首先是因为古希腊的宪政制度。希腊罗马国家都是通过“说服－合并”方式建立起来的。用恩格斯的话说，它们都是“直接从氏族社会中产生”、“不知不觉地发展起来的”，“形成过程非常纯粹，没有受到任何外来的或内部的暴力干涉的原则”。因此，大量保留原始民主制遗风和先民的自由权利不仅是可能的，而且是必然的。与此相反，东方各文明古国的起源过程走的却是一条部族间“征服-吞并“的道路，因为战争显然需要统一的指挥由此势必导致权力集中、民权式微。普通人的主观能动性无法充分发挥出来，只能”学成文武艺，货与帝王家“，而古希腊则恰恰相反。然后是亚里士多德在《形而上学》一书开篇就说， 哲学和科学的诞生有三个条件。第一个条件是“惊异”， 第二个条件是“闲暇”，第三个条件是“自由”。他说：“因为人们是由于惊奇才开始研究哲学”，“哲学研究的开始，只是在全部生活必需品都已具备的时候，在那些人们有了闲暇的地方，那些既不用提供快乐，也不用满足必需，科学才最先被发现”。关键就在于古希腊奴隶主民主政治的建立为古希腊科学文化的发展创造了良好的社会环境。从一定意义上讲，当时政治民主、公民思想解放、制度开明、政策宽松，公民都有机会都愿意积极投身科学研究和进行精神产品的生产。公民参与科研和创作的热情空前高涨，人的主观能动性被充分激发，人是物质产品和精神产品的创造者，人的身体和思想被解放出来了，就为科学文化的兴起提供了可能，可见这是古希腊成为科学发源地的决定因素。之后是社会生产力得到解放，导致社会分工进一步加剧，正如恩格斯所说：“只有奴隶制才使农业和工业之间的更大规模的分工成为可能，从而为古代文化的繁荣，即为希腊文化创造了条件。没有奴隶制，就没有希腊国家，就没有希腊的艺术和科学。”奴隶制经济的繁荣，商品交换的需要，不同地域、不同文化背景民族之间的交流加剧，各种流派和学术传统之间相互碰撞，为古希腊科学文化的兴起提供了更为广阔的空间。再然后是古希腊神话对古希腊科学思想的影响是不可否认的，神话自然观是古希腊科学思想起源的前身，古希腊科学文化和神话有着很深的渊源关系。在古希腊，神话滋生宗教，宗教催生哲学，而当时的科学与哲学浑然一体，尚未从哲学中分离出来。可以说， 神话是人类最早的文化形态，而古希腊神话的类比和想象正是近代科学方法的雏形。总之，希腊神话是科学文化兴起的思想源泉。最后，从以上的分析和论述我们可以看出，一种社会制度对于科学文化的兴起和发展有着深刻影响。古希腊得天独厚的社会历史条件是为什么古希腊得以成为诸多学科（包括逻辑学）的发源地的重要原因。逻辑和批判性思维逻辑学研究的是思维的形式结构。标榜独立思考的写作离不开批判性思维，批判性思维离不开逻辑思维的方式。以论证为中心的非形式逻辑和批判性思维爱因斯坦：有两个人同时从烟囱里爬出来，一个人很干净，另一个人满脸煤灰，你认为哪一个人会立即去洗澡?两种观察角度脏的人会去洗澡干净的人会去洗澡关键在于两个人同时爬出来，怎么会有脏与干净两种情况爱因斯坦：如果你所讨论的命题不合逻辑，那么，不管你运用了多么合乎规则的逻辑，你还是找不到正确的答案!唐·白居易《放言五首·其三》周公恐惧流言日，王莽谦恭未篡时。向使当初身便死，一生真伪复谁知？批判性思维批判性思维的两个部分认知技能（批判性思维技能）阐释分析评价推理解释自我调整……情感特质（批判性思维人格倾向）求真开放分析性系统性自信度好奇心……约翰·杜威：没有对科学假说进行主动、持续和细致的理性反思，我们就不能表示接受或者反对它，而是要延迟判断。延迟判断是批判性思维的前提原则。论证是说理的别称。说理是批判性思维的标志性特征。批判性思维以论证为起点推理是从一个或几个已知的命题出发，推出一个新命题的思维过程。批判性思维的培养方法批判性思维的培养方法依靠知识的积累了解形式逻辑的基本理论，掌握论证的理论知识，是培养批判性思维的首要环节。论证方式的识别论证结构论点论据论证方式人文社科与日常交流中的论证，会带有很大的隐蔽性、模糊性，需要鉴别才能发现。逻辑学的研究对象逻辑的词源“逻辑”是一个外来词，由Logic音译而成。赫拉克利特最早将这个概念引入哲学。赫拉克利特用逻辑说明万物的生灭具有一定的尺度。西方逻辑学传入我国始于明朝李之藻翻译《名理探》但由于《名理探》晦涩难懂，并未引起关注，真正传入我国的时间为19世纪末、20世纪初。1905年 严复 《穆勒名学》和1908年 严复 《名学浅说》严复在翻译《穆勒名学》时，首次将“Logic" 译为"逻辑”但严复并未将逻辑作为学科的名字，而是命名为名学，因为先秦时期就有名学的概念。直到20世纪30年代以后，中国才逐渐通用"逻辑”这一译名。在现代汉语里"逻辑”是个多义词。可以表示某种理论观点、思维的规律性、客观事物的规律性或者指研究思维形式及其规律的科学。逻辑学属于思维科学逻辑学的研究对象思维的形式结构思维的规律思维相关的逻辑方法笛卡尔：我思故我在。思维思维具有间接性思维建立在过去的知识经验上对客观事物的反应，因此思维具有间接性。正是由于思维的间接性，人们才可能超越了感知提供的信息，认识那些没有直接作用于人的感官的事物的属性，从而揭示事物的本质和规律，实现推理。思维具有概括性思维和语言人们的思维活动，离不开语言。思维借助语言实现。逻辑作为一门学科，是通过研究语言的形式结构来实现对思维形式结构的研究，它对思维形式结构的认定必须借助于对相关语言形式的分析。逻辑形式是不同的思维内容所具有的共同结构。语言形式是某种语言的具体表达方式。逻辑形式与语言形式之间的主要区别逻辑形式与语言形式之间的主要区别同样一种逻辑形式可以用不同的语言形式来表达同一个语言形式在不同的场合能表达不同的逻辑形式中国乒乓球很厉害，谁也打不过。中国足球很厉害，谁也打不过。逻辑学是一门具有较高抽象性的科学。逻辑学是一门工具性质的科学。逻辑学是思维的语法。课后思考有无可能通过学校教育提高批判性思维能力？如果有，应如何实施？我认为可以通过学校教育提高批判性思维能力。通过前面的学习，我知道了批判性思维的培养方法有依靠知识的积累和论证方式的识别两个。我认为学校最适合第一种，也就是帮助学生对于知识的积累。首先，学校就是传授知识的场所，我们在学校内学习，学校发挥了独特而重要的能力。我认为，学校可以从两个方面发挥学校教育对于提高批判性思维能力。第一个方面是进行科学史教育，树立批判意识。怀疑批判精神是一个人积极的、富有建设性的心理特质，有了这种特质，便有了颠覆既成定论的可能，有了这种可能便也有了新创造、新发现的可能。这个就是帮助学生提高批判性思维的两个部分其一批判性思维技能。通过学习历史，学习别人是如何发扬批判性思维来提高自己的批判性思维，熟练运用阐释、分析、评价、推理、解释和自我调整等批判性思维技能。第二个方面是通过鼓励学生挑战权威，鼓足批判勇气。充分利用各种教学资源，进行批判性思维教学，学会如何实事求是的批判，也就是进行批判的实践，增强学生的批判性思维人格倾向，让学生不断在实践中具有批判性思维人格倾向的求真、开放、分析性、系统性、自信度、好奇心等特点。授人以鱼不如授人以渔，学校教育提高批判性思维能力关键在于引导而不是灌输，通过对历史的感悟和对实践的理解，学生自然就通过学校教育提高了批判性思维能力。第二章 概念概念的定义概念是反映对象特有属性或本质属性的思维形式。概念是一种思维形式。概念的特征对象——概念所反映的对象是一切可以被思考的事物。属性——指事物的性质特点以及事物与事物之间的关系。性质——形象，颜色，气味，美丑，善恶……关系——大于，小于，在……之前……本质属性——决定一事物之所以为该事物并区别于其他事物的属性。非本质属性概念的形成陈述→对比→抽象→概括→命名人的定义柏拉图：人是浑身无毛而两足直立的动物。荀子：人之所以为人者，非特以二足而无毛也，以其有辨也。博马舍《趣姻缘》：人是不渴而饮，人是四季有性欲的动物，然而神志正常的人，有谁会把四季交配的，鸽子、鹦鹉也流视为同类呢。人类对事物本质认识的越深刻，形成的概念越准确。人的本质不是单个人所固有的抽象物，在其现实性上，它是一切社会关系的总和。概念和语词概念是语词的思想内容，语词是概念的表达形式。概念是思维形式，语词是语言形式，反映客观事物的是概念，语词只是用来表达概念，只是一个符号。任何概念都必须通过语词来表达，但不是所有语词都表达概念。只有实词表达概念，虚词单独不表达任何概念。同一个概念可以用不同的语词来表达。同一个语词可以表达不同的概念。概念的内涵和外延内涵——概念的内涵是指反映在概念中对象的本质属性。（反映是什么）外延——具有概念所反映的特有属性或本质属性的对象。（反映有哪些）概念的外延是一个类具有相同属性的对象统称为一个类。概念的种类集合概念——以事物的群体为反映对象的概念。非集合概念——不以事物的群体为反映对象的概念。单独概念——反映某一个事物的概念它的外延仅有一个单独的对象。普遍概念——指反映某一类事物的概念，它的外延不是由一个单独的分子构成，而是由两个乃至许许多多的分子组成的类。正概念——在思维中反映对象具有某种属性的概念就叫做正概念(或肯定概念)。负概念——在思维中反映对象不具有某种属性的概念叫做负概念(或否定概念)。论域：一个负概念与其相对应的正概念所指称的对象组成的类。实体概念——实体概念是反映具体事物的概念属性概念——属性概念是反映事物属性的概念概念间的关系是概念的外延的关系分为全同关系、真包含于关系、真包含关系、交叉关系、全异关系。用图表表达的关系称为欧拉图相容关系——概念的外延有重合全同关系是指两个概念的外延完全重合的关系。外延一样，内涵不同。属种关系——真包含于关系和真包含关系。外延大的概念叫做属概念，外延小的概念叫做种概念。属种关系是相对的。属概念具有的属性，种概念必须有。真包含于关系是指一个概念的全部外延与另一个概念的部分外延重合的关系。真包含关系是指一个概念的部分外延与另一个概念的全部外延重合的关系。交叉关系——概念的部分外延与另一个概念的部分外延相重合的关系。不相容关系——概念之间的外延完全不重合全异关系——两个概念的外延没有任何部分重合的关系。矛盾关系——两个概念的全部外延构成一个完整论域。具有矛盾关系的两个种概念的外延和等于它们的属概念的外延。反对关系——反对关系的两个种概念的外延和小于它们的属概念的外延。正概念与负概念之间具有矛盾关系。内涵与外延之间的反变关系一个概念它的外延越大，内涵越小，反之亦然。反变关系是研究概念的限制和概括的逻辑依据。概念的限制通过增加概念内涵以缩小概念外延的逻辑方法。概念的限制的作用：有助于人们对事物的认识从一般过渡到特殊，从而使认识越来越具体。概念的概括通过减少概念的内涵以扩大概念的外延，由一个外延较小的概念过渡到个外延较大的概念。限制和概括的规则概括或限制得到的概念与原概念之间必须具有属种关系。概括和限制可以连续进行，但并不是可以无限地进行。单独概念不能再限制。哲学范畴是不能概括的概念。限制和概括的外延必须有增加或者缩小。定义定义是明确概念内涵的逻辑方法。什么，是，什么。↓被定义项，定义联项，定义项。被定义项是其内涵有待明确的概念。定义项是用来明确被定义项内涵的概念。定义联项是联结被定义项和定义项的语词。定义的分类真实定义——直接揭示概念所反映对象的特有属性，即概念的内涵。真实定义也称为本质定义，它是明确概念所反映对象的特有属性的定义。属加种差定义方法，被定义项=种差+邻近属概念。不是所有的概念都有属概念，不是所有的定义都可以用属加种差的方法。找到被定义项邻近的属概念。找到种差。种差是将被定义项所反映的对象与包含在同一属中其他种事物区别开来的特有属性或本质规定。用种差限制邻近属概念以构成定义项。用适当的定义联项将被定义项和定义项联结，形成一个完整的定义。语词定义——通过揭示表达概念的语词的含义来间接明确概念内涵。明确语词确切含义的定义，并不揭示概念的内涵。语词定义可分为说明性的语词定义和规定性的语词定义两种。规定性的语词定义是人们通过约定对某个原有的或新出现的词赋予特定意义的定义。定义的规则定义项的外延和被定义项的外延必须是全同关系。定义项中不得直接或间接地包含被定义项。定义应当用肯定的语句形式和正概念（定义项一般不能包含负概念，并且定义不能是否定命题，而应当用肯定命题来表达），但如果定义的是负概念则可以使用。定义必须明确，不可以用比喻代替定义。正确的定义项解释被定义项概念所反映的本质属性。定义过宽：定义项的外延大于被定义项的外延。定义过窄：定义项的外延小于被定义项的外延。富兰克林：站着的农夫比跪着的绅士高贵。同语反复：如果定义项与被定义项只是在语言形式上有所不同，从而在定义项中直接包含被定义项。循环定义：如果定义项中间接地包含了被定义项。定义含混以比喻代定义划分以对象的一定属性为标准，将个属概念分成若干个种概念以达到明确其外延的逻辑方法。划分的三部分：划分的母项、划分的子项以及划分的根据。划分的母项是指被划分的概念。划分的子项是指划分后的种概念。划分的根据是指把母项划分为子项所依据的标准。划分前母项的全部属性，划分后的子项必须有。划分的类型一次划分对母项一次划分完毕的划分，这种划分只有母项和子项两层。二分法——一个特殊形式的一次划分以对象有无某种属性作为划分标准连续划分把一个词项划分为若干子项，再对子项进行划分。划分的规则划分所得各子项的外延之和必须全同于母项的外延。划分不全——子项的外延之和小于母项的外延，将本来就应该属于母项的外延遗漏。多出子项——子项的外延之和大于母项的外延，将本就不属于母项的对象当作子项。每次划分的标准必须同一。多标准划分划分的各子项外延之间必须互不相容——划分后所得的各子项外延之间必须是不相容的全异关系。子项相容单独概念没有种概念，不能划分但可以分解。划分、分解与列举的区别划分——类和分子的关系，将一个词项所指称的对象分为若干个小类。分解——整体和部分的关系，把一个具体事物肢解为若干个组成部分。列举——列举是划分的省略形式，是一种特殊的划分，不必划分出全部的外延，可以省略部分外延。第三章 命题和推理命题的形式与种类命题是用语句反映事物情况的思维形式。命题内容：指命题所反映的事物情况。命题形式：命题内容的联系方式，即命题的逻辑形式。命题形式以逻辑变项是概念还是命题为标准，分为简单命题和复合命题。简单命题——又称原子命题，命题的最小单位，不含其他命题，其变项是概念。性质命题（例如：北京是中华人民共和国的首都。）关系命题复杂命题——包含其他命题的命题，复合命题的逻辑变项通常是一个命题联言命题选言命题假言命题负命题命题的特征断定性任何命题对事物情况都有所断定，就是肯定或者否定对象具有或者不具有某种属性，如果对事物情况无所陈述，就不能称之为命题。真假性真假性是命题的主要特征。命题既然是对事物情况的陈述，它就应该有真假；如果一个命题所陈述的与客观实际情况相一致,这个命题就是真的；如果一个命题所陈述的与客观实际不一致，这个命题就是假的。命题的真、假二值,逻辑上统称为命题的真值，又称为命题的逻辑值。真命题的真值为真（用“+”表示），假命题的真值为假（"-"表示）。命题的组成内容形式命题与语句的关系一方面，任何命题都是通过语句来表达的；另一方面，命题则是语句的内容。同一命题可以用不同的语句来表达。同一语句还可以表达不同的命题。虽然命题都通过语句来表达，但并非所有语句都表达命题。陈述句和反问句表达命题，一般疑问句、祈使句、感叹句不表达命题。命题是描述事件的语句所表达的思想内容，属于思维的范畴，而语句则是一种符号。推理的定义和分类推理：由一个或几个已知命题推出一个新命题的思维形式组成已知命题（前提），P推出的新命题（结论），QP，所以，Q分类前提与结论有无蕴涵关系必然性推理——前提与结论之间有蕴涵关系，结论必然为真。演绎推理完全归纳推理或然性推理——前提与结论之间没有蕴涵关系，结论或然为真（结论可能为真）不完全归纳推理类比推理思维进程方向的不同演绎推理（从一般到特殊）归纳推理（从特殊到一般）类比推理（从特殊到特殊）联言命题联言命题是陈述若干事物情况同时存在的命题。联言命题的连接词常用“并且”联言命题由支命题和联结词“并且”等构成。联言命题的逻辑联结词“……并且……“，可用合取词“∧”（读作“合取”）表示。一个二支的联言命题的形式为：p并且q，也可以表示为合取式：p∧q。所有的联言支都为真的情况下，联言命题才为真。只要有一个联言支是假的，那么联言命题就一定是假的。pqp∧q++++---+-联言推理联言推理是根据联言命题的逻辑性质进行推演的推理，据此，联言推理分为组合式联言推理和分解式联言推理。组合式联言推理由全部支命题为真，推出联言命题为真的推理形式。p，q，所以，p∧q。分解式联言推理由联言命题的真，推出每一个支命题都为真的联言推理形式。（p∧q）→p（p∧q）→q相容选言命题选言命题一般由联结词“或者”或“要么”和支命题构成。选言命题的支命题称为选言支。选言支可以有两个，也可以有两个以上。陈述若干事物情况至少一个为真的命题。相容选言命题的支命题可以同真。“∨”析取符号，p或者q，p∨q。pqp∨q++++-+-++相容选言推理否定肯定式前提中否定相容选言命题前提的除一个以外的其他选言支，从而得出肯定剩下一个选言支的推理形式。p或者q，非p（或非q），所以q（或p）。蕴涵式表示：(p∨q)∧¬p→q；(p∨q)∧¬q→p析取附加式以任一命题为前提，得出以这个命题为一选言支，并附加另一选言支构成的选言命题为结论的推理形式。p，所以，p或者q蕴涵式表示：p→p∨q不相容选言命题及其推理不相容选言命题：支命题不可以同时为真的选言命题要么在沉默中爆发，要么在沉默中灭亡。“∀”不相容析取符号，p要么q，p∀q。（注：正确的不相容析取符号在∨的中间是一点而不是连起来的一横，由于暂时无法打出这个符号，故此注明。）pqp∀q（∀为不相容析取符号）++-+-+-++不相容选言推理：前提有一个是不相容选言命题，并且根据不相容选言命题的逻辑性质进行的推理。否定肯定式：是p要么q，非p（或非q），所以，q(或p)也可以用蕴涵式表示：(p∀q) ∧¬p→q；(p∀q)∧¬q→p。（∀为不相容析取符号）肯定否定式：是p要么q，p（或q），所以，非q(或非p)也可以用蕴涵式表示：(p∀q) ∧p→¬q；(p∀q)∧q→¬p。（∀为不相容析取符号）假言命题及其推理假言命题：表示的是一事物是另一事物存在的条件的命题。假言联结词：表达的是一个支命题所描述的事件是另一个支命题所描述事件存在的条件。分类充分条件假言命题反映某事物情况是另一事物情况充分条件的命题有前件一定有后件，没有前件不一定没有后件如果p，那么q，p→q（p蕴涵q）一个充分条件假言命题，只有当前件真而后件假时，它是假的，其余情况下都为真。肯定前件式：前提肯定前件，结论肯定后件。p→q，p，所以q。肯定前件必然肯定后件；否定后件必然否定前件。否定后件式：p→q，¬p，所以¬q。否定前件不能否定后件；肯定后件不能肯定前件。必要条件假言命题必要条件假言命题是陈述某一事物情况是另一件事物情况的必要条件的假言命题。描述的是两个事件之间的必要条件联系。没有前件一定没有后件，有前件而不一定有后件。没有前件，就一定没有后件，有前件不一定有后件，这样的前件就是后件的必要条件。只有p，才q，p←q（p逆蕴涵q）；¬p→¬q前假后真时为假，其它都为真。必要条件假言推理是以必要条件假言命题为前提，并根据必要条件假言命题的逻辑特性进行的推理。否定前件式：前提否定前件，结论否定后件。p←q，¬p，所以¬q肯定后件式：前提肯定后件，结论肯定前件。p←q，q，所以p否定前件，必然否定后件；肯定后件，必然肯定前件。肯定前件，不能肯定后件；否定后件，不能否定前件。充分必要条件假言命题有前件，就一定有后件。没有前件，就一定没有后件。这样的前件就是后件的充分必要条件。当且仅当p，才q，p↔q（↔等值符号）一个充分必要条件假言命题的真假，取决于其前件所反映的事物情况是不是后件所反映的事物情况的充分必要条件。如果是则真，不是，则假。前件p和后件q必须同真同假。如果两个支命题的真假不同，充分必要条件命题就是假的。所有的式，都是有效式。肯定前件，就要肯定后件；否定前件，就要否定后件。肯定后件，就要肯定前件；否定后件，就要否定前件。常理是一个作为必要条件所存在的事物情况。假言命题的构成：表示条件的支命题叫做假言命题的前件；表示依赖条件而成立的命题叫做假言命题的后件。充分条件假言命题真值表：pqp→q++++---++--+必要条件假言命题真值表：pqp←q++++-+-+---+充分必要条件假言命题真值表：pqp↔q++++---+---+二难推理二难推理又称为假言选言推理，是依据假言命题和选言命题的逻辑性质进行的复合命题推理。构成式：假言选言推理的构成式是以选言前提的两个选言支分别肯定两个假言前提的前件，从而得出肯定这两个假言前提的后件的结论的推理形式。构成式简单构成式如果p，那么r，如果q，那么r，p或者q，所以r(p→r)∧(q→r)∧(p∨q)→r复杂构成式如果p，那么r，如果q，那么s，或者p，或者q，所以，或者r，或者s(p→r)∧(q→s)∧(p∨q)→(r∨s)破坏式：假言选言推理的破坏式是以选言命题的两个选言支分别否定两个假言命题的后件，从而得出否定这两个假言命题前件的结论的推理形式。破坏式简单破坏式如果p，那么r，如果p，那么s，非p或者非s，所以飞，非p(p→r)∧(p→s)∧(¬r∨¬s)→¬p复杂破坏式如果p，那么r，如果q，那么s，非r或者非s，所以，非p或者非q(p→r)∧(q→s)∧(¬r∨¬s)→(¬p∨¬q)简单破坏式和复杂破坏式的区别在于简单破坏式的结论是一个简单命题而复杂破坏式的结论是一个作为复杂命题的选言命题。构成式和破坏式的区别在构成式利用的是充分条件的肯定前件式而破坏式利用的是充分条件的否定后件式来否定前件。如何摆脱二难推理前提：好的二难推理无法摆脱。因为二难推理的主要特征就是通过小前提所提供的非彼既此或者一此一彼的选择选择出来的。破解二难推理的两种途径寻找到第三个选择。能不能指出在p或者q这两个选言支以外，还有第三种选言情况存在。证伪前提同时满足两个选择。能不能指出p或者q其中一个为假。课后思考请尝试构建一个二难推理，再尝试是否能破解？如果你是人，那么你不是东西，如果你是东西，那么你不是人，你是东西或者你是人，所以你不是人或者不是东西。我想如果要破解这个二难推理，可以证明人也是东西的一种，人既可以是人也可以是东西，我认为就破解了二难推理。第四章 直言命题及其推理直言命题直言命题是属于传统逻辑的研究范式，传统逻辑之中把直言命题统称为传统直言命题，简称为直言命题。直言命题是一种简单命题简单命题指的是结构简单，而之所以直言命题结构简单，从直言命题的形式结构上分析，简单命题它的逻辑变项是概念，而正是因为它的逻辑变项是概念而不是命题，自身不能分解为、自身不可能再去包含其他的命题。直言命题也叫性质命题，性质命题也称直言命题直言命题用来陈述的是对象具有或不具有某种性质。直言命题的概念：直言命题就是直接陈述对象具有或不具有某种性质的简单命题。直言命题因为它是对于命题本身做出来的直接陈述，因此叫直言。而另外又因为直言命题所陈述的是对象具有或不具有的性质，因此这种命题还称为性质命题。(1)所有的狗都不是植物。(2有些被告不是有罪的。(3西安是陕西的省会。(4)鸟是有翅膀的。被陈述的对象，称为主项，代表符号“S”对象是直言命题所陈述的性质。(1)所有的狗都不是植物。(2)有些被告不是有罪的。(3)西安是陕西的省会。(4)鸟是有翅膀的。表示性质的概念，称为谓项，代表符号“P"连接主项和谓项的连接词被称为联项。对于一个直言命题还有表示数量的量词，也被称为量项。(1)所有的狗都不是植物。→全称量词(2)有些被告不是有罪的。→特称量词特称的量词不排除全部。主项是表示被陈述对象的词项用字母“S”表示。谓项是主项具有或不具有的性质的词项用字母“P”表示。联项是表示主项和谓项之间的联系的语词。量项是表示主项所指称对象的数量的语词。直言命题的种类按质可分为肯定命题否定命题按量可分为全称命题特称命题单称命题因此有6种直言命题全称肯定命题全称肯定命题是陈述主项所指称的全部对象都具有某种性质的命题。全称肯定命题形式为：所有有S都是P。用符号表示为：SAP。简记为：A。外延：S真包含于P、S和P之间是全同的。全称否定命题全称否定命题是陈述主项所指称的全部对象都不具有某种性质的命题。全称否定命题形式为：所有S都不是P。用符号表示：SEP，简记为：E。外延：S、P构成全异关系。特称肯定命题特称肯定命题是陈述主项所指称的对象至少有一个具有某种性质的命题。特称肯定命题的形式为：有S是P。用符号表示为：SIP。简记为：I。外延：主谓之间有相容就有一部分主谓项一定重合。不排除全部。全称肯定命题两种概念外延间关系真包含于和全同关系一样会适用于特称肯定命题。只有主谓项具体概念有真包含关系、全同关系、真包含于关系、交叉关系时l命题为真。特称否定命题特称否定命题陈述主项所指称的对象至少有一个不具有某种性质的命题。特称否定命题的形式是：有S不是P。用符号表示为：SOP。简记为:O。外延：至少有一部分S的外延是排斥P的全部外延，真包含关系，交叉关系、全异关系。单称肯定命题单称肯定命题是陈述主项指称的单个 对象具有某种性质的命题。从主项同谓项外延间的关系看，由于单称肯定命题所陈述的是主项所指称的对象的全部具有某种性质，因而单称肯定命题陈述的主项和谓项外延间的关系，与全称肯定命题陈述的主项和谓项外延间的关系完全相同。符号表示为：SaP。简记为：a。单称否定命题单称否定命题是陈述主项指称的单个对象不具有某种性质的命题。单称否定命题的形式是：这个S不是P。用符号表示为：SeP。简记为：e。直言命题词项的周延性问题直言命题词项的周延性，是指在一个具体命题中主项和谓项的全部外延是否被断定。如果某种形式的命题陈述了一个词项的全部外延，那么，在这种形式的命题中，该词项就是周延的；如果某种形式的命题没有陈述一个词项的全部外延，那么，在这种形式的命题中，该词项就是不周延的。命题种类SPSAP周延不周延SEP周延不周延SIP不周延不周延SOP不周延周延全称的主项和否定的谓项周延，其他词项都不周延。直言对当关系推理对当关系推理：对当关系推理是根据直言命题间的对当关系进行的推理，它是以一个直言命题为前提推出另一个直言命题为结论的演绎推理。特称肯定命题：当A命题为真时，O命题定为假；当E命题为真时，l命题定为假。下反对关系：O、I命题之间的关系两者可以同真，不可以同假。矛盾关系A——O、E——I，可以由真推假也可以由假推真。差等关系A——l、E——O。全称真时特称真，全称假时特称真假不定，特称假时全称假，特称真时全称真假不定。反对关系同假不同真，可以由真推假但不可由假推真。下反对关系同真不同假，可以由假推真但不可由真推假。记忆方法矛盾关系：一真一假差等关系：自上而下，上真下真；自下而上，下假上假。反对关系：同假不同真下反对关系：同真不同假对当关系要在同一素材（主项和谓项分别相同）的命题间进行。在对当关系中单称命题不能作全称处理。三段论三段论定义：三段论是以两个包含着共同项的直言命题为前提，推出一个直言命题为结论的推理。三段论结构：在一个三段论中，有且只有三个命题，有且只有三个词项。小项：结论的主项，通常用"S"表示。小前提：包含小项的前提。大项：结论的谓项。通常用"P"表示。大前提：包含大项的前提。中项：两个前提包含的项，两个前提共有的词项，中项是在结论中不出现的词项，通常用“M”表示。推出的新命题叫结论。三段论规则基本规则一个三段论有且只能有三个不同的词项。四词项错误，中项在大项和小项中的意思不同。中项在前提中至少要周延一次。只有全称的主项和否定的谓项是周延的。在前提中不周延的项，在结论中不得周延。大项不当周延、小项不当周延。两个否定的前提不能得出结论。如果有一个前提是否定的，则结论是否定的。如果结论是否定的，则必有一个前提是否定的。导出规则两个特称的前提不能提出结论。如果有一个前提是特称的，则结论只能是特称的。
OpenStack 资源管理的客户端程序开发使用已建好的 OpenStack Python 运维开发环境，在 root 目录下创建resource_manager.py 脚本，基于 OpenStack 资源配额管理服务封装客户端工具，resource_manager.py 程序支持命令行带参数执行，命令参数要求说明如下：（1） 位置参数“command”，表示操作类型。操作类型包括“list”：标识查看所有的对象；“get”：查询指定的对象。（2） 位置参数“resource”，表示资源信息类型：类型包括 “provider”：资源提供者；“inventory”：资源库存；“usage”：资源使用情况。（3） 参数“-p 或-- provider”，标识资源提供者的名称。功能要求如下：（1） 程序查询所有资源提供者，以 json 格式控制台输出。执行实例如下： python3 resource_manager.py list provider（2） 查询指定资源提供者的资源信息，以 json 格式控制台输出。执行实例如下： python3 resource_manager.py get provider -p “providername”（3） 查询指定资源提供者的资源库存信息，以 json 格式控制台输出。执行实例如下： python3 resource_manager.py get inventory -p “providername”（4） 查询指定资源提供者的资源使用信息，以 json 格式控制台输出。执行实例如下： python3 resource_manager.py get usage -p “providername”import requests, argparse head = {'Content-Type': 'application/json', 'X-Auth-Token': "gAAAAABlCgH73Gp9miXcE6NRAPoOz7xk4GfiST9QOSCLJbJs46_jNmYT8EhGQK2ADDvPbYYfiU1fjTPVtEDBOoC9jgTBEcXrxcHgBNtFIyrU2VGs5xrHGUfUw8Q9GEv7k6EaBgylF71icBv78x_p80YkBBoJ1znr224U5R7wEyYB5YpbYiMF2To"} def list_resource_providers(): resp = requests.get('http://controller:8778/resource_providers', headers=head) print(resp.text) return list(map(lambda x: {'name': x['name'], "uuid": x["uuid"]}, resp.json()['resource_providers'])) def name_to_uuid(name): for i in list_resource_providers(): if i['name'] == name: return i['uuid'] return None def get_usages(name): resp = requests.get(f'http://controller:8778/resource_providers/{name_to_uuid(name)}/usages', headers=head) print(resp.text) return resp.json() def get_resource_providers(name): resp = requests.get(f'http://controller:8778/resource_providers/{name_to_uuid(name)}', headers=head) print(resp.text) return resp.json() def get_inventory(name): resp = requests.get(f'http://controller:8778/resource_providers/{name_to_uuid(name)}/inventories', headers=head) print(resp.text) return resp.json() if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('command') parser.add_argument('resource') parser.add_argument('-p', '--provider') args = parser.parse_args() if args.command == 'list' and args.resource == 'provider': print(args.command, args.resource) print(list_resource_providers()) elif args.command == 'get' and args.resource == 'provider': print(args.command, args.resource, args.provider) print(get_resource_providers(args.provider)) elif args.command == 'get' and args.resource == 'inventory': print(args.command, args.resource, args.provider) print(get_inventory(args.provider)) elif args.command == 'get' and args.resource == 'usage': print(args.command, args.resource, args.provider) print(get_usages(args.provider))
华为公有云运维开发—— 基于FastAPI框架封装华为云VPC服务Restful APIs接口
使用已建好的运维开发环境，可用区为华北-北京4，在/root/huaweicloud_fastapi目录下创建main.py文件，基于FastAPI框架，完成虚拟私有云VPC管理服务的封装，端口为7045。提示说明：华为云主机支持安装所需Python库。提交前答案前，需安装所开发程序所依赖的Python库。（1）封装创建接口，路径为/cloud_vpc/create_vpc，参数格式为{"name": "","cidr": ""},name为VPC名称，cidr为虚拟私有云下可用子网的范围；方法为POST，返回数据类型为JSON类型。（2）封装单个VPC查询接口，路径为/cloud_vpc/vpc/{vpc_name}，路径中{vpc_name}为待查询VPC；方法为GET，返回数据类型为JSON类型。（3）封装服务查询接口，要求可以查询到所有VPC，路径为/cloud_vpc/vpc；方法为GET，返回的数据类型JSON类型的列表类型。（4）封装更新VPN名称接口，路径为/cloud_vpc/update_vpc，参数格式为{"new_name": "","old_name": ""}，new_name为VPC新名称，old_name为待删除的VPN名称；方法为PUT，返回JSON类型的更新后数据。（5）封装删除接口，接口名为/cloud_vpc/delete_vpc，参数格式为{"vpc_name": ""}，vpc_name为VPC新名称；方法为DELETE，返回JSON类型的删除后的数据。功能编写完成后，手工启动Restful服务，再提交检测。#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @author YWLBTWTK # @date 2023/9/18 from fastapi import FastAPI import uvicorn from huaweicloudsdkcore.auth.credentials import BasicCredentials from huaweicloudsdkvpc.v2.region.vpc_region import VpcRegion from huaweicloudsdkcore.exceptions import exceptions from huaweicloudsdkvpc.v2 import * app = FastAPI() ak = "UCJEM0YMIIEGCS3SGW4R" sk = "ueyWtMjX5o9KBbQkFKPWx14Jkiqbq4VQ2EQjacfn" g_region = "cn-north-4" def api_list_vpc(name): credentials = BasicCredentials(ak, sk) client = VpcClient.new_builder() \ .with_credentials(credentials) \ .with_region(VpcRegion.value_of(g_region)) \ .build() try: request = ListVpcsRequest() response = list(map(lambda x: {'name': x['name'], 'id': x['id']}, client.list_vpcs(request).to_dict()['vpcs'])) for i in response: if i['name'] == name: print(i['id']) return i['id'] return None except Exception: return None @app.post('/cloud_vpc/create_vpc') def api_create_vpc(data: dict): credentials = BasicCredentials(ak, sk) client = VpcClient.new_builder() \ .with_credentials(credentials) \ .with_region(VpcRegion.value_of(g_region)) \ .build() try: request = CreateVpcRequest() vpcbody = CreateVpcOption( cidr=data['cidr'], name=data['name'] ) request.body = CreateVpcRequestBody( vpc=vpcbody ) response = client.create_vpc(request) print(response) return response except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) return e except Exception as e: return e @app.get('/cloud_vpc/vpc/{vpc_name}') def api_get_vpc(vpc_name: str): credentials = BasicCredentials(ak, sk) client = VpcClient.new_builder() \ .with_credentials(credentials) \ .with_region(VpcRegion.value_of(g_region)) \ .build() try: request = ShowVpcRequest() request.vpc_id = api_list_vpc(vpc_name) response = client.show_vpc(request) print(response) return response except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) return e except Exception as e: return e @app.get('/cloud_vpc/vpc') def api_get_list_vpc(): credentials = BasicCredentials(ak, sk) client = VpcClient.new_builder() \ .with_credentials(credentials) \ .with_region(VpcRegion.value_of(g_region)) \ .build() try: request = ListVpcsRequest() response = client.list_vpcs(request).to_dict() print(response) return response except Exception as e: return e @app.put('/cloud_vpc/update_vpc') def api_update_vpc(data: dict): credentials = BasicCredentials(ak, sk) client = VpcClient.new_builder() \ .with_credentials(credentials) \ .with_region(VpcRegion.value_of(g_region)) \ .build() try: request = UpdateVpcRequest() request.vpc_id = api_list_vpc(data['old_name']) vpcbody = UpdateVpcOption( name=data['new_name'] ) request.body = UpdateVpcRequestBody( vpc=vpcbody ) response = client.update_vpc(request) print(response) return response.to_dict() except Exception as e: return e @app.delete('/cloud_vpc/delete_vpc') def api_delete_vpc(data: dict): credentials = BasicCredentials(ak, sk) client = VpcClient.new_builder() \ .with_credentials(credentials) \ .with_region(VpcRegion.value_of(g_region)) \ .build() try: request = DeleteVpcRequest() request.vpc_id = api_list_vpc(data['vpc_name']) response = client.delete_vpc(request) print(response) return response.to_dict() except Exception as e: return e if __name__ == '__main__': uvicorn.run(app='main:app', host='0.0.0.0', port=7045, reload=True)
Python运维开发：用户管理的命令行工具开发
Python运维开发：用户管理的命令行工具开发[2分]使用已建好的OpenStack Python运维开发环境，在/root目录下创建user_manager.py脚本，完成用户管理功能开发，user_manager.py程序支持命令行带参数执行。提示说明：Python标准库argparse模块，可以提供命令行参数的解析。（1）程序支持根据命令行参数，创建1个用户。位置参数“create”，表示创建；参数“-i 或--input”，格式为json格式文本用户数据。查询结果，以json格式输出到控制台。参考执行实例如下：python3 user_manager.py create --input '{ "name": "user01", "password": "000000", "description": "description" } '（2）支持查询给定具体名称的用户查询。位置参数“get”，表示查询1个用户；参数“-n 或 --name”支持指定名称查询，类型为string。参数“-o 或 output”支持查询该用户信息输出到文件，格式为json格式。参考执行实例如下：python3 user_manager.py get --name user01-o user.json（3）程序支持查询目前admin账号下所有的用户。位置参数“getall”，表示查询所有用户；参数“-o 或--output”支持输出到文件，格式为yaml格式。参考执行实例如下：python3 user_manager.py getall -o openstack_all_user.yaml（4）支持删除指定的名称的用户。位置参数“delete”，表示删除一个用户；返回response，通过控制台输出。参数“-n或--name”支持指定名称查询，类型为string。参考执行实例如下：python3 user_manager.py delete -name user01import json import yaml import openstack import argparse conn = openstack.connect(cloud='openstack') def create_user(name, password, email=None, enabled=None, description=None, domain_id=None, default_project=None): return conn.create_user(name=name, password=password, email=email, default_project=default_project, enabled=enabled, domain_id=domain_id, description=description) def get(name): return conn.get_user(name) def getall(): return conn.list_users() def delete_user(name): return conn.delete_user(name) if __name__ == '__main__': parser = argparse.ArgumentParser() sub = parser.add_subparsers(dest='command') sub1 = sub.add_parser('create') sub1.add_argument('-i', '--input', type=json.loads) sub2 = sub.add_parser('get') sub2.add_argument('-n', '--name') sub2.add_argument('-o', '--output') sub3 = sub.add_parser('getall') sub3.add_argument('-o', '--output') sub4 = sub.add_parser('delete') sub4.add_argument('-n', '--name') args = parser.parse_args() if args.command == 'create': print(create_user(name=args.input['name'], password=args.input['password'], description=args.input['description'])) elif args.command == 'get': resp = get(args.name) print(json.dumps(resp)) with open(args.output, 'w') as f: f.write(json.dumps(resp)) elif args.command == 'getall': resp = getall() print(yaml.dump(json.loads(json.dumps(resp)))) with open(args.output, 'w') as f: f.write(yaml.dump(json.loads(json.dumps(resp)))) elif args.command == 'delete': print(delete_user(args.name))
Python运维开发：云主机类型管理的命令行工具开发
Python运维开发：云主机类型管理的命令行工具开发[2分]使用已建好的OpenStack Python运维开发环境，在/root目录下创建flavor_manager.py脚本，完成云主机类型的管理，flavor_manager.py程序支持命令行参数执行。提示说明：Python标准库argparse模块，可以提供命令行参数的解析。要求如下：（1）程序支持根据命令行参数，创建1个多云主机类型。返回response。位置参数“create”，表示创建；参数“-n”支持指定flavor名称，数据类型为字符串类型；参数“-m”支持指定内存大小，数据类型为int，单位M；参数“-v”支持指定虚拟cpu个数，数据类型为int；参数“-d”支持磁盘大小，内存大小类型为int，单位G；参数“-id”支持指定ID，类型为字符串。参考运行实例：python3 flavor_manager.py create -n flavor_small -m 1024 -v 1 -d 10 -id 100000（2）程序支持查询目前admin账号下所有的云主机类型。位置参数“getall”，表示查询所有云主机类型；查询结果，以json格式输出到控制台。参考执行实例如下：python3 flavor_manager.py getall（3）支持查询给定具体名称的云主机类型查询。位置参数“get”，表示查询1个云主机类型；参数“-id”支持指定ID查询，类型为string。控制台以json格式输出创建结果。参考执行实例如下：python3 flavor_manager.py get -id 100000（4）支持删除指定ID的云主机类型。位置参数“delete”，表示删除一个云主机类型；参数“-id”支持指定ID查询，返回response，控制台输出response。参考执行实例如下：python3 flavor_manager.py delete -id 100001sdk_flavor.py:import json from openstack import connection conn = connection.Connection( auth_url='http://192.168.200.54:5000/v3', username="admin", project_name="admin", user_domain_name="demo", project_domain_name="demo", password='000000' ) def create_flavor(name, ram, vcpus, disk, flavorid): return json.dumps(conn.create_flavor(name=name, ram=ram, vcpus=vcpus, disk=disk, flavorid=flavorid)) def delete_flavor(id): return json.dumps(conn.delete_flavor(name_or_id=id)) def find_flavor(id): return json.dumps(conn.get_flavor_by_id(id)) def get_all_flavor(): return json.dumps(conn.list_flavors()) if __name__ == '__main__': print(get_all_flavor())flavor_manager.py:import argparse import sdk_flavor parser = argparse.ArgumentParser() parser.add_argument('command') parser.add_argument('-n') parser.add_argument('-m') parser.add_argument('-v') parser.add_argument('-d') parser.add_argument('-id') args = parser.parse_args() if args.command == 'create': print(sdk_flavor_manager.create_flavor(name=args.n, ram=args.m, vcpus=args.v, disk=args.d, flavorid=args.id)) elif args.command == 'getall': print(sdk_flavor_manager.get_all_flavor()) elif args.command == 'get': print(sdk_flavor_manager.find_flavor(args.id)) elif args.command == 'delete': print(sdk_flavor_manager.delete_flavor(args.id))
Python运维开发：基于Openstack Python SDK实现云主机创建
Python运维开发：基于Openstack Python SDK实现云主机创建[1分]使用已建好的OpenStack Python运维开发环境，在/root目录下创建sdk_server_manager.py脚本，使用python-openstacksdk Python模块，完成云主机的创建和查询。创建之前查询是否存在“同名云主机”，如果存在先删除该镜像。（1）创建1台云主机：云主机信息如下：云主机名称如下：server001镜像文件：cirros-0.3.4-x86_64-disk.img云主机类型：m1.tiny网络等必要信息自己补充。（2）查询云主机：查询云主机server001的详细信息，并以json格式文本输出到控制台。完成后提交OpenStack Python运维开发环境 Controller节点的IP地址，用户名和密码提交。import openstack conn = openstack.connect(cloud='openstack') conn.delete_server('server001') resp = conn.create_server(name='server001', image='cirros001', flavor='m1.tiny', network='net') print(conn.wait_for_server(resp))
Python运维开发：基于OpenStack Restful API实现镜像上传
Python运维开发：基于OpenStack Restful API实现镜像上传[1分]使用OpenStack all-in-one镜像，创建OpenStack Python运维开发环境。云主机的用户/密码为：“root/Abc@1234”，OpenStack的域名/账号/密码为：“demo/admin/000000”。提示说明：python脚本文件头建议加入“#encoding:utf-8”避免编码错误；测试脚本代码用python3命令执行与测试。在controller节点的/root目录下创建api_image_manager.py脚本，编写python代码对接OpenStack API，完成镜像的创建与上传。创建之前查询是否存在“同名镜像”，如果存在先删除该镜像。（1）创建镜像：要求在OpenStack私有云平台中上传镜像cirros-0.3.4-x86_64-disk.img，名字为cirros001，disk_format为qcow2，container_format为bare。（2）查询镜像：查询cirros001的详细信息，并以json格式文本输出到控制台。完成后提交OpenStack Python运维开发环境Controller节点的IP地址，用户名和密码提交。import requests # token建议api方式获取 token = 'gAAAAABlAu0wSauTOn5ueaCFD7B4g7oMdo5zDxKiPhgzibdSsetUUpgaMNxZZHZzxD_MDVu96HXcdesCFM2X1oXtExB217pxocN2fRFRXLq3XyB2UrhFYVWkdg2TefBeGc-HKdEdFbfTvuK0wo04VtdQ6SSILwycAitKxNZvkAaabHv2V1u4VI4' head = { 'Content-Type': 'application/json', 'X-Auth-Token': token} resp = requests.get('http://controller:9292/v2/images', headers=head) print(resp.text) print('IMAGES LIST') for im_name in resp.json()['images']: if im_name['name'] == 'cirros001': resp = requests.delete(f'http://controller:9292/v2/images/{im_name["id"]}', headers=head) print(resp.text) print('DELETE IMAGES') resp = requests.post('http://controller:9292/v2/images', json={ "container_format": "bare", "disk_format": "qcow2", "name": "cirros001", }, headers=head) print(resp.text) print('CREATE IMAGES') image_id = resp.json()['id'] print(image_id) head['Content-Type'] = 'application/octet-stream' with open('cirros-0.3.4-x86_64-disk.img','rb') as f: resp = requests.put(f'http://controller:9292/v2/images/{image_id}/file', headers=head, data=f.read()) print(resp.text) resp = requests.get(f'http://controller:9292/v2/images/{image_id}', headers=head) print(resp.text)
Python运维开发：Service资源Restful APIs HTTP服务封装
Python运维开发：Service资源Restful APIs HTTP服务封装[4分]编写Python程序实现Service资源管理程序，将Service资源管理的封装成Web服务。在/root目录下创建service_server.py程序，实现Service的增删查改等Web访问操作。http.server的host为localhost，端口8888；程序内部实现Kubernetes认证。提示说明：Python标准库http.server模块，提供了HTTP Server请求封装。需要实现的Restful API接口如下：GET /services/{name}，查询指定名称{name}的Service；Response的Body以json格式输出。POST /services/{yamlfilename} 创建yaml文件名称为{yamlfilename}的Service；Response的Body以json格式，（手工将文件服务器主目录所有*.yaml文件下载到root目录下）。DELETE /services/{name}；删除指定名称的Service；Response的Body以json格式。编码完成后，自己手动执行提供Web HTTP服务的service_server.py程序，提交答案进行检测。import yaml from kubernetes import client, config from http.server import HTTPServer, BaseHTTPRequestHandler import kubernetes.client.exceptions # bearer config.load_kube_config(config_file='kube_config') conn_core = client.CoreV1Api() class webclass(BaseHTTPRequestHandler): def __set_headers(self, content_type): self.send_response(200) self.send_header("Content-Type", content_type) self.end_headers() def do_GET(self): self.__set_headers("application/json") name = self.path[10:] print(name, self.path) try: res = conn_core.read_namespaced_service(name, 'default') except kubernetes.client.exceptions.ApiException as e: self.wfile.write(str(e.body).encode(encoding="utf_8")) else: self.wfile.write(str(res).encode(encoding="utf_8")) def do_POST(self): self.__set_headers("application/json") name = self.path[10:] print(name, self.path) with open(name, encoding='utf-8') as f: dep = yaml.safe_load(f.read()) service_name = dep['metadata']['name'] try: conn_core.delete_namespaced_service(service_name, 'default') except: pass res = conn_core.create_namespaced_service('default', dep) self.wfile.write(str(res).encode(encoding="utf_8")) def do_DELETE(self): name = self.path[10:] self.__set_headers("application/json") try: res = conn_core.delete_namespaced_service(name, 'default') except kubernetes.client.exceptions.ApiException as e: self.wfile.write(str(e.body).encode(encoding="utf_8")) else: self.wfile.write(str(res).encode(encoding="utf_8")) if __name__ == '__main__': address = ("0.0.0.0", 8888) httpd = HTTPServer(address, webclass) httpd.serve_forever()