深入理解OpenStack自动化部署
  • 前言
  • 初识PuppetOpenstack
    • 相关约定
    • 术语表
    • PuppetOpenstack项目简介
  • Puppet开发基础
    • 关于Puppet
    • Puppet核心概念
    • 理解Hiera
    • 准备开发测试环境
  • OpenStack基础服务模块
    • puppet-apache模块
    • puppet-memcached模块
    • puppet-sysctl模块
    • puppet-rsync模块
    • puppet-xinetd模块
    • puppet-rabbitmq模块
    • puppet-firewall模块
    • puppet-mysql模块
    • puppet-vcsrepo模块
    • puppet-mongodb模块
    • puppet-ceph
  • Openstack服务模块
    • OpenStack模块代码结构
    • puppet-keystone模块
    • puppet-nova
    • puppet-neutron
    • puppet-glance
    • puppet-horizon
    • puppet-ceilometer
    • puppet-cinder
    • puppet-tempest
    • puppet-heat
    • puppet-swift
    • puppet-trove
    • puppet-sahara
    • puppet-manila
    • puppet-rally
    • puppet-designate
    • puppet-aodh模块
  • PuppetOpenstack公共库和工具类模块
    • puppet-oslo
    • puppet-vswitch模块
    • puppet-openstacklib
    • puppet-openstack-integration
    • puppet-openstack-specs
    • puppet-openstack-cookiebutter
    • puppet-modulesync-configs
    • puppet-openstack_spec_helper
    • puppet-stdlib
    • puppet-openstack_extras
  • 最佳实践
    • 模块管理
    • Hiera
    • 提交规范
    • 正确使用环境
    • 转发层规范
    • 代码风格
    • Standalone vs C\/S 模式
    • Puppet版本的选择
    • Puppet4的新特性和变化
    • Puppet的能与不能
  • 其他部署工具
    • Fuel
    • Kolla
    • TripleO
    • Packstack
    • OSA
    • DevStack
    • 编写一个定制化部署工具
  • 结语
Powered by GitBook
On this page
  • Hiera
  • 1.简介和历史
  • 1.1 实例说明
  • 2.hiera.yaml配置文件
  • 2.1 文件路径
  • 2.2 参数详解
  • Automatic Parameter Lookup
  • 参考文档

Was this helpful?

  1. 最佳实践

Hiera

Hiera

1.简介和历史

Hiera是基于键值查询的数据配置工具,Hiera是一个可选工具,它的目标是:Hiera makes Puppet better by keeping site-specific data out of your manifests

它的出现使得代码逻辑和数据可以分离管理。

在Puppet 2.x版本时代,Hiera作为一个独立的组件出现,若要使用则需要单独安装。在3.x版本之后,Hiera被整合到Puppet的代码中去。Hiera是Hierarchal单词的缩写,表明了其层次化数据格式的特点。

1.1 实例说明

在使用hiera前,一个常见的manifests文件是这么编写的:

node "kermit.example.com" {
  class { "ntp":
    servers    => [ '0.us.pool.ntp.org iburst','1.us.pool.ntp.org iburst','2.us.pool.ntp.org iburst','3.us.pool.ntp.org iburst'],
    autoupdate => false,
    restrict   => [],
    enable     => true,
  }
}

node "grover.example.com" {
  class { "ntp":
    servers    => [ 'kermit.example.com','0.us.pool.ntp.org iburst','1.us.pool.ntp.org iburst','2.us.pool.ntp.org iburst'],
    autoupdate => true,
    restrict   => [],
    enable     => true,
  }
}

node "snuffie.example.com", "bigbird.example.com", "hooper.example.com" {
  class { "ntp":
    servers    => [ 'grover.example.com', 'kermit.example.com'],
    autoupdate => true,
    enable     => true,
  }
}

在使用了Hiera之后,manifests文件发生了如下变化:

node "kermit.example.com", "grover.example.com", "snuffie.example.com" {
  include ntp
  # or:
  # class { "ntp": }
}

所有的数据设置移到了hiera中:

---
ntp::restrict:
 -
ntp::autoupdate: false
ntp::enable: true
ntp::servers:
  - 0.us.pool.ntp.org iburst
  - 1.us.pool.ntp.org iburst
  - 2.us.pool.ntp.org iburst
  - 3.us.pool.ntp.org iburst

2.hiera.yaml配置文件

hiera.yaml是Hiera唯一的配置文件,它其中只有少数几个配置参数,但决定了Hiera不同的使用方式。

2.1 文件路径

在puppet.conf中通过设置hiera_config参数来设置hiera.yaml文件的路径,默认值为:$confdir/hiera.yaml

注意Puppet 4.x以上时,默认值变更为$codedir/hiera.yaml

2.2 参数详解

以下为hiera.yaml配置文件的默认值:

---
:backends: yaml
:yaml:
  # on *nix:
  :datadir: "/etc/puppetlabs/code/environments/%{environment}/hieradata"
  # on Windows:
  :datadir: "C:\ProgramData\PuppetLabs\code\environments\%{environment}\hieradata"
:hierarchy:
  - "nodes/%{::trusted.certname}"
  - "common"
:logger: console
:merge_behavior: native
:deep_merge_options: {}

参数名称

类型

说明

:hierarchy

str或array

每一行表示静态或动态的数据源,动态源是指使用了%{variable}格式的变量,hiera采用从上往下的顺序读取数据源。

:backends

str或array

yaml或json,默认值:yaml

:logger

str

决定warning和debug级别日志的发送位置: console (messages送到STDERR), puppet (messages送到Puppet日志系统), noop (messages静默) Puppet会将值覆盖为puppet,无论设置为其他任何一个值。

str

native (default) — 仅合并最顶层key; deep — 递归合并; 在遇到冲突的key时, 低优先级会被使用。deeper — 递归合并; 在遇到冲突的key时, 高优先级会被使用。

:deep_merge_options

array

当:merge_behavior设置为deep或deeper时使用

:yaml / :json :datadir

str

数据源文件的查找路径

Automatic Parameter Lookup

Hiera 是用来存储数据的地方,那么当Puppet 代码中需要从hiera 中读取某个数据时,我们可以在代码中使用hiera() 函数的方式,在hieradata 中查找某个键值存储的数据,例如在hieradata 文件test.yaml 中定义了:

foo: bar

那么,我可以在Puppet 代码中获取foo 这个键对应的值:

$text = hiera('foo')
notify { "$text": }

foo 这个键对应的值通过hiera 函数获取到之后被保存在了$text 变量中。

除了使用hiera(), hiera_include(), hiera_array(), hiera_hash() 等函数去hieradata 中读取之外,Puppet 还会自动从Hiera 中查找类参数,查找键为myclass:parameter_one(即类名::参数名)。

在定义一个Puppet 类时,可以定义默认的参数值,例如下面的myclass 类的参数$parameter_one 使用了默认值"default text":

class myclass ($parameter_one = "default text") {
  file {'/tmp/foo':
    ensure  => file,
    content => $parameter_one,
  }
}

当我们调用myclass 这个类时,Puppet 遵循如下方式来设定$parameter_one 这个参数的值:

  1. 如果在调用这个类的时候,显式的向其传递了参数值,那么Puppet 使用显式传递的值作为参数的值。

  2. 如果调用类时没有传递参数的值,那么Puppet 会自动从Hiera 中查询参数的值,查找时使用:: 做为查找的键(例如上面的myclass 类的prarameter_one 参数,查找键为myclass::parameter_one)

  3. 如果方法1 和2 都没有获取到值,那么Puppet 会使用类定义中参数的默认值作为参数的值(例如myclass 中prameter_one 参数的默认值为"default text")

  4. 如果1 至3 都没有获取到值,那么Puppet 将会直接报错,代码的编译将被中断。

上面的方法2 是Puppet 最有趣的地方,因为Puppet 会自动从Hiera 中查找参数的值,我们可以在代码中使用include 语句来调用一个类,不需要对其传递任何参数值,所有的参数传递都可以将参数值写到Hiera 中,Puppet 会自动从Hiera 中读取类的参数。例如,我想调用上面定义的myclass 类,并且$parameter_one 的参数值为"ustack",参数的传递使用Hiera 来完成。那么我需要在Hiera 中写入下面的值:

myclass::parameter_one: 'ustack'

在代码中,调用myclass 类:

include myclass

这里不用对myclass 传递参数,myclass 会自动读取Hiera 中对parameter_one 定义的值,即$parameter_one 的值在调用时为'ustack'

参考文档

Previous模块管理Next提交规范

Last updated 6 years ago

Was this helpful?

:merge_behavior

http://docs.puppetlabs.com/hiera/latest/