分享

DevStack剖析(二)DevStack配置过程简述

 LZS2851 2016-03-31

DevStack配置过程

DevStack一致致力于通过最少的配置完成最多的功能。因为各个项目加入了新的特性,新的项目加入,还有不同的组合需要测试,选项的数目已经飞速地膨胀了。DevStack的传统做法是从localrc文件得到所有的本地化的配置和定制信息。传递给各个项目的配置变量的数目也在增加。原有的机制 (EXTRAS_OPTS之类)需要对每个文件进行编码,已经不太适应现在的环境。

 

在2013年10月引入了一个新的配置方式(参看https://review./#/c/46768/),希望能够简化配置过程,达到下列目的:

  • 在单一的文件中包含所有非默认的本地配置
  • 与 localrc 的方式向后兼容,保证迁移过程的平滑
  • 允许对任意配置文件中的设置进行更改

local.conf

新的配置文件是local.conf,和旧的localrc文件在同一个目录。它是一个修正后的INI格式文件,引入了meta-section头来承载额外的信息。

 

新的头格式与通常的INI节的头格式相似,但是用的是双括号 ([[ ... ]]),内部的两个域之间用管道符 (|)分隔:

 

[[ | ]]

其中是stack.sh里定义的某个阶段名称(phase name),而是配置文件的文件名。文件名在stack.sh文件中已经通过eval命令操作,所以所有的环境变量的值都可用。强烈建议使用头结构中的项目配置文件变量(参考后面的NOVA_CONF示例)。如果配置文件的路径不存在就会被跳过。

 

已定义的阶段有:

  • local – 在对stackrc  执行source操作之前,从local.conf 文件中提取 localrc 
  • pre-install – 在所有的系统软件包已安装,但是还没安装任何的source repositories时执行
  • install – 在repo安装结束后立刻运行
  • post-config – 在第二层的服务已经排至完成但还没启动时运行
  • extra – 在服务已经启动,但是 extra.d 中的文件都还没有执行时运行

这个文件是严格按照顺序处理的;meta-section可以被指定多次,但是文件中任何重复的设置只有最后一个被采用。

 

[[post-config|$NOVA_CONF]]

[DEFAULT]

use_syslog = True

 

[osapi_v3]

enabled = False

一个特定的meta-section local|localrc 被用来提供默认的localrc 文件(事实上是 .localrc.auto)。这样就允许DevStack中的所有定制化设置都包含在单一的文件中。如果localrc文件存在,则使用localrc文件,来保证向后兼容性。更过的细节可以参看local.conf的内容。

[[local|localrc]]

FIXED_RANGE=10.254.1.0/24

ADMIN_PASSWORD=speciale

LOGFILE=$DEST/logs/stack.sh.log

注意Q_PLUGIN_CONF_FILE是特别的,因为它默认为是不以/字符开头的。需要加一个/.

[[post-config|/$Q_PLUGIN_CONF_FILE]]

还要注意到localrc部分是一个shell脚本的片段来执行source命令的,所以要按照shell脚本的规则,尤其是等号两边不要留空格。

 

最小配置

 

尽管stack.sh的local.conf里面没有localrc部分也可以运行的挺好,设置几个最基本的参数会更好一些。这里给出一个最小配置的例子,包含了经常需要的一些值:

  • 不记录日志
  • 预先设好密码,省去交互式输入的操作
  • 从局域网中移走一些网段范围(FIXED_RANGE 和 FLOATING_RANGE, 在下面的例子中注释掉了)
  • 如果自动侦测不可靠,指定主机的IP地址(HOST_IP, 下例中注释掉了)

[[local|localrc]]

ADMIN_PASSWORD=secrete

DATABASE_PASSWORD=$ADMIN_PASSWORD

RABBIT_PASSWORD=$ADMIN_PASSWORD

SERVICE_PASSWORD=$ADMIN_PASSWORD

SERVICE_TOKEN=a682f596-76f3-11e3-b3b2-e716f9080d50

#FIXED_RANGE=172.31.1.0/24

#FLOATING_RANGE=192.168.20.0/25

#HOST_IP=10.3.4.5

如果这些*—PASSWORD变量没有在这里设置,那么运行stack.sh时会提示你输入。文件中网段范围必须不能和主机使用的任何网段有重叠。网段的重叠并不少见,因为RFC-1918中规定的“私有”网段在局域网中和Nova的固定与浮动地址范围中被广为使用。

 

HOST_IP通常是在stack.sh脚本第一次运行时自动检测,但是后续运行时可能因为IP从一个以太网端口被移动到主机上的一个网桥而不太确定。在这里设置HOST_IP还可以被openrc用来设置OS_AUTH_URL。 默认情况下HOST_IP没有设置。

 

常见的配置变量

安装目录Installation Directory

默认设置: ``DEST=/opt/stack``

DevStack的安装目录由DEST变量指定。

在localrc的前面部分设定后,后面的一些变量也可以引用它。即使你不改变默认值,设置这个变量可能也是有用的。

DEST=/opt/stack

Git库文件 Libraries from Git

默认设置: ``LIBS_FROM_GIT=”“``

默认情况下devstack通过git安装OpenStack服务器组件,但是通过pypi发布的版本安装客户端库文件。如果你想装一个服务器开发环境,这样是适当的。但是如果你想看看未发布的版本对系统有什么影响,可以用git从它的upstream,或是本地git树安装devstack。多个库文件可以用逗号隔开。

LIBS_FROM_GIT=python-keystoneclient,oslo.config

虚拟环境 Virtual Environments

默认设置:``USE_VENV=False``

将USE_VENV设为True可以开启使用Python虚拟环境。这样在PROJECT_VENV阵列中定义的每个项目生成venvs。

 

默认设置: ``PROJECT_VENV[‘’]=’.venv’

PROJECT_VENV阵列中的每一项包含有给这个项目的venv的目录名。阵列的索引是项目名称。如果想要的话,多个项目可以使用相同的venv。

PROJECT_VENV["glance"]=${GLANCE_DIR}.venv

默认设置: ``ADDITIONAL_VENV_PACKAGES=”“``

一个用逗号分隔的列表,指示每个venv需要安装的额外软件包。各个项目经常不在它的requirements.txt中指定那些”可选的”,只适用于特定配置的特定的软件包。默认情况下,开启的数据库会加上它的Python绑定。

 

开启日志 Enable Logging

默认配置:``LOGFILE=”” LOGDAYS=7 LOG_COLOR=True``

默认情况下stack.sh的运行结果只是在运行时显示在控制台上。可以指定LOGFILE到一个全路径的文件名,运行的结果除了在控制台上显示之外,还会写入文件中。每次运行stack.sh文件,log文件中会加入一个时间戳。

LOGFILE=$DEST/logs/stack.sh.log

如果将 LOGDAYS 设为保留的天数,旧的日志文件到期会被自动清除。

LOGDAYS=1

有些项目的日志 (Nova, Cinder, etc) 默认用颜色标记。 (如果下面没有设置 SYSLOG ); 可以通过将 LOG_COLOR 设为False关闭此特性.

LOG_COLOR=False

用日志记录服务的输出 Logging the Service Output

默认配置:``LOGDIR=”“``

DevStack会用日志记录服务启动时标准输出设备上的内容。使用screen命令时,就记录screen窗口中的内容。没有用screen时,就是将服务进程的标准输出stdout重定向到LOGDIR下的文件。

LOGDIR=$DEST/logs

注意用``DEST``变量来确定主安装目录,这是为什么我们建议在``local.conf``文件中设定DEST。

开启系统日志 Enabling Syslog

 

默认配置:``SYSLOG=False SYSLOG_HOST=$HOST_IP SYSLOG_PORT=516``

把所有服务的日志都记录到单一的系统日志文件syslog中可能会比较方便。设定SYSLOG=True来开启这一功能。如果不是本地主机来记录日志,可以通过SYSLOG_HOST和SYSLOG_PORT来指定记录日志的远程主机。

SYSLOG=True
SYSLOG_HOST=$HOST_IP
SYSLOG_PORT=516

每次都进行干净的安装 A clean install every time

默认配置:``RECLONE=”“``

默认情况下stack.sh只在项目不存在于$DEST目录下的情况下才克隆项目的repos。如果把RECLONE设为yes,那么stack.sh每次运行时都会更新所有的repo。这样就不需要手工移除repos来保证$GIT_BASE下的软件都是最新的。

RECLONE=yes

更新由pip安装的软件包 Upgrade packages installed by pip

默认配置:``PIP_UPGRADE=”“``

默认情况下stack.sh只在没有安装Python或是当前安装版本不满足特定需求时才安装Python。如果将PIP_UPGRADE设为True,那么现有的Python软件包将被升级到满足要求的最新的版本。

PIP_UPGRADE=True

Swift

默认配置:

SWIFT_HASH=”“

SWIFT_REPLICAS=1

SWIFT_DATA_DIR=$DEST/data/swift

 

Swift现在被用来做存储S3近似类型对象的后台。开启后Nova的对象存储objectstore (n-obj in ENABLED_SERVICES)就自动被关闭了。通过在ENABLED_SERVICES中加入Swift的服务来开启Swift:  enable_service s-proxy s-object s-container s-account

 

设定Swift的哈希值是需要的,如果开启了Swift后会提示你输入,所以最好设定为某一确定值:

SWIFT_HASH=66a3d6b56c1f479c8b4e70ab5c2000f5

开发环境下默认的replicas数目设为1来降低系统开销。为了更好地模拟一个生产环境设为3或更高。

SWIFT_REPLICAS=3

默认情况下Swift的数据被保存在 $DEST/swift/data,可以通过设定SWIFT_DATA_DIR来更改。指定的目录如果不存在会被生成。

SWIFT_DATA_DIR=$DEST/data/swift

注意:以前只要开启”Swift“就可以启动Swift服务了。但是提供不了良好的服务粒度,尤其是在多主机环境下,已经被考虑弃用了。有些服务的组合现在检查特定的Swift服务,旧的全部接收的模式不再能正确工作。(黄金甲注:原文the old blanket acceptance will longer work correctly. 英文好像没这么写的,怀疑will后面少了no).

 

服务目录后端 Service Catalog Backend

 

默认设置:``KEYSTONE_CATALOG_BACKEND=sql``

DevStack采用Keystone的sql服务目录后端。 也有另一个可替换的template后端。但是,它不支持keystone命令行的service-*和endpoint-*命令。要实现这些功能需要启用sql后端。

KEYSTONE_CATALOG_BACKEND=template

DevStack的默认配置是sql模式,在files/keystone_data.sh里设定。

 

Cinder

默认设置:

VOLUME_GROUP=”stack-volumes” VOLUME_NAME_PREFIX=”volume-” VOLUME_BACKING_FILE_SIZE=10250M

用来存放Cinder管理的卷的逻辑卷组由VOLUME_GROUP指定,逻辑卷的名字前缀由VOLUME_NAME_PREFIX指定,卷的后端文件大小由VOLUME_BACKING_FILE_SIZE指定。

VOLUME_GROUP="stack-volumes"
VOLUME_NAME_PREFIX="volume-"
VOLUME_BACKING_FILE_SIZE=10250M

多主机安装DevStack

默认配置:``MULTI_HOST=False``

要在多台主机上运行DevStack,需要在每台主机的local.conf文件中有一个定制的部分。主节点master和单主机安装是一样的。从节点slave开启的服务少一些,有一些关于主机的变量指向主节点。

主节点Master

MULTI_HOST=True

从节点Slave

MYSQL_HOST=w.x.y.z
RABBIT_HOST=w.x.y.z
GLANCE_HOSTPORT=w.x.y.z:9292
ENABLED_SERVICES=n-vol,n-cpu,n-net,n-api

IP版本

默认配置:IP_VERSION=4

这个设置可以用来将租户的数据网络指定为IPv4、IPv6或是同时有IPv4和IPv6,方法是把IP_VERSION设成IP_VERSION=4、IP_VERSION=6或是IP_VERSION=4+6。这个功能需要通过下列选项启动Neutron网络服务:

disable_service n-net
enable_service q-svc q-agt q-dhcp q-l3

下列的可选变量可以用来调整默认的IPv6行为:

IPV6_RA_MODE=slaac
IPV6_ADDRESS_MODE=slaac
FIXED_RANGE_V6=fd$IPV6_GLOBAL_ID::/64
IPV6_PRIVATE_NETWORK_GATEWAY=fd$IPV6_GLOBAL_ID::1

注意:``FIXED_RANGE_V6`` ``IPV6_PRIVATE_NETWORK_GATEWAY`` 可以设为任意有效的IPv6前缀。默认值使用自动生成的 ``IPV6_GLOBAL_ID``来遵守 RFC 4193.

 

示例

  • 消除Cinder pass-through (CINDER_PERIODIC_INTERVAL):

[[post-config|$CINDER_CONF]]

[DEFAULT]

periodic_interval = 60

  • 开启屏幕日志的样本 local.conf :

[[local|localrc]]

FIXED_RANGE=10.254.1.0/24

NETWORK_GATEWAY=10.254.1.1

LOGDAYS=1

LOGDIR=$DEST/logs

LOGFILE=$LOGDIR/stack.sh.log

ADMIN_PASSWORD=quiet

DATABASE_PASSWORD=$ADMIN_PASSWORD

RABBIT_PASSWORD=$ADMIN_PASSWORD

SERVICE_PASSWORD=$ADMIN_PASSWORD

SERVICE_TOKEN=a682f596-76f3-11e3-b3b2-e716f9080d50

 

 

插件

DevStack有几个插件机制用来支持方便地添加项目与特性。

 

Extras.d Hooks

这些钩子(hook)是stack.sh/unstack.sh/clean.sh中运行过程中的特定点的服务调用的扩展。很多高级别项目在DevStack中是通过这种机制实施的。

 

Extras.d中的脚本基本上是调度lib目录下的脚本中的功能。这些脚本的命名以两位数字(位数不足用0补充)为前缀,来控制调用的顺序。脚本的文件名后缀是.sh。 DevStack为它自己保留了序列数字00-09和90-99。

 

下面是一个模板,显示控制程序和可能的命令行参数:

# template.sh - DevStack extras.d dispatch script template
 
# check for service enabled
if is_service_enabled template; then
 
    if [[ "$1" == "source" ]]; then
        # Initial source of lib script
        source $TOP_DIR/lib/template
    fi
 
    if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then
        # Set up system services
        echo_summary "Configuring system services Template"
        install_package cowsay
 
    elif [[ "$1" == "stack" && "$2" == "install" ]]; then
        # Perform installation of service source
        echo_summary "Installing Template"
        install_template
 
    elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
        # Configure after the other layer 1 and 2 services have been configured
        echo_summary "Configuring Template"
        configure_template
 
    elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
        # Initialize and start the template service
        echo_summary "Initializing Template"
        ##init_template
    fi
 
    if [[ "$1" == "unstack" ]]; then
        # Shut down template services
        # no-op
        :
    fi
 
    if [[ "$1" == "clean" ]]; then
        # Remove state and transient data
        # Remember clean.sh first calls unstack.sh
        # no-op
        :
    fi
fi

可选参数有:

 

  • source 由使用extras.d 中钩子的每个脚本调用hooks; 它替代了直接对lib/*脚本执行source命令.
  • stack – 由 stack.sh在运行的不同阶段调用3次:
    • pre-install – 在操作系统设置完成,项目源project source尚未安装时调用。.
    • install – 在第一层和第二层的项目源及其依赖组件安装完成后调用。.
    • post-config – 在第一层和第二层的项目源配置后调用。所有被开启的服务的配置文件这时都应该已经存在。.
    • extra – 在接近最后,第一层和第二层的服务已经启动后调用。
  • unstack – 在其他服务被shutdown之前由 unstack.sh 调用。
  • clean – 在其他服务被清除之前,但是在unstack.sh已经调用后,由 clean.sh 调用。

外部主机存放的插件 Externally Hosted Plugins

基于extras.d钩子,DevStack支持一个标准化的机制来包含由外部软件库的插件。插件的借口要求如下:

 

一个外部的git软件库包含有devstack/最高层目录。在目录里可以有两个文件。

 

  • settings – 包含全局变量,在过程中很早的阶段会被source。如果有其他插件要依赖它,需要全局变量的话是有用的。

你的设置需要包含插件所需的enable_service 行。尤为重要时是使用run_process开始一个服务的时候,因为它只有当服务是启动的时候才能工作。

当用户需要覆盖全局变量来定制他们的环境是要小心。通常只有当一个变量是没有的或是空的时候,才给它指定一个默认值。例如用bash的语法 FOO=${FOO:-default}.

  • plugin.sh – 实际的插件。在devstack运行时被执行。运行的顺序取决于插件注册的顺序。 plugin.sh看上去像extras.d的分发器。

插件注册是通过在local.conf的localrc部分增加下列内容:

[[local|localrc]]
enable_plugin   [GITREF]
  • name – 任意名字. (例如: glustfs, docker, zaqar, congress)
  • giturl –一个可以被克隆的有效git url
  • gitref – 一个可选的需要被克隆的git ref (branch / ref / tag)。 默认指向master.

一个示例:

enable_plugin ec2api git://git./stackforge/ec2api

Plugin for gate jobs

所有希望用于gate job的OpenStack插件都必须存在于OpenStack的gerrit中。在openstack或是stackforge的命名空间里都是可以的。这样就允许测试插件,同时提供与上层git软件库错误的网络隔离(我们经常遇到这个问题)。

 

理想情况下插件会在测试的项目中被实现为devstack目录。例如,stackforge/ec2-api项目在它的目录树(tree)中有插件支持。

 

有些情况下没有所谓的”project tree“(比如说集成一个后端的存储配置,例如ceph或是glusterfs)。也可以建立一个专门的stackforge/devstack-plugin-FOO项目来存放插件。

 

注意任务必须不可以在测试中要求对软件库进行克隆。测试必须要在PROJECTS变量中列出它们的软件库repository,来让devstack-gate可用于测试。更多的信息可以从project creator的指南中获取。

 

虚拟机管理程序Hypervisor

Hypervisor插件相当新,把大部分的hypervisor的配置浓缩到一个地方。

 

最初的插件实现是为了Docker支持,是一个对所需支持的有用的模板。插件被放置到lib/nova_plugin中,命名为hypervisor-,这里name是VIRT_DRIVER的值。插件必须要定义以下功能:

  • install_nova_hypervisor – 安装所有额外所需组件
  • configure_nova_hypervisor – 更改配置,包括关于其他服务的
  • start_nova_hypervisor – 启动任何外部的服务
  • stop_nova_hypervisor – 停止任何外部的服务
  • cleanup_nova_hypervisor – 删除中间数据与缓存数据

系统软件包

DevStack提供一个框架在执行的早期阶段安装软件包。这些软件包可能在一个插件中被定义为按行分隔的一些文件。

 

在很多发行版本中支持的软件包安装工具是apt和yum。要允许一个插件钩进来并安装其所依赖的软件包,软件包要列在插件repository的最上一层的下列地方:

  • ./devstack/files/debs/$plugin_name - Ubuntu, Debian or Linux Mint.
  • ./devstack/files/rpms/$plugin_name - Red Hat, Fedora, CentOS or XenServer.
  • ./devstack/files/rpms-suse/$plugin_name - SUSE Linux or openSUSE.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多