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

[经验分享] Puppet 之 模板和模块

[复制链接]

尚未签到

发表于 2018-8-1 12:31:25 | 显示全部楼层 |阅读模式
  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&quot;和&quot;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 &quot;include redis&quot;  测试调用子类,注意slave子类有变量,需要传递值
puppet apply -v --noop -d --test -e &quot;include redis::master&quot;  
puppet apply -v --noop -d --test -e &quot;class {'redis::slave': masterip => '172.18.50.73', masterport => '6379',}&quot;
  执行
puppet apply  -e &quot;include redis::master&quot;  
puppet apply  -e &quot;class {'redis::slave': masterip => '172.18.50.73', masterport => '6379',}&quot;

运维网声明 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-544786-1-1.html 上篇帖子: Puppet 之 流程控制介绍 下篇帖子: Puppet 之 Master/agent配置与实现多环境
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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