逸逸肆云
type: channel
link: https://www.o7n.cn/
items: 2025-2026学年广东省职业院校学生专业技能大赛云计算应用赛项题目
items: cloudflare worker中new Date().getTime()返回0的解决办法
items: 《逻辑思维与写作》课程学习笔记
items: 0penStack 资源管理的客户端程序开发
items: 华为公有云运维开发—— 基于FastAPI框架封装华为云VPC服务Restful APIs接口
items: Python运维开发：用户管理的命令行工具开发
items: Python运维开发：云主机类型管理的命令行工具开发
items: Python运维开发：基于Openstack Python SDK实现云主机创建
items: Python运维开发：基于OpenStack Restful API实现镜像上传
items: Python运维开发：Service资源Restful APIs HTTP服务封装

2025-2026学年广东省职业院校学生专业技能大赛云计算应用赛项题目
type: item
date: 2026-03-16T14:57:00+00:00
description: 收集自网络等公开渠道，如有雷同纯属巧合。仅为个人学习使用，如有侵权请联系下架。【实操题】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…

cloudflare worker中new Date().getTime()返回0的解决办法
type: item
date: 2024-07-22T03:46:36+00:00
description: 在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" } }); }, };这样就能的到正确的效果了。

《逻辑思维与写作》课程学习笔记
type: item
date: 2023-10-19T16:27:00+00:00
description: 逻辑思维与写作导论逻辑逻辑是思维的形式规则，是思维的语法。思维和性格，不自觉的会表现在逻辑之中。思维的形式结构古希腊——形式逻辑古印度——三支论式中国——墨家的以”矛盾统一“为逻辑起点的辩证体系写作文章千古事，得失寸心知。文学作品的分类偶成赋得逻辑与写作的关系综合性写作的基础就是逻辑。文章中的逻辑文章体裁的概念文章内容的概念文章材料的选取文章讲述、推理的方法和章节、段落的逻辑推演关系议论文论证命题的两种方式议论文是对命题的证明。直接展示命题，运用各种逻辑方法加以证明陈述相关材料、事实，让读者根据材料和事实得出作者希望的命题结果归纳证明的两点注意是否有反例现象和命题是否具有因果关系第一章 概述逻辑学的历史起源独立起源古代中国——名辩之学古代印度——因明之学古代希腊——逻辑学由于古希腊逻辑学最为系统，因而在逻辑学发展史上影响最大、最深。古代中国逻辑学发源地之一。中国古代的逻辑思想先秦名辩学说惠施公孙龙墨子《墨经》荀子《正名篇》韩菲梁启超：《墨经》殆世界最古名学书之一。梁启超：论理学为一切学问之母。以后无论做何种学问，总不要抛弃论理精神。那么，真的知识，自然日日加深了。1917年胡适的《先秦名学史》对中国逻辑学史进行系统梳理。胡适：近代中国哲学与科学的发展曾极大地受害于没有适当的逻辑方法。《墨经》思想以名举定，以辞抒意，以说出故。所谓"名”，相当于概念;所谓"辞“，相当于命题;所谓“说”，相当于推理。公孙龙”白马非马“说求马，黄、黑马皆可致;求白马，黄、黑马不可致。故曰，白马非马。黄马(黑马)是马。白马不是黄马(黑马)。所以，白马不是马。公孙龙著名逻辑论断"狗非犬"”孤驹未尝有母”“火不热”“矩不方，规不可以为圆”“飞鸟之影未尝动也“世界三大传统逻辑体系中国名辩学体系欧洲形式逻辑印度因明逻辑古代印度古代印度的逻辑学正理论——婆罗门因明学——佛教因明是佛家逻辑的通称。因明学"因”指推理的依据;“明”即知识、智慧;“因明”就是古代印度关于推理、论证的学说。古代印度逻辑著作《因明正理门论》陈那《因明入正理论》商羯罗主三支论——陈那每一个推理形式都是由"宗”"因” "喻” 这三部分组成的。“宗”相当于三段论的结论;“因”相当于三段论的小前提;"喻"相当于三段论的大前提。三支论宗：此山有火因：此山有烟喻：(固喻)凡有烟的地方皆有火，如厨房;(异喻)凡无烟的地方都无火，如湖泊。由于古代中国和古代印度逻辑学都有所中断，又因古代推崇“融会贯通”的思想，没有将逻辑学作为一门独立的学科分离出来系统化，因此非常遗憾无缘与逻辑学的诞生地之美称。古代希腊言必称希腊，言必称亚氏。古希腊哲学家亚里士多德亚里士多德《工具论》一部划时代的逻辑著作。德谟克里特德谟克里特(约公元前460-前370年)研究概念的定义以及类比、假设、归纳等逻辑问题。苏格拉底苏格拉底(约公元前469-前399年)研究演绎和归纳的意义。柏拉图柏拉图(约公元前427-前347年)研究划分以及判断的逻辑形式。亚里士多德的《工具论》是一部划时代的逻辑著作。古希腊学者亚里士多德是传统逻辑的奠基人，被后世尊称为“逻辑学之父”。亚里士多德创立的逻辑被称为形式逻辑。斯多噶学派假言命题、选言命题、联言命题以及由它们所组成的推理形式。并且提出了 不同类型的推理规则和逻辑公式，这是传统形式逻辑的一个重大发展。斯多噶学派的“命题逻辑”著作《逻辑大全》对一些逻辑问题进行了新的探讨，发展了斯多噶学派的命题逻辑;研究了语义悖论及其解决方法等。演绎逻辑和归纳逻辑由于科学发展水平的限制，亚里士多德及其后继者创立的逻辑学呈现出”重演绎、轻归纳“的特点，因此被后世称为演绎主义者。逻辑学早期呈现出”重演绎、轻归纳“的特点。演绎逻辑可以在正确的前提下得出正确的结论。是人都会死，苏格拉底是人，所以，苏格拉底会死。正确的前提使用归纳逻辑不一定得到正确的结论。德谟克里特会思维，苏格拉底会思维，柏拉图会思维，，德谟克里特、苏格拉底、柏拉图是人，是人就会思维。英国哲学家弗朗西斯·培根奠定了归纳逻辑的基础。弗朗西斯·培根著《新工具》“知识就是力量”——《新工具》17世纪开始逻辑学的特点转变为”重归纳、轻演绎“《波尔 - 罗亚尔逻辑》法国 A.阿尔诺 和 P.尼柯尔 著从《波尔 - 罗亚尔逻辑》出版开始，演绎、归纳和一般逻辑方法融为一体，使传统逻辑研究范式有了一个雏形。英国哲学家约翰·穆勒《逻辑体系：归纳和演绎》（《穆勒名学》）约翰·穆勒继承和发展了培根的归纳逻辑。《逻辑体系：归纳和演绎》系统地阐述了寻求现象间因果联系的五种方法，即契合法、差异法、契合差异并用法、共变法和剩余法，逻辑史上通称为"穆勒五法"。弗里德里希·恩格斯：归纳和演绎，正如分析和综合一样是必然联系着的。不应当牺牲一个而把另一个捧到天上，应当把每个都用到该用的地方。课后思考为什么…

0penStack 资源管理的客户端程序开发
type: item
date: 2023-10-19T01:56:00+00:00
description: 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('-…

华为公有云运维开发—— 基于FastAPI框架封装华为云VPC服务Restful APIs接口
type: item
date: 2023-10-19T01:43:09+00:00
description: 使用已建好的运维开发环境，可用区为华北-北京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(reque…

Python运维开发：用户管理的命令行工具开发
type: item
date: 2023-10-19T01:41:05+00:00
description: 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) prin…

Python运维开发：云主机类型管理的命令行工具开发
type: item
date: 2023-10-19T01:39:39+00:00
description: 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': …

Python运维开发：基于Openstack Python SDK实现云主机创建
type: item
date: 2023-10-19T01:37:14+00:00
description: 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实现镜像上传
type: item
date: 2023-10-19T01:35:55+00:00
description: 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服务封装
type: item
date: 2023-10-19T01:34:29+00:00
description: 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(…