从 PyPI 安装和配置 Placement

本节描述了如何使用来自 PyPI 的软件包安装和配置 placement 服务。Placement 支持 Python 2.7 版本,但建议使用 3.6 或更高版本。

本文档假定您拥有可用的 MySQL 服务器和可用的 Python 环境,包括 pip 包安装程序。根据您的环境,您可能希望在 virtualenv 中安装 placement。

本文档描述了如何使用 uwsgi 作为其 Web 服务器来运行 placement。这只是托管服务的众多不同方式之一。Placement 是一个行为良好的 WSGI 应用程序,因此使用任何 WSGI 服务器进行托管都应该很简单。

如果在 OpenStack 环境中使用 placement,您需要在启动使用它的服务之前,但在它使用的服务之后,确保它已启动并正在运行。这意味着在 Keystone 之后,但在其他任何服务之前。

先决条件

在安装服务之前,您需要创建数据库、服务凭证和 API 端点,如以下部分所述。

pip

PyPI 安装 pip

注意

本文档中的示例使用 pip 命令。根据您的安装和 Python 版本,这可能需要使用不同的路径或拼写(例如 pip3)。

python-openstackclient

如果尚未安装,请安装 openstack 命令行工具

# pip install python-openstackclient

创建数据库

Placement 主要使用 MySQL/MariaDB 进行测试,因此此处描述的是使用 MySQL/MariaDB 的方法。它也适用于 PostgreSQL,并且可能适用于 sqlalchemy 支持的许多其他数据库。

要创建数据库,请完成以下步骤

  1. 使用数据库访问客户端以 root 用户身份或根据需要使用 sudo 连接到数据库服务器

    # mysql
    
  2. 创建 placement 数据库

    MariaDB [(none)]> CREATE DATABASE placement;
    
  3. 授予数据库的适当访问权限

    MariaDB [(none)]> GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' \
      IDENTIFIED BY 'PLACEMENT_DBPASS';
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' \
      IDENTIFIED BY 'PLACEMENT_DBPASS';
    

    PLACEMENT_DBPASS 替换为合适的密码。

  4. 退出数据库访问客户端。

配置用户和端点

注意

如果您不使用 Keystone,可以跳过以下步骤,但需要将 api.auth_strategy 设置配置为 noauth2。另请参阅 快速 Placement 开发

注意

您需要以 admin 身份向 Keystone 进行身份验证,然后才能进行这些调用。根据您的系统设置方式,有很多不同的方法可以做到这一点。如果您没有 admin-openrc 文件,您将拥有类似的文件。

重要提示

这些文档将 http://controller:8778/ 作为端点 URL 的示例。您应该配置 placement 以使用最适合您环境的主机名和端口。建议在默认端口上使用 SSL,并使用特定于域或路径的 placement。例如:https://mygreatcloud.com/placementhttps://placement.mygreatcloud.com/

  1. 激活 admin 凭证以访问仅管理员可用的 CLI 命令

    $ . admin-openrc
    
  2. 使用您选择的 PLACEMENT_PASS 创建 Placement 服务用户

    $ openstack user create --domain default --password-prompt placement
    
    User Password:
    Repeat User Password:
    +---------------------+----------------------------------+
    | Field               | Value                            |
    +---------------------+----------------------------------+
    | domain_id           | default                          |
    | enabled             | True                             |
    | id                  | fa742015a6494a949f67629884fc7ec8 |
    | name                | placement                        |
    | options             | {}                               |
    | password_expires_at | None                             |
    +---------------------+----------------------------------+
    
  3. 将 Placement 用户添加到具有 admin 角色的服务项目

    $ openstack role add --project service --user placement admin
    

    注意

    此命令不会产生任何输出。

  4. 在服务目录中创建 Placement API 条目

    $ openstack service create --name placement \
      --description "Placement API" placement
    
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | Placement API                    |
    | enabled     | True                             |
    | id          | 2d1a27022e6e4185b86adac4444c495f |
    | name        | placement                        |
    | type        | placement                        |
    +-------------+----------------------------------+
    
  5. 创建 Placement API 服务端点

    注意

    根据您的环境,端点的 URL 将因端口(可能为 8780 而不是 8778,或者根本没有端口)和主机名而异。您有责任确定正确的 URL。

    $ openstack endpoint create --region RegionOne \
      placement public http://controller:8778
    
    +--------------+----------------------------------+
    | Field        | Value                            |
    +--------------+----------------------------------+
    | enabled      | True                             |
    | id           | 2b1b2637908b4137a9c2e0470487cbc0 |
    | interface    | public                           |
    | region       | RegionOne                        |
    | region_id    | RegionOne                        |
    | service_id   | 2d1a27022e6e4185b86adac4444c495f |
    | service_name | placement                        |
    | service_type | placement                        |
    | url          | http://controller:8778           |
    +--------------+----------------------------------+
    
    $ openstack endpoint create --region RegionOne \
      placement internal http://controller:8778
    
    +--------------+----------------------------------+
    | Field        | Value                            |
    +--------------+----------------------------------+
    | enabled      | True                             |
    | id           | 02bcda9a150a4bd7993ff4879df971ab |
    | interface    | internal                         |
    | region       | RegionOne                        |
    | region_id    | RegionOne                        |
    | service_id   | 2d1a27022e6e4185b86adac4444c495f |
    | service_name | placement                        |
    | service_type | placement                        |
    | url          | http://controller:8778           |
    +--------------+----------------------------------+
    
    $ openstack endpoint create --region RegionOne \
      placement admin http://controller:8778
    
    +--------------+----------------------------------+
    | Field        | Value                            |
    +--------------+----------------------------------+
    | enabled      | True                             |
    | id           | 3d71177b9e0f406f98cbff198d74b182 |
    | interface    | admin                            |
    | region       | RegionOne                        |
    | region_id    | RegionOne                        |
    | service_id   | 2d1a27022e6e4185b86adac4444c495f |
    | service_name | placement                        |
    | service_type | placement                        |
    | url          | http://controller:8778           |
    +--------------+----------------------------------+
    

安装和配置组件

placement 配置文件默认位置为 /etc/placement/placement.conf。可以通过在环境中设置 OS_PLACEMENT_CONFIG_DIR 来选择不同的目录。也可以使用部分或不使用配置文件来运行服务,并在 环境中设置一些选项。有关此处未提及的其他配置设置,请参阅 配置指南

注意

在以下步骤中,controller 用作 keystone、mysql 和 placement 正在运行的主机的主机名的占位符。这些可能不同。用于 auth_urlwww_authenticate_uri 的 keystone 主机应该是 Identity 服务的非版本化公共端点。

  1. 安装 placement 和所需的数据库库

    # pip install openstack-placement pymysql
    
  2. 创建 /etc/placement/placement.conf 文件并完成以下操作

    • 创建一个 [placement_database] 部分并配置数据库访问

      [placement_database]
      connection = mysql+pymysql://placement:PLACEMENT_DBPASS@controller/placement
      

      PLACEMENT_DBPASS 替换为您为 placement 数据库选择的密码。

    • 创建 [api][keystone_authtoken] 部分,配置 Identity 服务访问

      [api]
      auth_strategy = keystone  # use noauth2 if not using keystone
      
      [keystone_authtoken]
      www_authenticate_uri = http://controller:5000/
      auth_url = http://controller:5000/
      memcached_servers = controller:11211
      auth_type = password
      project_domain_name = Default
      user_domain_name = Default
      project_name = service
      username = placement
      password = PLACEMENT_PASS
      

      PLACEMENT_PASS 替换为您为 Identity 服务中的 placement 用户选择的密码。

      注意

      user_namepasswordproject_domain_nameuser_domain_name 的值需要与您的 keystone 配置同步。

    • 您可能希望将 debug 选项设置为 True 以生成更详细的日志输出。

  3. 填充 placement 数据库

    $ placement-manage db sync
    

    注意

    另一种方法是使用 placement_database.sync_on_startup 选项。

完成安装

现在 placement 本身已安装,我们需要在 Web 服务器中启动该服务。以下提供了一个非常基本的 Web 服务器,虽然相对高效,但并未设置为易于管理。由于有许多 Web 服务器和许多管理它们的方法,因此这些内容超出了本文档的范围。

安装并运行 Web 服务器

  1. 安装 uwsgi 包(这些说明针对版本 2.0.18)

    # pip install uwsgi
    
  2. 在终端窗口中,使用 placement WSGI 应用程序运行服务器

    警告

    确保您使用的是正确的 uwsgi 二进制文件。它可能在您的路径中的多个位置。错误的版本将失败并抱怨无效的参数。

    # uwsgi -M --http :8778 --wsgi-file /usr/local/bin/placement-api \
            --processes 2 --threads 10
    
  3. 在另一个终端中,使用 curl 确认服务器正在运行。URL 应与 配置用户和端点 中设置的公共端点匹配。

    $ curl http://controller:8778/
    

    输出将如下所示

    {
       "versions" : [
          {
             "id" : "v1.0",
             "max_version" : "1.31",
             "links" : [
                {
                   "href" : "",
                   "rel" : "self"
                }
             ],
             "min_version" : "1.0",
             "status" : "CURRENT"
          }
       ]
    }
    

    可以使用 osc-placement 与系统进行进一步交互。