首页 文章 精选 留言 我的

精选列表

搜索[openstack],共3159篇文章
优秀的个人博客,低调大师

Openstack Paste.ini 文件详解

目录 目录 pasteini 配置文件详解 composite pipeline filter app DEFAULT server Request 被 pasteini 处理的流程 如何加载 pasteini 配置文件 factory 工厂函数 paste.ini 配置文件详解 paste.ini 文件的格式类似于INI格式,每个 Section 的格式均为 [type:name]。 这里重要的是理解几种不同 type 的 Section 的作用: composite [composite:main] use = egg:Paste#urlmap /v2.0 = public_api /v3 = api_v3 / = public_version_api [composite:admin] use = egg:Paste#urlmap /v2.0 = admin_api /v3 = api_v3 / = admin_version_api composite section:Request 进来后第一个通过的 Section,表示需要将一个 HTTP URL Request 调度到一个或者多种 Application 上。 paste.ini 中有两种类型的 [composite:main|admin]。Request 会通过哪一个 composite 由请求 URL 的端口或者 name 参数来决定,下面会有介绍。 use:是一个关键字,指定处理请求的代码,这里表示我们使用 Paste egg包中 urlmap 来实现 composite 请求分发方式。 ==> 决定请求的分发方式为 urlmap(urlmap 算是一个通用的请求分发程序) /v2.0 /v3 /:是 urlmap 进行分发时,需要使用到的参数。 URL为 /v3 开头的请求会路由给 pipeline api_v3 处理(也可以直接是一个 app section) egg 是 python 的一个包 pipeline [pipeline:api_v3] # The last item in this pipeline must be service_v3 or an equivalent # application. It cannot be a filter. pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension_v3 s3_extension simple_cert_extension revoke_extension federation_extension oauth1_extension endpoint_filter_extension service_v3 pipeline section : 指定的 section 有如下要求: 1.最后一个名字对应的 section 一定要是一个 app 类型。 2.非最后一个名字对应的 section 一定要是一个 filter 类型。 filter [filter:sizelimit] paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory filter section: 是一个实现了过滤器功能的中间件(将 Application 进行进一步的封装),用于过滤 Request 和 Response。 程序员可以通过添加 filter 来增加对 Request 和 Response 进行操作的功能。EG. 我在实现一个 application 之前需要对 Request 进行身份验证,那么就让这个 Request 通过提供身份验证功能的 filter 即可。 paste.filter_factory 表示调用哪个函数来获得这个 filter 中间件。sizelimit是 [pipeline:api_v3] 指定的第一个 filter ,作用是限制请求的大小。 app [app:service_v3] paste.app_factory = keystone.service:v3_app_factory app: 一个 app 就是一个实现主要功能的具体的 application 。所以 app 必须是 Callable Object 类型,接受的参数(environ,start_response),这是WSGI Server交给Application的符合WSGI规范的参数。 Application 需要完成的任务是响应 envrion 中的请求,准备好响应头 headers 和消息体 body,然后交给 start_response 处理,返回响应消息体。 [pipeline:api_v3] 的最后一个元素,必须是一个 app section 。 paste.app_factory :表示调用哪个函数来获得 application keystone.service:v3_app_factory 指定处理请求和响应的 application paste.app_factory = keystone.service:v3_app_factory这一种方式,将一个 app 指向了一段 python 代码。此方式下,必须执行 app 协议:以 app_factory 表示,后面的值为需要 import 的东西,在这个例子中需要 import keystone.service ,并从中取得了 v3_app_factory 的实例。 app_factory 是一个 callable object,其接受的参数是一些关于 application 的配置信息,EG. (global_conf,**kwargs): global_conf 是在 ini 文件中 default section 中定义的一系列 key-value 对 **kwargs 则是一些本地配置,是在 ini 文件中,app section 中定义的一系列 key-value 对。app_factory 返回值是一个 application 对象。这个对象是的 WSGI Server 和 WSGI Application 可以进行交互,即可以传递 Request 和 Response 的数据。 DEFAULT [DEFAULT] admin_email = webmaster@example.com [app:main] use = ... set admin_email = jmilkfan@example.com 全局配置主要是用于多个 app 共用一些变量,可以被覆盖,需要在 app 中重新定义。 server [server:main]: 定义WSGI的一个server。 Request 被 paste.ini 处理的流程 WSGI Server(Web Server) 接受到 URL_Path 形式的 HTTP Request 时,这些 Request 首先会被 Paste 模块按照配置文件 paste.ini 进行处理。 处理的过程为: 1. composite(将Request将URL_Path的前缀(/v2.0 /v3 /)和一个Application(app/filter)进行映射。然后将Request转发到pipeline或app中,最终会到达指定的 Application) 2. ==> pipeline(包含了filter和app) 3. ==> filter(调用Middleware对Request进行过滤) 4. ==> app(具体的Application来实现Request的操作) 。 这个过程就是将 Application 和 Middleware 串起来的过程,不一定要按照顺序执行,只要能到达 Application 即可。 EXAMPLE: Keystone Request URL 为 http://homename:35357/v3/auth/tokens Step1. (hostname:35357): 这一部分由 Web Server 来获取并处理的(EG.虚拟机功能)。 Step2. (/v3/auth/tokens): 根据 paste.ini 中的配置来对剩下的 URL(/v3/auth/tokens)部分进行处理。首先请求的 Post=35357 决定了会经过 [composite:admin] section 。(一般是admin监听35357端口,main监听5000端口;也可以由 application = wsgi_server.initialize_application(name) 中 name 参数来决定) Step3. (/v3): composite section 会根据 /v3 这个 URL 前缀来决定将 Request 路由到哪一个 pipeline secion,这里就把请求转发给 [pipeline:api_v3] 处理,转发之前,会把 /v3 这个部分的 URL 去掉。 Step4. (/auth/tokens) : [pipeline:api_v3] 收到请求,URL_Path是 (/auth/tokens),然后开始调用各个 filter(中间件) 来处理请求。最后会把请求交给 [app:service_v3] 进行处理。 Step5. (/auth/tokens): [app:service_v3] 收到请求,URL_Path是 (/auth/tokens),最后交由的 WSGI Application:keystone.service:v3_app_factory 去处理。 注意:剩下的URL后缀 /auth/tokens 则交由另一个模块 Routers 来处理,这个以后再介绍。 如何加载 paste.ini 配置文件? 使用 Paste.Deploy 模块, Paste Deploy是一种机制,通过核心函数 loadapp() 函数和一个 paste.ini 配置文件或者 Paste egg 包来载入 WSGI Application。 #keystone/httpd/keystone.py import os from keystone.server import wsgi as wsgi_server name = os.path.basename(__file__) # NOTE(ldbragst): 'application' is required in this context by WSGI spec. application = wsgi_server.initialize_application(name) # Web Server 只能通过 application 可调用对象来与 Application 进行交互 #keystone/keystone/server/wsgi.py def initialize_application(name): def loadapp(): return keystone_service.loadapp( 'config:%s' % config.find_paste_config(), name) ... _unused, application = common.setup_backends( startup_application_fn=loadapp) ... return application #返回一个可调用的 application 对象 config.find_paste_config() 用来查找并加载需要用到的 Paste 配置文件,这个文件在源码中的路径是 keystone/etc/keystone-paste.ini 文件。 name 参数,是用来确定 WSGI Application 的入口 paste.ini 配置文件是用来确定使用哪一个 application keystone_service.loadapp() 函数内部调用了 paste.deploy.loadapp() 函数通过 name 参数来加载 WSGI Application,至于加载哪一个具体实现功能的 application 对象则由 Paste 模块的配置文件 keystone-paste.ini 来决定。 factory 工厂函数 用于 factory 工厂函数的协议有: *paste.app_factory *paste.composite_factory *paste.filter_factory *paste.server_factory 所有的这些 factory 都是含有__call__方法的函数、方法或类。 EXAMPLE 1: paste.app_factory def app_factory(global_config, **local_conf): return wsgi_app global_config : 是一个字典 local_conf : 则是关键字参数,返回一个 wsgi_app EXAMPLE 2: paste.composite_factory def composite_factory(loader, global_config, **local_conf): return wsgi_app loader : 是一个对象,拥有get_app(name_or_uri, global_conf=None) 根据 name 返回一个 application;get_filter() 和 get_server()也是如此。 EXAMPLE 3:paste.pipeline_factory def pipeline_factory(loader, global_config, pipeline): # space-separated list of filter and app names: pipeline = pipeline.split() filters = [loader.get_filter(n) for n in pipeline[:-1]] app = loader.get_app(pipeline[-1]) filters.reverse() # apply in reverse order! for filter in filters: app = filter(app) return app EXAMPLE 4:paste.filter_factory 这个 filter 会检查 CGI 中 REMOTE_USER 变量是否存在,并创建一个简单的认证 filter 过滤器。 def auth_filter_factory(global_conf, req_usernames): # space-separated list of usernames: req_usernames = req_usernames.split() def filter(app): return AuthFilter(app, req_usernames) return filter class AuthFilter(object): def __init__(self, app, req_usernames): self.app = app self.req_usernames = req_usernames def __call__(self, environ, start_response): if environ.get('REMOTE_USER') in self.req_usernames: return self.app(environ, start_response) start_response('403 Forbidden', [('Content-type', 'text/html')]) return ['You are forbidden to view this resource'] fliter 的工厂函数和 app 的工厂函数类似,除了它返回的是一个 filter。fliter 是一个把 application 作为唯一参数的 Callable 对象,返回一个被过滤了的 application。

优秀的个人博客,低调大师

openstack之nova启动实例过程

概述: 启动一个实例包含以下步骤: API server:处理用户请求并转发至cloud controller cloud controller:处理计算节点、网络控制、api server 以及scheduler的通信 scheduler:选择节点启动实例 Compute worker:管理实例,启动/关闭实例,挂载/卸载卷 Network controller:管理网络资源,分配浮动ip、配置vlan 启动实例的流程类似于这样: API服务从用户收到一个run_instances的命令,API服务转发这个命令给云控制器(1),在这里执行认证以确保该用户有相应的权限.去控制器把这条信息发给调度(2). 调度将这条信息扔给一个随机的主机(计算节点)让他启动一个新的实例(3).这台主机上的计算服务抓到这条信息(4).计算服务需要一个fixed IP来启动一个新实例,所以她发了一条信息给网络控制器(5,6,7,8).计算服务继续创建这个实例.下面我们将深入这些步骤的细节中去

优秀的个人博客,低调大师

openstack 镜像自动扩容 resize拉伸

The simplest way to support this in your image is to install the cloud-utils package (contains the growpart tool for extending partitions), the cloud-initramfs-growroot package (which supports resizing root partition on the first boot), and the cloud-init package into your image. With these installed, the image performs the root partition resize on boot. For example, in the /etc/rc.local file. These packages are in the Ubuntu and Debian package repository, as well as the EPEL repository (for Fedora/RHEL/CentOS/Scientific Linux guests). If you cannot install cloud-initramfs-tools, Robert Plestenjak has a github project called linux-rootfs-resize that contains scripts that update a ramdisk by using growpart so that the image resizes properly on boot. If you can install the cloud-utils and cloud-init packages, we recommend that when you create your images, you create a single ext3 or ext4 partition (not managed by LVM).

优秀的个人博客,低调大师

openstack 指定创建 vm IP 地址

当前使用 vlan 网络架构 默认状态下创建 VM 利用 DHCP 进行 IP 地址分配 由于某些原因需要指定某些 VM 的 IP 地址, 那么可以参考下面方法执行操作 先获得 TENANT, NETWORK 信息, 然后创建对应的 PORT, PORT 可以指定使用某个 IP 地址, 之后在创建 VM 时候指定对应的 PORT就可以 获得 tenant id [root@sh-zabbix-129023 ~(keystone_DEV)]# keystone tenant-list | grep DEV | 00f77483830d48e5aafba5880f5c437d | DEV | True | 获得 network 信息 [root@sh-zabbix-129023 ~(keystone_DEV)]# neutron net-list | grep DEV | 9106aee4-2dc0-4a6d-a789-10c53e2b88c1 | SH_DEV_NET | a42781d8-07fd-4744-8409-0b1b40750a71 10.198.192.0/18 | 创建新的 port [root@sh-zabbix-129023 ~(keystone_DEV)]# neutron port-create --tenant-id 00f77483830d48e5aafba5880f5c437d --fixed-ip subnet_id=a42781d8-07fd-4744-8409-0b1b40750a71,ip_address=10.198.193.94 9106aee4-2dc0-4a6d-a789-10c53e2b88c1 Created a new port: +---------------------+--------------------------------------------------------------------------------------+ | Field | Value | +---------------------+--------------------------------------------------------------------------------------+ | admin_state_up | True | | binding:host_id | | | binding:profile | {} | | binding:vif_details | {} | | binding:vif_type | unbound | | binding:vnic_type | normal | | device_id | | | device_owner | | | fixed_ips | {"subnet_id": "a42781d8-07fd-4744-8409-0b1b40750a71", "ip_address": "10.198.193.94"} | | id | c71cf80c-d26c-4337-bad1-e7ac419613b1 | | mac_address | fa:16:3e:f2:eb:ef | | name | | | network_id | 9106aee4-2dc0-4a6d-a789-10c53e2b88c1 | | status | DOWN | | tenant_id | 00f77483830d48e5aafba5880f5c437d | +---------------------+--------------------------------------------------------------------------------------+ 创建vm 时指定对应的port 方法 [root@sh-zabbix-129023 ~(keystone_DEV)]# nova boot --flavor b2c_allinone --image Centos7_Generic_1503 --security_group default --nic port-id=c71cf80c-d26c-4337-bad1-e7ac419613b1 violalu-sh-qa-web-e5jhn.sh.vclound.com +--------------------------------------+-------------------------------------------------------------+ | Property | Value | +--------------------------------------+-------------------------------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-AZ:availability_zone | nova | | OS-EXT-SRV-ATTR:host | - | | OS-EXT-SRV-ATTR:hypervisor_hostname | - | | OS-EXT-SRV-ATTR:instance_name | instance-00001cb5 | | OS-EXT-STS:power_state | 0 | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | - | | OS-SRV-USG:terminated_at | - | | accessIPv4 | | | accessIPv6 | | | adminPass | iTvPvkXhp84v | | config_drive | | | created | 2015-08-17T07:52:19Z | | flavor | b2c_allinone (3) | | hostId | | | id | 8cf12579-85ee-41f4-ab9f-55a608c5640b | | image | Centos7_Generic_1503 (8de228c7-3913-4fff-8e70-dd3ec05446a7) | | key_name | - | | metadata | {} | | name | violalu-sh-qa-web-e5jhn.sh.vclound.com | | os-extended-volumes:volumes_attached | [] | | progress | 0 | | security_groups | default | | status | BUILD | | tenant_id | 00f77483830d48e5aafba5880f5c437d | | updated | 2015-08-17T07:52:19Z | | user_id | 62b3813eb92e415b85816722e9479636 | +--------------------------------------+-------------------------------------------------------------+ 查询实例详细信息 [root@sh-zabbix-129023 ~(keystone_DEV)]# nova show 8cf12579-85ee-41f4-ab9f-55a608c5640b +--------------------------------------+-------------------------------------------------------------+ | Property | Value | +--------------------------------------+-------------------------------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-AZ:availability_zone | nova | | OS-EXT-SRV-ATTR:host | sh-compute-129070.sh.vclound.com | | OS-EXT-SRV-ATTR:hypervisor_hostname | sh-compute-129070.sh.vclound.com | | OS-EXT-SRV-ATTR:instance_name | instance-00001cb5 | | OS-EXT-STS:power_state | 0 | | OS-EXT-STS:task_state | spawning | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | - | | OS-SRV-USG:terminated_at | - | | SH_DEV_NET network | 10.198.193.94 | | accessIPv4 | | | accessIPv6 | | | config_drive | | | created | 2015-08-17T07:52:19Z | | flavor | b2c_allinone (3) | | hostId | 2f4f8c8676263bdf2c6a575d27d4156768c495f51f895cea35ba7792 | | id | 8cf12579-85ee-41f4-ab9f-55a608c5640b | | image | Centos7_Generic_1503 (8de228c7-3913-4fff-8e70-dd3ec05446a7) | | key_name | - | | metadata | {} | | name | violalu-sh-qa-web-e5jhn.sh.vclound.com | | os-extended-volumes:volumes_attached | [] | | progress | 0 | | security_groups | default | | status | BUILD | | tenant_id | 00f77483830d48e5aafba5880f5c437d | | updated | 2015-08-17T07:52:16Z | | user_id | 62b3813eb92e415b85816722e9479636 | +--------------------------------------+-------------------------------------------------------------+ 测试网络 [root@sh-zabbix-129023 ~(keystone_DEV)]# ping 10.198.193.94 PING 10.198.193.94 (10.198.193.94) 56(84) bytes of data. 64 bytes from 10.198.193.94: icmp_seq=1 ttl=61 time=0.841 ms --- 10.198.193.94 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.841/0.841/0.841/0.000 ms [root@sh-zabbix-129023 ~(keystone_DEV)]# ssh 10.198.193.94 The authenticity of host '10.198.193.94 (10.198.193.94)' can't be established. ECDSA key fingerprint is c5:8c:19:d9:85:31:63:7c:04:b3:dd:20:aa:66:81:7b. Are you sure you want to continue connecting (yes/no)? 网络连接成功, 主机创建成功 

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册