配置 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_typeendpointapi_version 都可以通过使用默认服务类型作为前缀来设置。这在设置 service_type 时可能会让您觉得很奇怪 - 但这就是我们所处的世界。

身份验证设置

Keystone 有身份验证插件 - 这意味着无法提前知道需要哪些身份验证设置。openstacksdk 将默认插件类型设置为 password,这是在出现插件之前的情况。为了便于验证值,由于所选插件产生的所有参数都需要进入 auth 字典。对于密码身份验证,这包括 auth_urlusernamepassword 以及与域、项目和信任相关的所有内容。

API 设置

以下设置传递给 keystoneauth 并且所有服务都通用。

api_timeout

API 请求的超时时间。这应该是一个数值,表示秒数或秒数的一部分,或者 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/IDPUT 请求将使所有图像缓存失效(列表和所有单个条目)。此外,可以通过将 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_ipv4OS_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-nameproject-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.yamlauth 部分以及主部分中都指定了,则 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