跳转到: 导航, 搜索

Trove/dev-env

Trove API 和 Redstack 开发环境设置在 Mac OS X 上

简介

本文档描述了如何将本地运行的 Trove 实例指向 VM 或云实例中的 Devstack/Redstack 部署。您应该能够调试和测试您的更改,而无需进行部署。

先决条件

安装 VMWare Fusion 和 Trove 服务

openstack=== VM ===

  1. 为了在本地 VM 中运行 trove/redstack,您需要首先安装一个带有 Ubuntu 12.04 server 的客户机。从 Ubuntu 的网站 (http://www.ubuntu.com/download/server) 下载一个镜像文件,并在您首选的虚拟化解决方案 (VMWare fusion, VirtualBox, Parallels 等) 中从它创建一个新的客户机。
    1. 推荐版本 ubuntu-12.04.1-server-amd64.iso
    2. 推荐 RAM 大小为 2GB,但如果需要,也可以使用 1GB
    3. 似乎不需要特殊的网络设置才能从主机访问客户机,默认设置就可以正常工作
      1. 注意! 似乎 guest-agent 会在 "$ sudo pip install extras" 时失败,以下应该在 redstack 客户机上运行
        $ sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
    4. 似乎不需要 VMWare 工具。它们不能解决复制/粘贴问题(或者使终端操作更容易……),我们建议使用 ssh 代替。详情如下。
    5. 为了获得更好的性能,请确保转到 VM 设置 -> 处理器和内存 -> 高级选项,并选中“在此虚拟机中启用超visor 应用程序”(有关更多信息,请参见此页的底部:https://github.com/openstack/trove-integration
    6. 安装 Redstack 的完整描述在这里:https://github.com/openstack/trove-integration/blob/master/README.md 但我们建议您遵循此路径
      1. 当您设置 ubuntu 客户机时,可以使用 'ubuntu' 用户创建它,或者添加它
        $ adduser ubuntu
        $ visudo
        1. 将此行添加到 root 用户下方的文件
          $ ubuntu  ALL=(ALL:ALL) ALL
          **OR use this if you dont want to type your password to sudo a command**
          $ ubuntu  ALL=(ALL:NOPASSWD) ALL
        2. Linux 系统可能会缓存 sudo 凭据,使其看起来 sudo 正在没有密码的情况下运行,即使 /etc/sudoers 文件中存在错误。使用以下命令验证 sudo 是否在没有密码的情况下运行:
          sudo -k ls
      2. 在客户机上安装 ssh 服务器
        $ sudo apt-get install ssh (or openssh)
      3. 现在,您可以运行 ifconfig 在客户机上获取其 IP。使用它从您的 mac ssh (作为 ubuntu) 到它,并从那里继续工作,这更容易……
      4. 获取 git
        $ apt-get update
        $ apt-get install git-core -y
      5. 这是一个拍摄此客户机快照的好时机
      6. 克隆此仓库
        $ git clone https://github.com/openstack/trove-integration.git
      7. 进入 scripts 目录
        $ cd trove-integration/scripts/
        1. 安装所有依赖项,然后通过 devstack 安装 trove(这将启动 trove (rd-api rd-tmgr) 并初始化 trove 数据库)
          $ ./redstack install
          如果您需要在 redstack 脚本过早终止后重新启动它,您可能会遇到一个由于 setuptools 包太旧而导致的错误;在这种情况下,使用以下命令更新 setuptools:
          wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | sudo python
      8. 由于 Redstack 最近合并到 Devstack,我不确定此时系统的确切状态,因为屏幕会话已经显示 trove-api 和 trove-taskmanager 在两个屏幕中正在运行。无论如何,您可以“初始化”trove 通过
        1. 运行此命令,它封装了几个调用
          $ ./redstack kick-start mysql
        2. 或者手动运行这些步骤
          $ ./redstack test-init (used to be "initialize"?)
          $ ./redstack build-image mysql (or "percona")
          $ ./redstack start
      9. 有关更多信息和用法,请参见此处:https://github.com/openstack/trove-integration/blob/master/README.md
    7. 过去 precise 存在卡住的问题。我们不确定这是否仍然存在,但如果您遇到此类问题,请检查此处描述的解决方法
      1. 在 VMWare Fusion 上安装 Ubuntu Precise https://wiki.openstack.org/vmware-fusion-precise (只需使用默认设置)

本地开发

这里的核心思想是,trove-api 和/或 trove-taskmanager 在您的 mac 上本地运行(在控制台中或通过您的 IDE,以便您可以实际调试代码),但使用安装在您的 redstack 节点上的 keystone/nova/swift/rabbit-mq/mysql 进行工作(如上所述)。

  1. 首先,获取代码
    $ git clone https://github.com/openstack/trove.git
  2. 您需要安装 mysql 客户端。如果您还没有安装,请使用 homebrew 安装它(否则运行 $ sudo pip install mysql-python 将会失败)
    1. 安装 homebrew https://github.com/mxcl/homebrew/wiki/Installation
    2. 然后安装 mysql
      $ brew install mysql
  3. 您将使用一个专用的 python 虚拟环境。设置并“激活”它,如下所示:
    $ trove/tools/install_venv.py
    $ source trove/.venv/bin/activate
  4. 在新环境中,安装 python-swiftclient 和 mysql-python
    $ sudo pip install python-swiftclient
    $ sudo pip install mysql-python
  5. 由于 openssl 和 cms 的一些问题(默认情况下在 mac 上无法正常工作),您必须应用此修复:
    1. http://www.openssl.org/source/ 下载 openssl tar 包
      1. openssl-1.0.1e.tar.gz 似乎可以正常工作:http://www.openssl.org/source/openssl-1.0.1e.tar.gz
    2. 解压缩它 ($ tar xvzf filename) 并按照这里的说明操作
      1. 在 Mac OS X 上安装启用 cms 的 openssl http://stackoverflow.com/questions/9275786/updating-openssl-version-on-osx
        1. 基本上,运行
          sudo ./Configure --prefix=/usr/ darwin64-x86_64-cc enable-cms
          $ sudo make
          $ sudo make test
          $ sudo make install
    3. 或者,您可以运行
      brew install openssl
      然后备份并替换
      sudo cp /usr/bin/openssl /usr/bin/openssl_old; sudo cp /usr/local/Cellar/openssl/1.0.1e/bin/openssl /usr/bin/openssl; sudo chown root:wheel /usr/bin/openssl; sudo chmod 755 /usr/bin/openssl
  6. 根据您到目前为止所做的事情,您可能需要“清理”您的环境。如果您遇到 keystone 问题(身份验证),请尝试以下操作:
    1. 删除 /tmp/keystone-signing-nova 下的所有 .pem 文件
    2. 删除 /tmp/keystone-signing-trove 下的所有 .pem 文件
    3. 您可能还需要删除 ~/.apitoken

配置本地 trove 文件

为了让您的本地进程(api 和 taskmanager)在您的 redstack 上找到所需的资源,您必须修改 conifg 文件。建议您创建 trove/etc/trove/trove.conf.sample 和 trove/etc/trove/trove-taskmanager.conf.sample 的副本,修改它们,并在运行 api 和 taskmanager 服务时指向这些副本(如下所述)。您还需要修改 api-paste.ini,但由于它当前被硬编码引用,因此您必须直接修改此文件并小心不要签入它;-)

  • 更新 api-paste.ini 中的字段
 /trove/etc/trove/api-paste.ini
 #Auth host will be IP of your restack guest
 auth_host = 127.0.0.1 
 #Tenant name, admin user, and admin password can be retrieved by running  nova credentials on your redstack guest
 admin_tenant_name = %SERVICE_TENANT_NAME% 
 admin_user = %SERVICE_USER%
 admin_password = %SERVICE_PASSWORD%
  • 更新 trove.conf.sample 和 trove-taskmanager.conf.sample 中的主机条目,以指向 Devstack/Redstack 主机(即 nova_compute_url、nova_volume_url、notifier_queue_hostname)
# No need to change the bind_host (i think ...)
sql_connection = mysql://root:e1a2c042c828d3566d0a@localhost/trove - replace localhost with the redstack ip
swift_url = https://:8080/v1/AUTH_ - replace localhost with the redstack ip
trove_auth_url = http://0.0.0.0:5000/v2.0 - replace the 0.0.0.0 with the redstack ip
nova_compute_url = https://:8774/v2 - replace localhost with the redstack ip
nova_volume_url = https://:8776/v1 - replace localhost with the redstack ip
notifier_queue_hostname = localhost - replace localhost with the redstack ip
rabbit_host = localhost - replace localhost with the redstack ip. add this one if it's not there
pydev_debug = enabled - this will enable debugging
  • 如果您将要本地运行此程序,请更新 trove-guestagent.conf.sample。

进入虚拟机

我们准备的磁盘镜像设置的开发环境,为本地开发添加了您的 ssh 密钥。它使用您现有的密钥,因此您应该能够

  • ssh IP (ssh 10.0.0.2,如果 10.0.0.2 是 ip)

进入 VM 后,首先要查看的是 trove 代码库是否已部署

  • ls ~/trove

如果它在 VM 中,则初始启动步骤成功。如果不是,您可能忘记运行 iptables MASQUERADE 命令。下一步是查看客户机是否正在运行

  • ps aux|grep guest

如果是,很好,让我们检查日志

  • less /tmp/logfile.txt

这将告诉您出了什么问题,或者它是否仍在安装阶段

如果客户机没有上线,则可能还有其他问题。我建议使用您的 init 守护程序 (upstart...) 重新启动客户机。如果这不起作用,请尝试手动启动客户机(init 守护程序脚本中的行)。

在本地运行 trove 服务

Trove 脚本当前期望从项目根文件夹运行。配置您的 IDE 以执行此操作,并确保使用 .venv 作为解释器

  1. $ bin/trove-api --config-file=etc/trove/trove.conf.sample (web 服务)
    1. 注意!如果您创建了配置文件副本,请确保指向您的副本!
  2. $ bin/trove-taskmanager --config-file=etc/trove/trove-taskmanager.conf.sample (任务管理器)
    1. 注意!与上面的注意事项相同;)
  3. $ bin/trove-guestagent --config-file=etc/trove/trove-guestagent.conf.sample (guest agent)
    1. 注意!与上面的注意事项相同;)
  4. 为了在本地机器上使用 trove-client 而无需每次调用都指定这些变量,请设置以下环境变量
 export OS_AUTH_URL="http://REDSTACK_GUEST_IP:5000/v2.0/"
 # Run keystone endpoint-list to get region name
 export OS_REGION_NAME=<region name> 
 # Run nova credentials to get username, password, tenant name, and tenant ID
 export OS_USERNAME=<user name>
 export OS_PASSWORD= <password>
 export OS_TENANT_NAME=<password>
 export OS_TENANT_ID=<password>

您现在可以使用 curl、Chrome 的高级 Rest Cliet 或 trove-cli(命令行实用程序 - 通过安装 python-troveclient 获取)访问您的本地 api 服务器。要开始使用,首先获取身份验证令牌。出于某种原因,我无法使用 Chrome 的 rest 客户端执行此操作,但您可以使用以下两种方法:

  1. $ curl -d "{\"auth\":{\"passwordCredentials\":{\"username\": \"radmin\", \"password\": \"radmin\"},\"tenantName\":\"trove\"}}" -H "Content-type: application/json" http://IP_OF_REDSTACK_GUEST:35357/v2.0/tokens
    1. 注意,您使用 redstack ip,因为您的 keystone 就在那里运行
  2. $ trove --username=radmin --apikey=radmin --tenant=trove --os-auth_url=http://IP_OF_REDSTACK_GUEST:5000/v2.0/ --bypass-url=https://:8779/v1.0/YOUR_TENANT_ID
    1. 您可以通过在 redstack 客户机上运行以下命令来获取您的 tenant_id
      $ nova credentials
    2. 注意使用 --bypass-url

请记住,您的 api 和 taskmanager 也在 redstack 节点上运行。因此,请记住只运行一个 - 您在本地启动的程序需要在 redstack 节点上停止。ssh 进入它,运行 screen -x stack,转到相关的屏幕(ctrl a 后跟 ctrl " - 将显示屏幕列表,您可以选择您需要的屏幕)并按 ctrl c 停止它们。然后,您可以再次通过按向上箭头键和 enter 重新启动它们。

调试 RabbitMQ

api 服务器通过 Rabbit 与任务管理器通信,并且“知道”来自 trove.conf.sample(或您的本地副本,如果已重命名)的任务管理器队列:taskmanager_queue = taskmanager 当任务管理器在调试下运行时,它实际上会在名为 pydevd.py 的队列上创建/侦听 - 如果您在调试下运行任务管理器,请确保更新您的 conf 文件。另外,请注意,即使您将 api 服务器保留在 redstack 节点上,您仍然需要更新此 conf 文件,它应该在 /etc/trove/trove.conf 下

RabbitMQ 有一个不错的管理插件,带有 Web GUI 控制台。要使用它,请执行以下操作:

  • 在 Redstack 节点(运行 Rabbit 的节点)上运行
    $ sudo /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management
    $ sudo service rabbitmq-server restart
  • 现在可以通过端口 55672 访问它
  • 默认用户为:“guest”,密码来自 redstack.rc
    • RABBIT_PASSWORD=f7999d1955c5014aa32c
  • 有关此控制台的更多信息:https://rabbitmq.cn/management.html

访问数据库

为了访问 redstack 客户机上的 admin DB,您可以

  • 运行
    $ mysql -u root -p"ADMIN_PASS"
    mysql> show databases; (to see the databases)
    mysql> use trove; (to start using the trove DB)
    mysql> show tables; (to see the list of tables)
    • 现在运行任何您想要的查询
    • admin 密码来自 redstack.rc
      • MYSQL_PASSWORD=e1a2c042c828d3566d0a
  • 或者,您可以在您的 mac 上设置一个基于 GUI 的本地客户端,例如 SequelPro,并指向您的 redstack ip

笔记

  • 如果服务未在项目根目录中运行,trove/extensions 将不会加载。
  • 如果您正在开发 guest agent 代码,您可能仍然需要将文件复制到 VM Devstack/Redstack