跳转到主要内容

Nova集成以注册IPA客户端

项目描述

novajoin软件包

此Python软件包为OpenStack nova元数据服务提供动态vendordata插件,用于管理IPA服务器中的主机实例化。

它包含两个服务

  • REST服务

  • 通知监听器

REST服务将响应当前nova元数据服务器的动态请求。此功能用于将主机添加到IPA。

通知监听器将处理实例删除请求,并从IPA中删除相应的宿主机,以及浮动IP的关联和解关联请求,并更新IPA DNS。

构建

在此目录中,运行

python setup.py build

安装

在此目录中,运行

python setup.py install

软件包需求

除了Openstack通常安装的软件包之外,还需要以下软件包

python-ipalib
python-ipaclient

这些可能可以通过pip安装,但仍需要存在其他系统包,如参考文献krb5-devel,可能不兼容您的FreeIPA安装,因此最好使用系统包管理器进行安装。功能测试配置为针对RHEL/CentOS/Fedora上找到的系统包运行。

配置

有两种安装场景

  1. Triple-O 快速入门(Pike及以上版本)

这是迄今为止的主要用例。在这种情况下,heat和puppet代码管理大部分配置。甚至有一些代码可以配置一切,如果你愿意提供IPA管理员密码。

如果不这样做,你可以通过在任何可以访问您的IPA服务器的机器上运行以下内容来预先创建所需的条目。如果你愿意,可以从novajoin的git克隆中运行它,设置PYTHONPATH=/path/to/novajoin

novajoin-ipa-setup --precreate  --principal admin --password password \
    --server ipa.example.com --realm EXAMPLE.COM --domain example.com \
    --hostname undercloud.example.com

执行此脚本的机器不需要作为IPA客户端注册。

脚本的输出是你在OOOQ的yaml配置文件中的undercloud_ipa_otp下设置的OTP。

这里的想法是预先创建undercloud节点并生成OTP。OOOQ脚本知道如何注册主机,并将此OTP传递给ipa-client-install,检索novajoin服务主体的keytab,并配置和启动服务。在OOOQ中,这是通过设置enable_tls_everywhere为true和prepare_novajoin为false来完成的。

novajoin-ipa-setup会将项目名称配置为service。这可能与您的安装不匹配。根据需要进行调整。

  1. 手动设置

还可以在现有的OpenStack部署中设置novajoin(例如,我在devstack中这样做过)。

运行novajoin服务的机器需要作为IPA客户端注册。

运行novajoin-install来安装和配置预先安装的nova服务器上的插件。

nova目前需要手动配置以启用novajoin REST服务并启用在/etc/nova/nova.conf中的通知。

[api]
vendordata_providers = StaticJSON, DynamicJSON
vendordata_dynamic_targets = 'join@http://127.0.0.1:9090/v1/'
vendordata_dynamic_connect_timeout = 5
vendordata_dynamic_read_timeout = 30
vendordata_jsonfile_path = /etc/novajoin/cloud-config-novajoin.json

[notifications]
notify_on_state_change = vm_state
notification_format = unversioned

[oslo_messaging_notifications]
...
topics=notifications,novajoin_notifications

Novajoin默认启用keystone身份验证,如/etc/novajoin/join-api-paste.ini所示。因此,需要为nova设置凭证,以便其能与novajoin通信。我们可以在/etc/nova/nova.conf[vendordata_dynamic_auth]部分中设置这些凭证。

[vendordata_dynamic_auth]
#
# Options within this group control the authentication of the vendordata
# subsystem of the metadata API server (and config drive) with external
# systems.

auth_type = password
password = < service user password  >
username = < service user >
project_name = < service project >
user_domain_name = < service user domain >
project_domain_name = < service project domain >
os_region_name = < region >

在这里,可以使用nova凭证;或者创建一个仅用于此目的的用户。所以根据你的需求选择。

先决条件

需要Cloud-init 0.7.6+以在config_drive为True时检索动态元数据。0.7.9似乎与OOOQ不兼容。

您需要IPA管理员密码或可以添加权限、权限、角色并可以检索keytabs的帐户。

您需要提供Openstack凭证,以便glance元数据上传可以发生。

这将

  • 将cloud-init和注册脚本复制到/etc/novajoin

  • 获取用于在主机管理时对IPA进行身份验证的keytab

  • 调用脚本以在IPA中创建所需的权限和角色

  • 将IPA元数据添加到glance元数据服务

需要手动重新启动nova-api服务。

安装程序采用以下选项

--hostname: use this value as the FQDN of the server.
--user: user that the nova service runs as. This is needed to
        set filesystem permissions
--principal: the user used to configure IPA integration: create permissions,
             get the keytab, etc. Default is the IPA admin account.
--password: the password for the principal. If this is not set the the
            password is obtained interactively
--password-file: the file containing the password for the principal rather
                 than passing it interactively or via the command-line

元数据REST服务配置

REST服务在/etc/novajoin/join.conf的DEFAULT部分中进行配置。它提供了以下选项

  • join_listen_port: 监听的TCP端口。默认为9090。

  • api_paste_config: 要使用的paste配置文件。

  • debug: 启用额外的调试输出。默认为False。

  • auth_strategy: 要使用的身份验证策略

  • url: IPA服务器的JSON RPC URL,例如:https://ipa.host.domain/ipa/json

  • keytab: 包含用户凭据的Kerberos keytab文件。

    nova将用于管理主机。默认为/etc/krb5.keytab

  • domain: 与IPA主机关联的域。

  • connect_retries: 在失败之前尝试连接IPA服务器的次数。

  • retry_delay: 在重新尝试与IPA服务器建立连接之前等待的秒数。

  • project_subdomain: 使用实例创建所在的项目的子域名作为完全限定域名(FQDN)的子域名。例如,如果项目是admin,域是example.com,实例名称是test,则FQDN将是test.admin.example.com。

  • normalize_project: 项目名称可以包含不允许作为DNS标签的值。这将将这些无效值转换为破折号(-),并删除前导和尾随破折号。

还必须在/etc/novajoin/join.conf中配置authtoken中间件,具体配置请参见Keystone中间件文档

通知监听器配置

这里需要配置的特殊配置是配置nova将通知发送到/etc/nova/nova.conf中的novajoin主题。

[notifications]
notify_on_state_change = vm_state
notification_format = unversioned

[oslo_messaging_notifications]
...
topics = notifications,novajoin_notifications

在版本化通知的情况下,配置将有所不同。

[notifications]
notify_on_state_change = vm_state
notification_format = versioned
versioned_notifications_topics = versioned_notifications,novajoin_notifications

要启用neutron通知,在/etc/neutron/neutron.conf中

[oslo_messaging_notifications]
driver = messagingv2
topics = notifications,novajoin_notifications

如果您使用通知而没有更改主题,并且ceilometer正在运行,则通知将大致在两个服务之间以轮询方式分配。

用法

这演示了novajoin在服务安装、配置和运行后的工作方式。

命令行示例用法

$ openstack server create --flavor m1.tiny --image cirros-0.3.4-x86_64-uec test --property ipa_enroll=True
$ ssh <IP>
$ curl http://169.254.169.254/openstack/2016-10-06/vendor_data2.json
$ id admin
uid=#########(admin) gid=#########(admins) groups=#########(admins)

curl输出将包括返回字典中的“join”元素。这将包含一个主机名和ipaotp值。这些用于通过ipa-client-install进行注册。

# ipa-client-install -U -w <ipaotp> --hostname <hostname>

提供的cloud-init脚本应为您自动获取OTP并注册客户端。

此id命令确认注册成功。

日志记录

默认情况下,REST novajoin-server服务将日志记录到/var/log/novajoin/novajoin-server.log。

默认情况下,通知监听器服务novajoin-notify将日志记录到/var/log/novajoin/novajoin-notify.log。

为此提供的logrotate脚本为

/var/log/novajoin/*log {
    weekly
    rotate 14
    size 10M
    missingok
    compress
}

设计

novajoin中有很多组件,因此以下是它如何组合在一起的高级概述。

OpenStack Newton版本在nova元数据服务中添加了一种新的元数据类型:动态元数据。这是即时生成的元数据,不会存储在nova中(例如出于安全原因)。

对于使用一次性密码(OTP)将客户端注册到IPA的情况,需要在IPA主机创建时生成密码,然后以某种方式将其传递给实例。这使用动态元数据来完成。

基本事件序列如下

  1. 请求创建实例到nova,无论是通过Horizon还是命令行。

  2. nova启动实例并推送novajoin提供的cloud-init脚本。

  3. cloud-init执行提供的脚本,安装ipa-client包,然后执行一个脚本来从nova元数据服务检索元数据[*]。这看起来像:% curl http://169.254.169.254/openstack/2016-10-06/vendor_data2.json

  4. 此请求调用由novajoin包提供的novajoin动态元数据服务。这在/etc/nova/nova.conf中注册。

  5. 如果实例是用属性ipa_enroll=True创建的,或者主机镜像设置了该属性,则会在IPA中创建一个主机并生成一个OTP。OTP和生成的FQDN以Python字典的形式返回给nova。数据以JSON格式从元数据服务返回。如果glance镜像的元数据中设置了os_distro和os_version,则此信息将反映在IPA主机中。

  6. 提供给cloud-init的脚本会提取OTP和FQDN,并调用ipa-client-install

这导致了一个无需用户交互的IPA注册客户端。

novajoin-notify服务等待nova的通知,表明实例删除已完成。如果该实例或镜像具有属性ipa_enroll=True,则该主机将从IPA中移除。

Packstack

有些人遇到在Packstack中部署novajoin的困难。以下是我在RHEL 7.4上使用RHOSP 11(Ocata)进行部署的方法。

安装packstack

# packstack <your_favorite_options>

配置主机作为IPA客户端

# ipa-client-install ...

从/etc/nova/nova.conf获取[keystone_authtoken]部分并调用novajoin安装程序

# novajoin-install --user nova --keystone-auth-url <auth-url> \
  --nova-password <password> --project services

添加novajoin用户和组

# groupadd -r novajoin --gid 968
# useradd -u 968 -r -g novajoin -G novajoin -d /var/lib/novajoin \
  -s /sbin/nologin -c "OpenStack novajoin Daemons" novajoin

创建日志目录

# mkdir /var/log/novajoin
# chown novajoin:novajoin /var/log/novajoin

复制systemd单元文件

# cp /usr/share/novajoin/*.service /usr/lib/systemd/system/
# systemd daemon-reload

重启必要的服务

# systemctl restart openstack-nova-api novajoin-server novajoin-notify

起源

这基于Rich Megginson和Nathan Kinder的工作。Rich实现了初始钩子,可在以下链接中查看:https://github.com/richm/rdo-vm-factory/blob/master/rdo-ipa-nova

项目详情


下载文件

下载适用于您平台文件的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

novajoin-1.3.0.tar.gz (80.7 kB 查看散列)

上传时间

构建分发

novajoin-1.3.0-py2.py3-none-any.whl (90.4 kB 查看散列)

上传时间 Python 2 Python 3

由以下支持