配置 OpenStack SDK 应用程序¶
环境变量¶
openstacksdk 遵循所有正常的 OS_* 环境变量。它不提供向后兼容性,不支持特定服务的变量,例如 NOVA_USERNAME。
如果您已经设置了 OpenStack 环境变量,openstacksdk 将生成一个名为 envvars 的云配置对象,其中包含来自环境变量的值。如果您不喜欢名称 envvars,没关系,可以通过设置 OS_CLOUD_NAME 来覆盖它。
特定服务设置,例如 nova 服务类型,使用默认服务类型作为前缀进行设置。例如,要为 trove 设置特殊的服务类型,请设置
export OS_DATABASE_SERVICE_TYPE=rax:database
配置文件¶
openstacksdk 将在以下位置查找名为 clouds.yaml 的文件
.(当前目录)$HOME/.config/openstack/etc/openstack
找到的第一个文件获胜。
您还可以设置环境变量 OS_CLIENT_CONFIG_FILE 为文件的绝对路径,以便查找,该位置将被插入到文件搜索列表的前面。
键是您期望从 OS_* 获得的所有键 - 除了小写且没有 OS 前缀。因此,区域名称使用 region_name 设置。
特定服务设置,例如 nova 服务类型,使用默认服务类型作为前缀进行设置。例如,要为 trove 设置特殊的服务类型(因为您使用的是 Rackspace),请设置
database_service_type: 'rax:database'
特定站点文件位置¶
除了 ~/.config/openstack 和 /etc/openstack 之外 - 某些平台还有其他他们喜欢放置文件的位置。openstacksdk 还会查找一个特定于操作系统的配置目录
USER_CONFIG_DIR
SITE_CONFIG_DIR
USER_CONFIG_DIR 在 Linux、OSX 和 Windows 上有所不同。
Linux: ~/.config/openstack
OSX: ~/Library/Application Support/openstack
Windows: C:\Users\USERNAME\AppData\Local\OpenStack\openstack
SITE_CONFIG_DIR 在 Linux、OSX 和 Windows 上有所不同。
Linux: /etc/openstack
OSX: /Library/Application Support/openstack
Windows: C:\ProgramData\OpenStack\openstack
一个示例配置文件可能有所帮助
clouds:
mtvexx:
profile: https://vexxhost.com
auth:
username: mordred@inaugust.com
password: XXXXXXXXX
project_name: mordred@inaugust.com
region_name: ca-ymq-1
dns_api_version: 1
mordred:
region_name: RegionOne
auth:
username: 'mordred'
password: XXXXXXX
project_name: 'shade'
auth_url: 'https://montytaylor-sjc.openstack.blueboxgrid.com:5001/v2.0'
infra:
profile: rackspace
auth:
username: openstackci
password: XXXXXXXX
project_id: 610275
regions:
- DFW
- ORD
- IAD
您可能会注意到一些事情。首先,由于 auth_url 设置很荒谬且令人尴尬,因此包含已知的云供应商配置文件信息,并且可以通过名称或指向该云的基本 URL 进行引用。其中一个好处是 auth_url 不是供应商默认值包含的唯一内容。例如,由于 Rackspace 将 rax:database 列为 trove 的服务类型,openstacksdk 知道这一点,因此您不必手动设置。如果云供应商配置文件不可用,您可以提供一个名为 clouds-public.yaml 的文件,遵循先前提到的配置文件位置规则。
regions 可以是区域列表。当您调用 get_all_clouds 时,您将获得每个云/区域组合的云配置对象。
如 dns_service_type 所示,任何有意义的可以按服务设置的设置,例如 service_type 或 endpoint 或 api_version 都可以通过使用默认服务类型作为前缀来设置。这在设置 service_type 时可能会让您觉得很奇怪 - 但这就是我们所处的世界。
身份验证设置¶
Keystone 有身份验证插件 - 这意味着无法提前知道需要哪些身份验证设置。openstacksdk 将默认插件类型设置为 password,这是在出现插件之前的情况。为了便于验证值,由于所选插件产生的所有参数都需要进入 auth 字典。对于密码身份验证,这包括 auth_url、username 和 password 以及与域、项目和信任相关的所有内容。
API 设置¶
以下设置传递给 keystoneauth 并且所有服务都通用。
api_timeoutAPI 请求的超时时间。这应该是一个数值,表示秒数或秒数的一部分,或者 0 表示没有超时时间。(可选,默认为 0)
collect_timing是否为每个 API 调用收集每方法计时信息。(可选,默认为 False)
拆分密钥¶
在某些情况下,例如受配置管理控制的环境中,将密钥放在一个文件中,而非密钥放在另一个文件中可能更容易。这完全通过可选文件 secure.yaml 支持,该文件遵循与 clouds.yaml 相同的定位规则。它可以包含您放在 clouds.yaml 中的任何内容,并且将优先于 clouds.yaml 文件中的任何内容。
# clouds.yaml
clouds:
internap:
profile: internap
auth:
username: api-55f9a00fb2619
project_name: inap-17037
regions:
- ams01
- nyj01
# secure.yaml
clouds:
internap:
auth:
password: XXXXXXXXXXXXXXXXX
SSL 设置¶
当通过安全连接访问云时,openstacksdk 默认情况下始终会验证 SSL 证书。可以通过将 verify 设置为 False 来禁用此操作。如果证书由未知 CA 签名,可以通过 cacert 提供特定的 CA 证书。 警告: verify 始终优先于 cacert,因此在设置 CA 证书但禁用 verify 时,云证书将永远不会被验证。
客户端证书也可以配置。cert 将是客户端证书文件的位置。如果密钥未包含在客户端证书文件中,则需要通过 key 设置其文件位置。
# clouds.yaml
clouds:
regular-secure-cloud:
auth:
auth_url: https://signed.cert.domain:5000
...
unknown-ca-with-client-cert-secure-cloud:
auth:
auth_url: https://unknown.ca.but.secure.domain:5000
...
key: /home/myhome/client-cert.key
cert: /home/myhome/client-cert.crt
cacert: /home/myhome/ca.crt
self-signed-insecure-cloud:
auth:
auth_url: https://self.signed.cert.domain:5000
...
verify: False
为了与 openstack 命令行选项保持一致,insecure 布尔值也被识别(具有与 verify 相反的语义;即 True 忽略证书错误)。这应被视为已弃用 verify。
缓存设置¶
在版本 1.0.0 中更改: 以前,缓存完全由云层管理。从 openstacksdk 1.0.0 开始,缓存移动到代理层。由于云层依赖于 1.0.0 中的代理层,这意味着两个层都可以从缓存中受益。
对云进行身份验证和访问资源通常很昂贵。因此,应用程序通常希望在客户端缓存凭据和云资源。为了便于此,openstacksdk 支持使用系统密钥环和 dogpile.cache 缓存凭据和资源。
提示
重要的是要强调,openstacksdk 本身并不缓存任何内容。相反,它收集并呈现缓存信息,以便连接到 OpenStack 的各种应用程序可以共享缓存(如果您需要)。重要的是要根据应用程序的需求正确配置缓存后端。
缓存是全局启用或禁用,而不是按云逐个启用或禁用。这是通过配置``cache``顶级键来完成的。可以配置身份验证令牌的缓存方式如下
cache.auth一个布尔值,指示是否应在密钥环中缓存令牌。启用后,这将允许随后的连接到同一云跳过获取新令牌。当令牌过期或失效时,openstacksdk 将自动建立新连接。默认为
false。
例如,要配置身份验证令牌的缓存。
cache:
auth: true
可以使用以下设置配置资源的缓存
cache.expiration_time缓存条目的过期时间(秒)。这应该是一个整数。默认为
0。cache.class要使用的缓存后端,可以包括 dogpile.cache 本身支持的任何后端以及由第三方软件包提供的后端。这应该是一个字符串。默认为
dogpile.cache.memory。cache.arguments要传递给缓存后端的任意参数的映射。这些是后端特定的。键应对应于配置的缓存后端的配置选项。默认为
{}。cache.expirations将资源类型映射到过期时间的映射。键应以与发出指标的方式相同的方式指定,通过使用
.连接有意义的资源 URL 段。例如,/servers和/servers/ID都应指定为servers,而/servers/ID/metadata/KEY应指定为 server.metadata。值应该是秒数的过期时间。值为-1表示缓存永远不会过期,值为0禁用资源的缓存。默认为{}
例如,要使用 1 小时过期时间配置 dogpile.cache.memory 后端进行缓存。
cache:
expiration_time: 3600
要使用 1 小时过期时间配置 dogpile.cache.memory 后端,但仅针对对 OpenStack Compute 服务 /servers API 的请求
cache:
expirations:
servers: 3600
要使用 1 小时过期时间配置 dogpile.cache.pylibmc 后端和在您的本地主机上运行的 memcached 服务器。
cache:
expiration_time: 3600
arguments:
url:
- 127.0.0.1
要使用 1 小时过期时间配置 dogpile.cache.pylibmc 后端、在您的本地主机上运行的 memcached 服务器以及多个每资源缓存过期时间。
cache:
class: dogpile.cache.pylibmc
expiration_time: 3600
arguments:
url:
- 127.0.0.1
expiration:
server: 5
flavor: -1
compute.servers: 5
compute.flavors: -1
image.images: 5
最后,如果未定义 cache 键,则启用空缓存,这意味着实际上禁用了缓存。
注意
非 GET 请求会导致基于缓存密钥前缀的缓存失效。这意味着,例如,对 /images/ID 的 PUT 请求将使所有图像缓存失效(列表和所有单个条目)。此外,可以通过将 skip_cache 参数传递给 proxy._get 函数来绕过缓存并使现有缓存失效。这在 wait_for_status 方法中自动发生,因为预计资源会随着时间的推移而更改一些属性。可以通过调用 conn._cache.invalidate 来强制完全缓存失效
MFA 支持¶
MFA 支持需要一个专门配置的文件。在这种情况下,使用了两种不同的身份验证插件的组合,以及它们对指定参数的各个要求。
clouds:
mfa:
auth_type: "v3multifactor"
auth_methods:
- v3password
- v3totp
auth:
auth_url: https://identity.cloud.com
username: user
user_id: uid
password: XXXXXXXXX
project_name: project
user_domain_name: udn
project_domain_name: pdn
IPv6¶
IPv6 是未来,如果您的云支持它并且您的本地网络支持它,您应该始终使用它。这两个都可以轻松检测到,并且所有友好的软件都应该做正确的事情。
但是,有时云 API 可能会返回对生产部署无用的 IPv6 信息。例如,API 可能会为服务器提供 IPv6 地址,但不会通过元数据(configdrive)或标准的 IPv6 自动配置方法(即主机需要进行定制的 API 调用,或者以其他方式静态配置自身)将其提供给主机实例。
对于这种情况,您可以设置 force_ipv4 或 OS_FORCE_IPV4 布尔环境变量。例如
clouds:
mtvexx:
profile: vexxhost
auth:
username: mordred@inaugust.com
password: XXXXXXXXX
project_name: mordred@inaugust.com
region_name: ca-ymq-1
dns_api_version: 1
monty:
profile: fooprovider
force_ipv4: true
auth:
username: mordred@inaugust.com
password: XXXXXXXXX
project_name: mordred@inaugust.com
region_name: RegionFoo
上面的代码片段将告诉客户端程序优先使用 IPv4 地址,并使 public_v6 字段 fooprovider 云的为空。您也可以使用客户端标志为所有云设置此选项
client:
force_ipv4: true
按区域设置¶
有时,您有一个云提供商,其配置对云是通用的,但也有一些您可能希望按区域表达的内容。例如,Internap 为每个区域的用户提供特定的公共和专用网络,将这些值放入配置可以使消耗程序更有效。
为了支持这一点,区域列表实际上可以是字典列表,并且可以覆盖云级别可以设置的任何设置,以用于该区域。
clouds:
internap:
profile: internap
auth:
password: XXXXXXXXXXXXXXXXX
username: api-55f9a00fb2619
project_name: inap-17037
regions:
- name: ams01
values:
networks:
- name: inap-17037-WAN1654
routes_externally: true
- name: inap-17037-LAN6745
- name: nyj01
values:
networks:
- name: inap-17037-WAN1654
routes_externally: true
- name: inap-17037-LAN6745
设置优先级¶
某些设置是冗余的,例如 project-name 和 project-id 都指定项目。在冗余设置之间发生冲突时,将使用 clouds.yaml 选项(或等效的 -name CLI 选项和 _NAME 环境变量)。
某些环境变量或命令行标志可以覆盖 clouds.yaml 中的设置。这些是
--domain-id(OS_DOMAIN_ID)--domain-name(OS_DOMAIN_NAME)--user-domain-id(OS_USER_DOMAIN_ID)--user-domain-name(OS_USER_DOMAIN_NAME)--project-domain-id(OS_PROJECT_DOMAIN_ID)--project-domain-name(OS_PROJECT_DOMAIN_NAME)--auth-token(OS_AUTH_TOKEN)--project-id(OS_PROJECT_ID)--project-name(OS_PROJECT_NAME)--tenant-id(OS_TENANT_ID) (已弃用,推荐使用--project-id)--tenant-name(OS_TENANT_NAME) (已弃用,推荐使用--project-name)
同样,如果上述设置之一在 clouds.yaml 的 auth 部分以及主部分中都指定了,则 auth 设置将被覆盖。例如,在此配置部分中,请注意项目被多次指定
clouds:
mtvexx:
profile: https://vexxhost.com
auth:
username: mordred@inaugust.com
password: XXXXXXXXX
project_name: mylessfavoriteproject
project_id: 0bedab75-898c-4521-a038-0b4b71c41bed
region_name: ca-ymq-1
project_name: myfavoriteproject
project_id: 2acf9403-25e8-479e-a3c6-d67540c424a4
在上面的示例中,project_id 配置值将被忽略,而选择 project_name 配置值,并且更高一级的项目将被选择,而不是 auth 中指定的项目。因此,实际使用的项目将是 `myfavoriteproject`。
示例¶
auth¶
基于密码的身份验证(项目范围)
example:
auth:
auth_url: http://example.com/identity
password: password
project_domain_id: default
project_name: admin
user_domain_id: default
username: admin
region_name: RegionOne
基于密码的身份验证(域范围)
example:
auth:
auth_url: http://example.com/identity
domain_id: default
password: password
username: admin
region_name: RegionOne
基于密码的身份验证(信任范围)
example-trust:
auth:
auth_url: http://example.com/identity
password: password
username: admin
trust_id: 95946f9eef864fdc993079d8fe3e5747
region_name: RegionOne
基于密码的身份验证(系统范围)
example-system:
auth:
auth_url: http://example.com/identity
password: password
system_scope: all
username: admin
region_name: RegionOne
基于应用程序凭证的身份验证
example-appcred:
auth:
auth_url: http://example.com/identity
application_credential_id: 9da0a8da3d394d09bf49dfc27014d254
application_credential_secret: pKfDSvUOFwO2t2_XxCajAFhzCKAVHI7yfqPb6xjshVDnMUHF7ifju8gMdhHTI4Eo56UP_hEc8ssmgA1NNtKMpA
auth_type: v3applicationcredential
region_name: RegionOne
基于令牌的身份验证
example-token:
auth:
auth_url: http://example.com/identity
token: gAAAAABl32ptw2PN6L9JyBeO16PwQU1SrdMUvUz8Eon7LC2PFItdGRWFpOkK0qwH3JkukTuEM5qbYK9ucowRXET1RBMjZlfVpUa8Nz3qjQdzXw7pBKH4w1e4tekvDCOKfn15ZoujBOvdGqgtpW-febVGaW9oJzf6R3WTMDxWz3YRJjmiOBpwcN8
project_id: 1fd93a4455c74d2ea94b929fc5f0e488
auth_type: v3token
region_name: RegionOne
注意
这是一个示例:从定义上讲,令牌的有效期很短。您不太可能将它们存储在 clouds.yaml 文件中。相反,您可能会通过命令行 (--os-token) 或环境变量 (OS_TOKEN) 传递 TOTP 令牌。
基于 TOTP 的身份验证
example-totp:
auth:
auth_url: http://example.com/identity
passcode: password
project_domain_id: default
project_name: admin
user_domain_id: default
username: admin
auth_type: v3totp
region_name: RegionOne
注意
这是一个示例:从定义上讲,TOTP 令牌的有效期很短。您不太可能将它们存储在 clouds.yaml 文件中。相反,您可能会通过命令行 (--os-passcode) 或环境变量 (OS_PASSCODE) 传递 TOTP 令牌。
基于 OAuth1 的身份验证
example-oauth:
auth:
auth_url: http://example.com/identity
consumer_key: foo
consumer_secret: secret
access_key: bar
access_secret: secret
auth_type: v3oauth1
region_name: RegionOne