Puppet 之 模板和模块
1 概述
模板文件是在puppet模块下面templates目录中以”.erb”结尾的文件,puppet模板主要用于文件,例如各种服务的配置文件,相同的服务,不同的配置就可以考虑使用模板文件。
模块是Puppet自包含的代码和数据集合。绝大多数的清单都可以放到模块中,唯一的例外是manifests下的主清单site.pp,包含站点级和节点级的代码。
本文将结合例子介绍如何使用模板和模块
2 模板
2.1 概念介绍
puppet模板是采用erb模板语言,embedded ruby来创建
puppet兼容的erb语法链接:https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html
定义模板文件放置的路径
file{'title': ensure => file, path => content => template('/PATH/TO/ERB_FILE'), }
#注意,content要根据template来处理
文本文件/PATH/TO/ERB_FILE中内嵌变量替换机制:这个格式要注意,如下:
<%= @VARIABLE_NAME %>
2.2 例子
例1 配置nginx模板
准备nginx配置模板,修改nginx配置的work_processes为变量
vim nginx.conf.erb worker_processes <%= @processorcount %>;
定义类
vim nginx.pp class nginx {package{'nginx':ensure => latest;} ->file{'/etc/nginx/nginx.conf':ensure => file,content => template('/root/nginx.conf.erb'),} ~>service{'nginx':ensure => running,} } include nginx
执行脚本
puppet apply nginx.pp
例2 配置redis从节点
修改从的redis配置文件为模板文件,注意,用class来传递变量,调用类
vim redis_slave.pp class redis {package{'redis':ensure => latest,} service{'redis':ensure => running,enable => true,hasrestart => true,restart => 'service redis restart',require => Package['redis'],} } class redis::slave($masterip,$masterport='6379') inherits redis {file{'/etc/redis.conf':ensure => file,content => template('/root/puppet/redis.module/redis-slave.conf.erb'),owner => redis,group => root,require => Package['redis'],} Service['redis'] {restart => 'systemctl restart redis.service',subscribe => File['/etc/redis.conf'],} } class{'redis::slave':masterip => '172.18.50.73'; }
修改配置文件为模板
vim redis-slave.conf.erb slaveof <%= @masterip %> <%= @masterport %>
执行该脚本
puppet apply redis_slave.pp
3 模块
3.1 概念介绍
模块就是一个按约定的、预定义的层级结构存放了多个文件或子目录的目录,目录里的这些文件或子目录必须遵循一定格式的命名规范;
puppet会在配置的路径下查找所需要的模块;
MODULES_NAME:
manifests/
init.pp
files/
templates/
lib/
spec/
tests/
模块名只能以小写字母开头,可以包含小写字母、数字和下划线;但不能使用”main"和"settings“;
manifests/
init.pp:必须一个类定义,类名称必须与模块名称相同;
files/:静态文件;
puppet URL:
puppet:///modules/MODULE_NAME/FILE_NAME #这里不需要指定绝对路径,因为路径是固定的
templates/:
tempate('MOD_NAME/TEMPLATE_FILE_NAME')
lib/:插件目录,常用于存储自定义的facts以及自定义类型;
spec/:类似于tests目录,存储lib/目录下插件的使用帮助和范例;
tests/:当前模块的使用帮助或使用范例文件;
注意:
1、puppet 3.8及以后的版本中,资源清单文件的文件名要与文件子类名保持一致,例如某子类名为“base_class::child_class”,其文件名应该为child_class.pp;
2、无需在资源清单文件中使用import语句;
3、manifests目录下可存在多个清单文件,每个清单文件包含一个类,其文件名同类名;
puppet config命令:
获取或设定puppet配置参数;
puppet config print [argument]
puppet查找模块文件的路径:modulepath
puppet config print modulepath
set更改参数的值,以下命令更改后直接保存在配置文件里
例子
puppet config set server master.sunny.com
查看配置文件/etc/puppet/puppet.conf ,[main]段多了如下一行
server = master.sunny.com
模块放置路径:/etc/puppet/modules
要共享自己编写的模块,可以放到puppet forge上,这个网站:https://forgeapi.puppetlabs.com是用来存放模块
如在Puppet Forge中搜索redis模块
puppet module search redis
3.2 例子开发redis模块
参加模块相关目录,注意路径结构
mkdir -pv /etc/puppet/modules/redis/{manifests,files,templates,lib,spec,tests}
建议先在其他路径下,如/root下创建一个modules模块,等模板都编辑完成后在拷贝到/etc/puppet/modules下。
mkdir -pv /root/modules/redis/{manifests,files,templates,lib,spec,tests}
把静态文件放到files里,模板文件(erb格式)放到templates里
cp /root/puppet/redis.module/redis-master.conf /root/modules/redis/files/
cp /root/puppet/redis.module/redis-slave.conf.erb /root/modules/redis/templates/
在manifests下定义和模块名同名的类,在init.pp里,同时定义master.pp和slave.pp的子类,模块方式注意文件的路径的定义有简化的
格式 和绝对路径两种,因为在模块下,文件放置的路径是固定的,所以,用相对路径就可以查找到配置文件模板的路径
source 定义模板的路径
source => 'puppet:///modules/MOD_NAME/FILE_NAME',
例子
source => 'puppet:///modules/redis/redis-master.conf',
等价于写绝对路径
source => '/etc/puppet/modules/redis/files/redis-master.conf',
content定义模板的路径
格式 content => template('MOD_NAME/ERB_FILE')
例子
content => template('redis/redis-slave.conf.erb'),
等价于写绝对路径
content => template('/etc/puppet/modules/redis/templates/redis-slave.conf.erb'),
vim /root/modules/redis/manifests/init.pp class redis {package{'redis':ensure => latest,} service {'redis':ensure => running,enable => true,hasrestart => true,restart => 'service redis restart',require => Package['redis'],} }
vim /root/modules/redis/manifests/master.pp class redis::master inherits redis {file{'/etc/redis.conf':ensure => file,source => '/etc/puppet/modules/redis/files/redis-master.conf',owner => redis,group => root,require => Package['redis'],} Service['redis']{restart => 'systemctl restart redis',subscribe => File['/etc/redis.conf'],} }
#slave配置文件,这里利用变量来传递参数
vim /root/modules/redis/manifests/slave.pp class redis::slave($masterip,$masterport='6379') inherits redis {file{'/etc/redis.conf':ensure => file,content => template('/etc/puppet/modules/redis/templates/redis-slave.conf.erb'),owner => redis,group => root,require => Package['redis'],} Service['redis']{restart => 'systemctl restart redis',subscribe => File['/etc/redis.conf'],} }
#注意修改配置文件如下
vim /root/modules/redis/templates/redis-slave.conf.erb slaveof <%= @masterip %> <%= @masterport %>
#目前目录结构如下
[root@CentOS7C modules]#tree
.
└── redis
├── files
│ └── redis-master.conf
├── lib
├── manifests
│ ├── init.pp
│ ├── master.pp
│ └── slave.pp
├── spec
├── templates
│ └── redis-slave.conf.erb
└── tests
文件都准备完成后,把redis整个模块放到对应的软件指定的目录/etc/puppet/modules/下
cp -r /root/modules/redis/ /etc/puppet/modules/
测试
查看模块
[root@CentOS7C ~]#puppet module list /etc/puppet/modules └── redis (???) /usr/share/puppet/modules (no modules installed)
redis模块后面显示为???,为redis的相关元数据信息,用来描述模块的,但是显示异常,忽略该情况
声明类
为哪个主机调用这个类,这里演示为当前主机调用,没有跨主机
注意,调用是指明类名,而不是指明模块
测试调用基类
puppet apply -v --noop -d --test -e "include redis"
测试调用子类,注意slave子类有变量,需要传递值
puppet apply -v --noop -d --test -e "include redis::master" puppet apply -v --noop -d --test -e "class {'redis::slave': masterip => '172.18.50.73', masterport => '6379',}"
执行
puppet apply -e "include redis::master" puppet apply -e "class {'redis::slave': masterip => '172.18.50.73', masterport => '6379',}"
转载于:https://blog.51cto.com/ghbsunny/2046212
Puppet 之 模板和模块相关推荐
- puppet安装与使用--模块结构(iptables与rsync模块)
puppet安装与使用--模块结构(iptables与rsync模块) 模块结构 一个模块就是一个/etc/puppet/modules目录下面的一个目录和它的子目录,在puppet的主文件s ...
- Puppet 笔记 模板
概念 模块构成 模块工作原理 puppet help module 搜索模板 puppet module search apache 更多模板下载 https://forge.puppet.com/ ...
- php kingcms 模型调用,KingCMS 中模板、模块、模型区别
模板 就是前台网页的基础样子,生成前台网页时,会根据模板向其中填充数据库中的数据,以显示一个具有特定样子.具有特定数据的网页.在 KingCMS 2009 版本中,模板位于 template 文件夹. ...
- joomla模板的模块位置查看技巧
这里介绍一种通过浏览器地址查看位置的方法: http://localhost/index.php?tp=1 localhost替换为你的网站地址 系统看作一栋大楼,组件就是构成大楼的"墙&q ...
- Centos7+puppet+foreman,模板介绍
一.简介 provision templates 是灵活部署合适的操作系统的核心,模板包括有好几类 1.模板种类 pxe相关的模板,比如pxelinux,pxegrub,pxegrub2 kickst ...
- puppet 手册之puppet rsync 模块应用完整版
上篇文章有介绍关于模块的配置和应用,Cron模块再实际的工作需求中,还是蛮多的,这篇文章就模块的应用多介绍一个篇幅,工作中常用的RSYNC Puppet也是用来同步文件的,针对一些小文件之类的,还是蛮 ...
- 合同管理模块样板html,可配置合同模板的合同管理系统的制作方法
技术特征: 1.可配置合同模板的合同管理系统,其特征在于,合同管理系统包括:合同模板管理模块,对数据库中的合同字段进行管理并创建多个合同模板,合同与模板采用多对多的数据关系存储于数据库,创建不同模板的 ...
- 淘宝模板开发系列之JS模块开发
1. 开启TAE_SDK,创建新模板,其中模板类型选择"JS模板",例如我们创建的模板名称为"MyTest". 2. 开发模块.添加新模块,其中文件创建选中&q ...
- 政府信息网站模板源码应该包含哪些模块?
一个专业的政府网站模板应该是一个是一个通过知识管理系统使政府部门职员之间通过顺畅的信息交流和共享,从而大大提高办公效率的一个有利平台,他的主要功能有:知识获取功能.知识传播与享功能.知识的利用和测评功 ...
最新文章
- 万字长文带你全面认识 Kubernetes 中如何实现蓝绿部署、金丝雀发布和滚动更新...
- TensorFlow基础3-机器学习基础知识(解析法实现一元线性回归、多元线性回归)
- 《电子基础与维修工具核心教程》——1.2 电的作用
- python 数据分析学什么-数据分析培训学习多久?都学什么?
- # POJ-1979(BFS)
- python print %s 号格式化输出
- Jmeter+ant运行脚本,得到HTML报告
- Kernel panic -not syncing:Attempted to kill init!
- 软件工程第一次作业2018
- Java面向对象之继承、super关键字、方法重写
- DataBase -- Operator
- 第六章 使用ADO.NET查询和操作数据
- 有钱人也开始消费降级了!
- ajax证书问题,网站上有错误的SSL证书的Jquery Ajax
- 用Matlab把SMAP vegetation optical depth (VOD)数据转换成带投影信息EASE GRID2的tif文件
- 电脑老系统怎么换新系统?
- 你所不了解的DevOps
- 石墨笔记,Onenote,Effie哪个更适合记者?
- Dolphinscheduler 学习笔记
- CSS实现垂直/水平导航栏
热门文章
- 02-图像的几何变换
- java安卓写文件路径,如何使用gradle作为构建系统,平台Android配置Protobuf(Java)文件的输出路径?...
- 远控免杀专题3---msf自免杀
- c语言函数调用数组_第七讲:C语言基础之函数,第二节,实现汉诺塔
- uva 10515——Powers Et Al.
- -又见GCD -- ACM解决方法
- C/C++继承与派生
- C++子类父类成员函数的覆盖和隐藏实例详解
- Linux网络编程——I/O复用之select详解
- 【汇编语言】王爽实验8,分析一个奇怪的程序,学习笔记(20200517)