puppet-horizon
0. 基础知识
Horizon 是 OpenStack Dashbaord 项目,为用户提供了 Web 图形化的管理界面来完成一些常见的虚拟资源操作,例如创建虚拟机实例,管理网络,设置访问权限等等。下图给出了 Horizon 的预览页面的样例。
除了四大核心项目以外,Horizon 还支持以下项目:
- swift
- cinder
- heat
- ceilometer
- trove
- sahara
注:要正常运行 horizon 服务,至少需安装 Nova,Keystone,Glance,Neutron 服务
puppet-horizon
模块用于配置和管理 horzion 服务,包括 Horzion 软件包,配置文件和服务的管理,并且 puppet-horizon
支持将 Horizon 将运行在 Python 内置 Web 服务器或 Apache 服务器上。
1. 先睹为快
不想看下面大段的代码解析,已经跃跃欲试了?
OK,我们开始吧!
打开虚拟机终端并输入以下命令:
$ puppet apply -e 'class {'horizon': secret_key => 'big'}'
等待命令执行完成,Puppet 完成了 Horizon 部署,并将其运行在 Apache 上。
2. 核心代码讲解
2.1 class horizon
class horizon
管理了以下三个任务:
- Horizon 软件包的安装:
package { 'horizon':
ensure => $package_ensure,
name => $::horizon::params::package_name,
tag => ['openstack', 'horizon-package'],
}
- Horizon 配置文件的管理:
concat { $::horizon::params::config_file:
mode => '0644',
require => Package['horizon'],
}
concat::fragment { 'local_settings.py':
target => $::horizon::params::config_file,
content => template($local_settings_template),
order => '50',
}
这里说明一下 concat 管理配置文件的方式,在其他模块中也出现过这种管理配置文件的方式,而它曾经流行过一段时间。
了解过 template 的同学都知道,这是 puppet 管理配置文件的内置方式,这种方式的优缺点非常明显,其缺点就是每次配置文件发生新的变动,那么模板也得保持同步的更新。
因此,有人提出来一种新方法,将模板文件拆为分片(fragment),把保持不变的配置项放到分片 1 中,把频繁更新的配置项放到分片 2 中,然后最后再拼接起来(concat)。这种方法简化了模板维护的成本,使得配置文件的管理变得更灵活,但本质上仍是模板。
- 管理 Horizon 服务的运行环境:
if $configure_apache {
class { '::horizon::wsgi::apache':
bind_address => $bind_address,
servername => $servername,
server_aliases => $final_server_aliases,
listen_ssl => $listen_ssl,
ssl_redirect => $ssl_redirect,
horizon_cert => $horizon_cert,
horizon_key => $horizon_key,
horizon_ca => $horizon_ca,
extra_params => $vhost_extra_params,
redirect_type => $redirect_type,
root_url => $root_url
}
}
这个类的代码通俗易懂,值得一提的是以下 4 个参数,若配合不慎可能会导致服务运行异常:
- keystone_url
- available_regions
- cache_server_ip
- secret_key
还有一点是函数 member 的使用,类似于 Python 中的 in
,用于判断指定变量是否存在于指定的数组中,第一个参数是数组变量,第二个参数是成员变量:
if ! (member($tuskar_ui_deployment_mode_allowed_values, $tuskar_ui_deployment_mode)) {
fail("'${$tuskar_ui_deployment_mode}' is not correct value for tuskar_ui_deployment_mode parameter. It must be either 'scale' or 'poc'.")
}
2.1 class horizon::wsgi::apache
horizon::wsgi::apache
用于配置将 horizon 运行在 apache 上。
这里有两点值得注意,第一点是 merge 函数:
if $bind_address {
$default_vhost_conf = merge($default_vhost_conf_no_ip, { ip => $bind_address }) #将两个或两个以上的 hash 变量合并成一个 hash 变量
} else {
$default_vhost_conf = $default_vhost_conf_no_ip
}
第二点是函数 ensure_resource:
ensure_resource('apache::vhost', $vhost_conf_name, merge ($default_vhost_conf, $extra_params, {
redirectmatch_regexp => $redirect_match,
redirectmatch_dest => $redirect_url,
}))
其等价于:
$merged_hash_list = merge ($default_vhost_conf, $extra_params, {
redirectmatch_regexp => $redirect_match,
redirectmatch_dest => $redirect_url,
})
apache::vhost {"$vhost_conf_name":
$merged_hash_list
}))
使用 ensure_resource
的目的是为了使代码更简洁。
3. 小结
本节介绍了如何使用 puppet-horizon
模块部署 Horizon 服务,同时也介绍了 concat, merge, ensure_resource 等 define 和 function,合理使用有助于提高代码的简洁和优雅。
4. 动手练习
- 开启 Horizon SSL 端口
- 确保 Horizon 服务只监听在内网 IP 上
- 如何调整 mod_wsgi 的参数来设置 Horizon 运行在三种不同的 MPM 模式:prefork, worker, winnt
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论