设为首页 收藏本站
查看: 1101|回复: 0

[经验分享] Puppet学习之hiera(8)

[复制链接]

尚未签到

发表于 2015-11-26 15:05:20 | 显示全部楼层 |阅读模式
Links:
http://dreamfire.blog.iyunv.com/418026/1399014
https://github.com/ripienaar/hiera
https://docs.puppetlabs.com/hiera/1/complete_example.html


1.什么是Hiera
Hiera是一个强大的puppet外部节点分类器(ENC),利用这个套件,可以大大减少部署中的重复配置。更加灵活高效的配置和管理变量,类,节点配置。



Hiera的安装
在puppet 3.0中,hiera已经包含在puppetmaster安装包中,会默认安装。
在puppet 2.7中,需要执行以下命令安装:
sudo puppet resource package hiera ensure=installed
也可以采用在线安装的方式
  yum install hiera hiera-puppet
apt-get install
hiera-puppet




2.Hiera主配置文件
2.1默认hiera.yaml主配置文件在/etc目录下,为了结合后期版本控制系统集中管理,建议将此文件copy到/etc/puppet目录下,然后创建软连接指向/etc/hiera.yaml即可。

[iyunv@puppetmaster ~]# mv /etc/hiera.yaml /etc/puppet/
[iyunv@puppetmaster ~]# ln -s /etc/puppet/hiera.yaml /etc/hiera.yaml
[iyunv@puppetmaster ~]# ll /etc/hiera.yaml
lrwxrwxrwx 1root root 22Apr 2020:05/etc/hiera.yaml
-> /etc/puppet/hiera.yaml


2.2编辑hiera.yaml


  • 添加全局变量common,注释掉defaults、global和clientcert。

  • 添加系统类型变量osfamily

  • 添加主机名变量hostname


备注: 以上变量其实就是fact变量。






root@crdc-c210-170:/etc/puppet# cat hiera.yaml

---

:backends:

- yaml

:hierarchy:

# - defaults

# - "%{clientcert}"

# - "%{environment}"

# - global

- common

- "%{environment}"

- "%{osfamily}"

- "%{hostname}"   



:yaml:

# datadir is empty here, so hiera uses its defaults:

# - /var/lib/hiera on *nix

# - %CommonAppData%\PuppetLabs\hiera\var on Windows

# When specifying a datadir, make sure the directory exists.


#  :datadir:"/etc/puppet/environments/%{environment}/hiera"


   :datadir: /etc/puppet/hieradatadir






hiera的主配置文件必须为yaml格式,配置最上层key必须以冒号(:)开头


backends 定义了hiera数据文件的格式,支持yaml和json两种格式



hierarchy(层次结构)为数据源的层次顺序,即hiera查找的顺序,先从common中查找,如果没有则再往下,依次查找。


hierarchy中的值必须为字符串,其中common为默认数据源。


hiera主配置文件编写完成之后,需要重启puppetmaster后方可生效。







举例说明如下:


变量


  • ::clientcert = web01.example.com
  • ::environment = production
  • ::is_virtual = true

数据源解读顺序如下:










查找到的yaml文件如下:



  • web01.example.com.yaml
  • production.yaml
  • virtual_true.yaml
  • common.yaml


变量查找顺序:


# web01.example.com.yaml
mykey: one
# common.yaml
mykey:
- two
- three

(1)hiera默认先查找优先级高的yaml,如果找到相应的变量值,则不再继续向下查找。


          如上例中,mykey一旦找到在web01.example.com.yaml找到相应内容,就不再查找common.yaml


  (2) hiera 还支持j聚合查询


队列聚合:


  array merge查询:会按照hierarchy定义的顺序,逐层查找相应的mykey,最后将得到的所有结果存入数组中并返回。



      此例中,array merge方式返回的mykey为:[one, two, three].


哈希聚合:


详见: https://docs.puppetlabs.com/hiera/1/lookup_types.html





3. hiera变量的引入
引入变量语法两种:
%{variable}
%{function("input")}
注意:变量的值只能为字符串,通常数字也被自动当做字符串处理


3.1引入一般变量
变量可以在字符串的任何位置插入。
smtpserver: "mail.%{::domain}"
3.2使用查询函数
两种查询函数:hiera()和scope()
举例说明如下:
wordpress::database_server: "%{hiera('instances::mysql::public_hostname')}"
语法:
传入的参数必须用引号。
函数和插入的参数名称中,不能有空格。


hiera()函数只能用在数据源中。


wordpress::database_server: "%{hiera('instances::mysql::public_hostname')}"


scope()可以引入变量到字符串中:
以下两种方式,效果是一样的

smtpserver: "mail.%{::domain}"
smtpserver: "mail.%{scope('::domain')}"


3.3插入变量
(1)数据源中插入(in data source):
---
:hierarchy:
- "%{::clientcert}"
- "%{::custom_location}"
- "virtual_%{::is_virtual}"
- "%{::environment}"
- common
在以上层次结构中,除了最后一个源,其他源文件都将随着::clientcert, ::custom_location, ::is_virtual, ::environment 等变量的出入值而随之变化.


甚至可以动态定义datadir
:yaml:
:datadir: "/etc/puppet/hieradata/%{::environment}"




(2)yaml文件中插入变量
# /var/lib/hiera/common.yaml
---
smtpserver: "mail.%{::domain}"
或者:
# /var/lib/hiera/common.yaml
---
bacula::jobs:
"%{::hostname}_Cyrus":
fileset: MailServer
bacula_schedule: 'CycleStandard'
"%{::hostname}_LDAP":
fileset: LDAP
bacula_schedule: 'CycleStandard'


3.4变量的引用
在原始的puppet中变量引用方式为 $::clientcert
在hiera中引用变量,需要去掉“$”,即::clientcert
注意:不要在局部作用域中创建变量,尽量从全局,node级别,facts,内嵌变量或者ENC引入变量。


变量的赋值:
Example:

    # /etc/puppet/hieradata/appservers.yaml
---
proxies:
- hostname: lb01.example.com
ipaddress: 192.168.22.21
- hostname: lb02.example.com
ipaddress: 192.168.22.28

Good:

    # Get the structured data:
$proxies = hiera('proxies')
# Index into the structure:
$use_ip = $proxies[1]['ipaddress'] # will be 192.168.22.28



4.Hiera完整例子如下:
https://docs.puppetlabs.com/hiera/1/complete_example.html


以ntp这儿默认的modules为例:
该modules中包ntp这个类,需要五个参数:

  • servers (ntp server信息)
  • restrict(能否成为ntp server)
  • autoupdate(自动更新ntp包)
  • enable
  • template



4.1原始puppet配置如下:
/etc/puppet/manifests/site.pp


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,
}
}





4.2采用hiera方式
4.2.1配置hiera文件层次结构
vi /etc/puppet/hiera.yaml
---
:backends:            ##源数据文件格式为yaml
- yaml
:yaml:                ##yaml源文件存放路径
:datadir: /etc/puppet/hieradata
:hierarchy:           ##源文件查询顺序
- "node/%{::fqdn}"  ##此处的fqdn也可以换为certname,他们通常是一致的
  - common
源文件查找顺序:
(1)在node目录下,有一系列以fqdn命名的yaml文件(E.g. /etc/puppet/hieradata/node/grover.example.com.yaml)。如果没有在node目录下找到匹配的yaml文件,将进入下一步common的查找。
(2)在common文件中(/etc/puppet/hieradata/common.yaml),将定义一些默认设置。


4.2.2配置软连接
ln -s /etc/puppet/hiera.yaml /etc/hiera.yaml


4.2.3编写数据源
(1)在/etc/puppet/hieradata/node中写入我们需要的节点配置。
例如,我们需要设置两个ntp server,即kermit.example.com和grover.example.com
配置如下:
vi
/etc/puppet/hieradata/node/kermit.example.com.yaml



---
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
配置完后,测试一下:

hiera ntp::servers ::fqdn=kermit.example.com
然后配置下一个node:



vi /etc/puppet/hieradata/node/grover.example.com.yaml


---
ntp::restrict:
-
ntp::autoupdate: true
ntp::enable: true
ntp::servers:
- kermit.example.com iburst
- 0.us.pool.ntp.org iburst
- 1.us.pool.ntp.org iburst
- 2.us.pool.ntp.org iburst
再测试一下:

hiera ntp::servers ::fqdn=grover.example.com


(2)在定义default的数据源
vi /etc/puppet/hieradata/common.yaml

---
ntp::autoupdate: true
ntp::enable: true
ntp::servers:
- grover.example.com iburst
- kermit.example.com iburst
测试:
hiera ntp::servers ::fqdn=snuffie.example.com


4.2.4配置puppet的site.pp
vi /etc/puppet/site.pp
node "kermit.example.com", "grover.example.com", "snuffie.example.com" {
include ntp
# or:
# class { "ntp": }
}


4.2.4使用hierad类导入node
(1)在site.pp中声明类
hiera_include('classes')
(2)定义数据源文件yaml
vi /etc/puppet/hieradata/node/kermit.example.com.yaml

---
---
classes:
- ntp
- apache
- postfix
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测试:$ hiera classes ::fqdn=kermit.example.com
["ntp", "apache", "postfix"]

5.使用factor动态使用类


(1)配置hiera主文件
vi /etc/puppet/hiera.yaml
---
:backends:
- yaml
:yaml:
:datadir: /etc/puppet/hieradata
:hierarchy:
- "node/%{::fqdn}"
- "virtual/%{::virtual}"
- "osfamily/%{osfamily}"
- common
其中fqdn、osfamily、virtual为factor变量
(2)创建相应数据源目录
`mkdir /etc/puppet/hieradata/virtual; mkdir /etc/puppet/hieradata/osfamily`
(3)配置数据源
需要将vmwaretools装入redhat的/opt/vmware目录下,在ubuntu的/usr/local/vmware目录下
在puppet-vmwaretools模块中需要两个参数working_dir和version
vi /etc/puppet/hieradata/virtual/vmware.yaml
---
classes: vmwaretools

cd /etc/puppet/hieradata/osfamily
vi RedHat.yaml
---
vmwaretools::working_dir: /opt/vmware

vi Debian.yaml
---
vmwaretools::working_dir: /usr/local/vmware

将version参数放在common.yaml
vi /etc/puppet/hieradata/common.yaml
---
vmwaretools::version: 8.6.5-621624
ntp::autoupdate: true
ntp::enable: true
ntp::servers:
- grover.example.com iburst
- kermit.example.com iburst
测试:$ hiera vmwaretools::working_dir osfamily=RedHat
/opt/vmware
$ hiera vmwaretools::working_dir osfamily=Debian
/usr/local/vmware
$ hiera vmwaretools::version
8.6.5-621624
$ hiera classes ::virtual=vmware
vmwaretools

参考链接:https://docs.puppetlabs.com/hiera/1/complete_example.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-143987-1-1.html 上篇帖子: Puppet 1.0.6发布 下篇帖子: 两台Redhat搭建Puppet实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表