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

[经验分享] Puppet---自动化运维工具(进阶)

[复制链接]

尚未签到

发表于 2017-11-27 16:23:12 | 显示全部楼层 |阅读模式
puppet的部分变量由facter提供,是一个单独的软件包,在安装puppet时就已经被依赖安装了

1
2
facter -p
#变量名称及变量值,可直接调用



每个变量都有作用域,即作用范围

puppet的流程控制,如if语句、case语句、selector语句
下面结合示例,分析变量与流程控制的作用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if语句示例:

cat if1.pp  
if $osfamily == 'Debian' {      #osfamily是内建变量
        $apachename = 'apache2' #apachename是用户自定义变量,都是用来临时存放字符串内容的
}else {
        $apachename = 'httpd'
}
#在流程控制中使用if/else条件控制语句,并为满足不同条件的自定义变量赋值
#puppet变量,无论是定义还是调用都要使用$符号
package{"$apachename":   #注意调用变量要使用双引号,表示弱引用
        ensure => latest,
}
#如果是Debian系统则安装apache2,其他系统则安装httpd软件包,package资源的title调用变量



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
case语句的示例:

cat case.pp  
case $osfamily {
        "RefHat": { $webserver='httpd' }    #匹配字符串
        /(?i-mx:debian)/: { $webserver='apache2'     #匹配正则表达式
        default: { $webserver='httpd' }    #默认选项
}
#首先判断系统类型,红帽和其他系统使用httpd服务,Debian则使用apache2
package{"$webserver":
        ensure => installed,
        before => [File['httpd.conf'],Service['httpd']],
}

file{'httpd.conf':
        path => '/etc/httpd/conf/httpd.conf',
        source => '/app/httpd.conf',
        ensure => file,
}

service{'httpd':
        ensure => running,
        enable => true,
        restart => 'service httpd restart',
        subscribe => File['httpd.conf'],
}
#本示例实现安装httpd服务

在使用case流程控制时,有一项是匹配模式即正则表达式,下面简要说明下
/(?i-mx:debian)/
//    表示使用模式匹配,即满足正则表达式的格式要求
(? )  正则表达式使用小括号括起来
i     表示忽略大小写
-     不启用某项功能
m     把 . 当作换行符
x     忽略模式中的空白字符



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
selector语句示例:

selector与case很相似,但是case每一个匹配项都拥有独立代码,而selector每一个分支都是一个返回值
dselector用于多变量赋值

cat selector.pp  
$pkgname = $operatingsystem ? {
        /(?i-mx:(ubuntu|debian))/ => 'apache2',
        /(?i-mx:(redhat|fedora|centos))/ => 'httpd',
        default => 'httpd',
}
#自定义变量是pkgname,operatingsystem是内建变量其值是本机系统类型
#本段配置可以分两部分理解,第一步使用内建变量与每个分支做比较,如果内建变量自己的值与分支模式的值一致,则执行第二步
#第二步,将匹配的分支定义的内容赋值给自定义变量pkgname
package{"$pkgname":
        ensure => installed,
}

下面使用selector再次演示一个例子
cat selector2.pp
$webserver = $osfamily ? {
        "RedHat" => 'httpd',
        /(?i-mx:debian)/ => 'apache2',
        default => 'httpd',
}
#使用selector为自定义变量webserver赋值
package{"$webserver":
        ensure => present,
}

file{'httpd.conf':
        path => '/etc/httpd/conf/httpd.conf',
        source => '/app/httpd.conf',
        ensure => file,
        require => Package["$webserver"],
}

service{'httpd':
        ensure => running,
        enable => true,
        restart => 'systemctl restart httpd',
        subscribe => File['httpd.conf'],
}



puppet的类:

类是代码块,定义完成后可在全局使用,即在master定义在agent都可调用

定义类的语法格式有两种:
1
2
3
4
5
6
7
8
9
class NAME {
    ……puppet code……
}



class NAME(parameter1,parameter2) {   #定义形参
    ……puppet code……
}



调用类的方式常见的有两种:

1、使用include明确调用
2、如定义一个资源一样定义类完成调用

下面举例说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
示例1:使用include调用类

cat class1.pp  
class apache {
        $webpkg = $operationsystem ? {
                /(?i-mx:(centos|redhat|fedora))/ => 'httpd',
                /(?i-mx:(ubuntu|debian))/ => 'apache2',
                default => 'httpd',
        }
        #类中使用流程控制selector,为自定义变量webpkg赋值
        package{"$webpkg":
                ensure => installed,
        }
        #类中使用package资源,安装软件包
        file{'httpd.conf':
                ensure => file,
                path => '/etc/httpd/conf/httpd.conf',
                source => '/app/httpd.conf',
                require => Package["$webpkg"],
        }
        #类中调用file资源,复制httod的配置文件,而且此资源依赖于package资源
        service{'httpd':
                ensure => running,
                enable => true,
                hasrestart => true,
                restart => 'service httpd restart',
                subscribe => File['httpd.conf'],
        }
        #类中调用service资源,启动httpd服务,并启动订阅功能在配置文件改变时重启服务
}
#到此都是class的范围,所谓的类就是将多个资源打包在一起,对外呈现为独立个体
include apache   #使用include调用类,否则我们只是定义类,并不会执行

示例2:定义资源一样定义类

cat class2.pp  
class webserver($pkg,$srv) {
        package{"$pkg":
                ensure => latest,
        }

        service{"$srv":
                ensure => running,
        }
}

if $operatingsystem == "CentOS" or $operatingsystem == "RedHat" {
        case $operatingsystemmajrelease {
                '7': { $pkgname = 'httpd' $srvname = 'httpd' }
                default: { $pkgname = 'nginx' $srvname = 'nginx' }
        }
}

class{'webserver':
        pkg => "$pkgname",
        srv => "$srvname",
}



类的继承

子类继承父类的功能,同时可以在此基础上增加新的功能

调用子类会自动调用父类,所以没必要单独调用父类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
cat redis.pp  
class redis {
        package{'redis':
                ensure => latest,
        }

        service{'redis':
                ensure => running,
                enable => true,
                hasrestart => true,
                restart => 'service redis restart',
                require => Package['redis'],
        }
}
#以上定义父类
class redis::master inherits redis {   #子类名为master,完全限定的子类名称即redis::master
        file{'redis.conf':
                ensure => file,
                path => '/etc/redis.conf',
                source => '/app/module.d/redis-master.conf',
                owner => redis,
                group => root,
                require => Package['redis']
        }
#子类中可以自定义资源
        Service['redis'] {
                restart => 'systemctl restart redis',  
                subscribe => File['redis.conf'],
        }
#子类调用父类的资源,注意格式
}

class redis::slave inherits redis {
        file{'redis.conf':
                ensure => file,
                path => '/etc/redis.conf',
                source => '/app/module.d/redis-slave.conf',
                owner => redis,
                group => root,
                require => Package['redis']
        }

        Service['redis'] {
                restart => 'systemctl restart redis',
                subscribe => File['redis.conf'],
        }
}

include redis::master   #使用时仅调用子类即可,因为子类会主动调用父类,本处是redis主节点的调用
#本示例实现reids主从的自动化部署,所以用到了master和slave的配置文件,
#从节点的调用是include redis::slave



puppet模板
模板语言使用erb
借助content实现文本文件中内嵌变量替换,如

<%= @VARIABLE_NAME %>

下面举例说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
结合上述示例
vim redis-slave.conf.erb
slaveof <%= @masterip %> <%= @masterport %>
#以redis配置文件为模板,只修改从节点的信息

cat redis.pp
class redis {
        package{'redis':
                ensure => latest,
        }

        service{'redis':
                ensure => running,
                enable => true,
                hasrestart => true,
                restart => 'service redis restart',
                require => Package['redis'],
        }
}

class redis::master inherits redis {
        file{'/etc/redis.conf':
                ensure => file,
                source => '/app/module.d/redis-master.conf',
                owner => redis,
                group => root,
                require => Package['redis']
        }

        Service['redis'] {
                restart => 'systemctl restart redis',
                subscribe => File['/etc/redis.conf'],
        }
}

class redis::slave($masterip,$masterport) inherits redis {   #子类继承父类同时定义变量
        file{'/etc/redis.conf':
                ensure => file,
                content => template('/app/module.d/redis-slave.conf.erb'),   #这步是关键,定义模板的路径,不用再指定source
                owner => redis,
                group => root,
                require => Package['redis']
        }

        Service['redis'] {
                restart => 'systemctl restart redis',
                subscribe => File['/etc/redis.conf'],
        }
}

class{'redis::slave':
        masterip => '192.168.1.106',
        masterport => '6379',
}
#定义类的资源,为slave子类变量赋值
#由于是从节点的配置,所有此处只对slave部分进行修改,master暂时不管

puppet apply -v redis.pp
#执行资源清单
#然后检查/etc/redis.conf文件中的 slaveof 192.168.1.106 6379,说明模板复制成功







运维网声明 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-419654-1-1.html 上篇帖子: Puppet 之 相关概念和命令介绍 下篇帖子: centos7部署puppetmaster和agent,在安装dashboard总是出问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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