puppet-neutron 模块介绍

  1. 先睹为快 - 一言不合,立马动手?
  2. 核心代码讲解 - 如何做到管理各 Neutron 服务?
  3. 小结
  4. 动手练习 - 光看不练假把式

本节作者:廖鹏辉

建议阅读时间 1.5h

neutron 组件是 OpenStack 各组件中最为复杂的组件,puppet-neutron 模块提供了 neutron 各个组件的部署和管理,包括 neutron plugins 的管理和 neutron agents 的管理。

先睹为快

Neutron 是一个分布式的服务,它由 neutron-server 和不同功能的 agent 组成。neutron-server 用于处理 API 请求,agent 用来完成各种网络功能。

以部署 neutron-server 为例:

  1. class { '::neutron::keystone::auth':
  2. public_url => "http:/localhost:9696",
  3. internal_url => "http://localhost:9696",
  4. admin_url => "http://localhost:9696",
  5. password => 'a_big_secret',
  6. }
  7. class { '::neutron':
  8. rabbit_user => 'neutron',
  9. rabbit_password => 'an_even_bigger_secret',
  10. rabbit_host => localhost,
  11. rabbit_port => 5672,
  12. core_plugin => 'ml2',
  13. }
  14. class { '::neutron::client': }
  15. class { '::neutron::server':
  16. database_connection => 'mysql+pymysql://neutron:neutron@127.0.0.1/neutron?charset=utf8',
  17. password => 'a_big_secret',
  18. }

这里使用了 neutronneutron::clientneutron::serverneutron::keystone::auth 四个类,分别用于完成服务的基础配置,客户端的安装,neutron-server 服务的配置和管理,以及 keystone 的认证。

核心代码讲解

class neutron

这个类主要完成一些通用的 neutron 配置,主要包括有:

  • 消息队列相关的配置
  • 日志相关的配置
  • SSL 相关的配置

这个类主要使用 neutron_config 来对这些配置进行管理,同时还使用了 oslo 模块来完成消息队列相关的配置管理。

class neutron::keystone::auth

这个类的主要功能是添加 keystone 用户,以及用户和角色的关联,它通过调用 keystone 模块的 keystone::resource::service_identity 这个 define 资源来完成所有 keystone 中资源的创建。

  1. keystone::resource::service_identity { $auth_name:
  2. configure_user => $configure_user,
  3. configure_user_role => $configure_user_role,
  4. configure_endpoint => $configure_endpoint,
  5. service_type => $service_type,
  6. service_description => $service_description,
  7. service_name => $real_service_name,
  8. region => $region,
  9. password => $password,
  10. email => $email,
  11. tenant => $tenant,
  12. public_url => $public_url,
  13. admin_url => $admin_url,
  14. internal_url => $internal_url,
  15. }

class neutron::server

nova::server 用来管理 neutron-server 服务,这个服务是 neutron 的核心服务,用于处理 API 请求。代码中主要使用 neutron_config 来完成 keystone 用户认证相关的配置,数据库连接相关的配置,以及一些 agent 的基础配置。

这个类的代码中多次了 ensure_resource 函数来创建资源,这样做的好处是 ensure_resource 在创建资源前会检查是否有重复的资源定义,如果有重复的资源定义那么就不再重复创建资源,可以避免资源的重复定义,我们来看一些这个函数是如何被使用的:

  1. if $ensure_vpnaas_package {
  2. ensure_resource( 'package', 'neutron-vpnaas-agent', {
  3. 'ensure' => $package_ensure,
  4. 'name' => $::neutron::params::vpnaas_agent_package,
  5. 'tag' => ['openstack', 'neutron-package'],
  6. })
  7. }

这里使用了 package 资源来进行软件包的管理,如果相同的资源已经定义过了,那么 ensure_resource 函数将不再重复创建此资源。

class neutron::plugins::ml2

neutron::plugins::ml2 用于配置 ml2 plugin 相关的配置,包括 /etc/neutron/plugin.ini 软链接的创建,服务配置项的管理等等。关于 ml2 plugin 的配置,在 neutron 中有专用的自定义资源 neutron_plugin_ml2 用来配置 ml2 的配置文件:

  1. neutron_plugin_ml2 {
  2. 'ml2/type_drivers': value => join(any2array($type_drivers), ',');
  3. 'ml2/tenant_network_types': value => join(any2array($tenant_network_types), ',');
  4. 'ml2/mechanism_drivers': value => join(any2array($mechanism_drivers), ',');
  5. 'ml2/path_mtu': value => $path_mtu;
  6. 'ml2/extension_drivers': value => join(any2array($extension_drivers), ',');
  7. 'securitygroup/enable_security_group': value => $enable_security_group;
  8. 'securitygroup/firewall_driver': value => $firewall_driver;
  9. }

并且,还控制了 ml2-plugin 软件包的安装顺序,在安装完软件包之后才应该配置其相关配置文件:

  1. if $::neutron::params::ml2_server_package {
  2. package { 'neutron-plugin-ml2':
  3. ensure => $package_ensure,
  4. name => $::neutron::params::ml2_server_package,
  5. tag => 'openstack',
  6. }
  7. Package['neutron-plugin-ml2'] -> File['/etc/neutron/plugin.ini']
  8. Package['neutron-plugin-ml2'] -> File['/etc/default/neutron-server']
  9. Package['neutron-plugin-ml2'] -> Neutron_plugin_sriov<||>
  10. } else {
  11. Package['neutron'] -> File['/etc/neutron/plugin.ini']
  12. Package['neutron'] -> File['/etc/default/neutron-server']
  13. Package['neutron'] -> Neutron_plugin_sriov<||>
  14. }

class neutron::agents::ml2::ovs

openvswitch-agent 是使用 neutron 使最常用的 agent,它通常被部署在网络节点和计算节点,用来完成 ovs bridge 的管理,ovs-agent 由 neutron::agents::ml2::ovs 这个类来进行管理,neutron 模块中为 ovs-agent 的配置提供了专门的自定义资源 neutron_agent_ovs 用于管理其配置文件,这个类中,主要使用了 neutron_agnet_ovs 来完成 ovs-agent 的配置,并管理了 ovs-agent 的软件包和服务。与这个类类似的,还有 neutron::agents::ml2::linuxbridge 用来管理 linuxbridge-agent 相关的配置和服务。

class neutron::agents::l3

l3-agent 通常部署在网络节点,提供网络间转发与路由的功能,neutron::agents::l3 这个类用于完成 L3-agent 的配置与管理。值得注意的是,它在代码中,使用了 is_service_default 这个函数:

  1. if ! is_service_default ($external_network_bridge) {
  2. warning('parameter external_network_bridge is deprecated')
  3. }
  4. if ! is_service_default ($router_id) {
  5. warning('parameter router_id is deprecated and will be removed in future release')
  6. }

这个函数是在 puppet-openstacklib 中,定义的,它的作用是判断一个变量的值是否等于 $::os_service_default 这个 facter 的值,即这个变量是否为默认值。这里对一些废弃参数的值进行了判断,如果用户修改了这些废弃参数的值,那么将会收到 warning 警告信息,告诉用户这个参数已经被废弃了。我们可以看到 is_service_default 这个函数的定义如下:

  1. module Puppet::Parser::Functions
  2. newfunction(:is_service_default, :type => :rvalue, :doc => <<-EOS
  3. Returns true if the variable passed to this function is '<SERVICE DEFAULT>'
  4. EOS
  5. ) do |arguments|
  6. raise(Puppet::ParseError, "is_service_default(): Wrong number of arguments" +
  7. "given (#{arguments.size} for 1)") if arguments.size != 1
  8. value = arguments[0]
  9. unless value.is_a?(String)
  10. return false
  11. end
  12. return (value == '<SERVICE DEFAULT>')
  13. end
  14. end

这个函数首先对传递的参数个数进行了检查,然后比较了参数类型是否为字符串,最后将参数与 '<SERVICE DEFAULT>' 进行比较,并返回布尔值。

小结

puppet-neutron 模块管理了 neutron 的 neutron-server 服务,各种 plugin以及不同的 agent 服务,同时模块总还有管理其他服务如 lbaas, vpnaas 等服务的专用类,读者可以自行去探究其代码。

动手练习

  1. 部署 neutron lbaas 服务,查看 neutron 模块中有哪些类是用来管理这个服务相关组件的
  2. 使用 neutron_portneutron_router 自定义资源来创建 neutron port 和 router