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

[经验分享] Puppet--自动化运维工具基本功能介绍

[复制链接]

尚未签到

发表于 2017-11-27 09:44:58 | 显示全部楼层 |阅读模式
                                                puppet与ansible都是运维自动化工具,二者最大的区别在于,puppet重量级适用于较大规模运维场景,而ansible较轻量级在较大规模站点的功能显得不那么强。

puppet使用ruby语言研发,所以在使用中还要掌握一些ruby的语法;


本处使用epel仓库安装puppet,版本是3.6.2

1
yum -y install  puppet



puppet获取帮助信息
1
puppet help



puppet有两种工作模型
1
2
standalone模型  
master/agent模型



puppet的资源类型
1
2
puppet describe -l   #显示所有的puppet资源类型
puppet describe -ms group   #显示指定资源的简要信息,-s显示简要信息,-m显示元信息



定义资源的语法

1
2
3
4
5
resource {'title':
    attribute  => value
    ……
}
#resource必须使用小写,title在同一资源中必须唯一




puppet的八种常用资源类型:

1、group资源

创建组
1
2
3
4
5
6
7
8
9
10
11
12
cat group.pp
group{'mygrp':                #资源名称是group,title是mydb,以冒号标识
        ensure => present,    #ensure表示创建或删除组,此处present表示创建组,absent表示删除组
        name => mygrp,        #组名称,如果未定义则使用title指定的字符串,即此字段可以省略
        system => yes,        #此组是系统组
        gid => 1991,          #定义组id
}
#上述我们创建一个创建组的资源清单,每字段尾都要以逗号隔开,最后一行的逗号则可以写也可以不写

puppet apply -v --noop group.pp
#-v显示详细信息,--noop表示干跑,即模拟测试此资源清单,实际操作可以去掉--noop参数
#如果此组已经存在,多执行几次命令结果都是不变的,因为此资源是幂等的



2、user资源
创建用户
1
2
3
4
5
6
7
8
9
10
11
12
cat user.pp
user{'user1':
        ensure => present,
        uid => 3000,         #指定用户id
        groups => puppet,      #用户所属辅助组
        home => '/app',        #指定用户家目录
        shell => '/bin/csh',      #在使用路径标识时一定要记得加引号,否则报错
}
#创建用户资源清单
#如果用户属于多个辅助组,可以使用groups => ['puppet','mygrp'],数组的表示方式
puppet apply -v  user.pp
#应用此清单,即可创建资源



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
资源依赖/资源引用
user{'user1':
        ensure => present,
        uid => 3000,
        home => '/app',
        shell => '/bin/csh',
        groups => ['testgrp','mygrp'],
        require => [Group['testgrp'],Group['mygrp']],   #require引用资源,资源的首字母必须大写
}
group{'testgrp':
        ensure => present,
}
group{'mygrp':
        ensure => present,
}
#资源依赖,即要创建user1用户,必须存在testgrp和mygrp组,而且这两个组必须被引用
#除了require外,资源依赖还有一种表示方式:before,即某个资源被别的资源依赖,如下在testgrp组资源下定义
before => User['user1'],   #此组被user1用户资源所依赖,即此组要先存在才能创建user1

#总结,依赖关系用两种方式定义,一是被前资源依赖,一是被后资源依赖



3、package资源
安装软件包
1
2
3
4
5
6
cat package.pp  
package{'nginx':
        ensure => latest,
        name => nginx,
}
#就这些字段就可以将nginx安装了



4、service资源
启动服务
1
2
3
4
5
6
7
8
9
10
11
cat service.pp  
service{'nginx':
        ensure => running,   #是否开启服务
        enable => true,    #开机自启动
        hasrestart => true,  #是否有重启命令
        restart => "service nginx restart",    #设置重启命令
        require => Package['nginx'],         #开启服务依赖于package资源,只有先安装软件包才能启动服务
}
package{'nginx':
        ensure => latest,
}



5、file资源

管理文件,既能复制文件又能指定文件类型
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
类型一、文件
cat file.pp  
file{'/etc/nginx/nginx.conf':
        ensure => file,              #文件类型
        source => '/app/nginx.conf',     #要复制的原文件
        path => '/etc/nginx/nginx.conf',   #目标路径,与title重复,所以此处可以省略
        owner => root,
        group => root,
        mode => 0644,
}
#我们将nginx的配置文件监听端口修改为其他值如90,配置文件修改了,应该重启nginx服务,这部分后面会介绍
#以上实现复制文件的方法,下面进行目录的配置实现

类型二、目录
cat directory.pp  
file{'yum.repos.d':
        ensure => directory,
        path => '/tmp/yum.repos.d/',
        source => '/etc/yum.repos.d/',   #在/tmp下创建目录yum.repos.d,但是此目录下的文件是不会一并复制过来的
        recurse => true,          #所以需要使用递归参数recurse,将目录中的文件、子目录全复制到path指定路径下
}
#如果将文件复制到目录中,即source是文件而path是目录而且ensure也指定目录,最终复制是有问题的
#上述两个例子都是复制文件和目录,如果创建文件或目录则使用ensure指定present即可

类型三、符号链接

cat link.pp  
file{'/tmp/yum.d':            #本示例未使用path,则title充当目标路径,即在tmp目录下创建的文件为yum.d
        ensure => link,     #符号链接,创建的yum.d文件为软链接
        target => '/etc/nginx/nginx.conf',   #软链接文件指向的原始文件
}
#path或者title指定的是将要创建的对象,不论是文件还是目录
#符号链接文件的权限、属主、属组可以不用考虑


订阅和通知关系,下面通过综合示例说明订阅与通知关系

cat package.pp  
package{'nginx':
        ensure => latest,
        name => 'nginx',
}
#首先,安装软件包
file{'nginx.conf':
        ensure => file,
        path => '/etc/nginx/nginx.conf',
        source => '/app/nginx.conf',
        owner => 'root',
        group => 'root',
        mode => 0644,
        require => Package['nginx'],   #file资源依赖于package资源
        notify => Service['nginx'],    #当此配置文件修改时就会通知service资源,触发service的动作
}
#编辑配置文件,将修改后的文件通过file资源复制到目标
service{'nginx':
        ensure => running,
        name => 'nginx',
        hasrestart => true,
        restart => 'systemctl restart nginx',
        #subscribe => File['nginx.conf'],        #此资源订阅file资源,即file资源有改动此资源就会被通知并采取行动
}
#由于notify与subscribe都能感知变动并立即通知,所以二者的功能是重合的,只是放置的位置不同,因此只是用其中一个
#下述示例与本示例效果一样
package{'nginx':
        ensure => latest,
        name => 'nginx',
} ->    #此方法表示package资源先于file资源

file{'nginx.conf':
        ensure => file,
        path => '/etc/nginx/nginx.conf',
        source => '/app/nginx.conf',
        owner => 'root',
        group => 'root',
        mode => 0644,
} ~>    #此方法表示file资源通知service资源或者service资源订阅file资源

service{'nginx':
        ensure => running,
        name => 'nginx',
        hasrestart => true,
        restart => 'systemctl restart nginx',
}
#本例与上例效果都是一样的,此外还有第三种方法能够达到同样的效果
package{'nginx':
        ensure => latest,
        name => 'nginx',
}

file{'nginx.conf':
        ensure => file,
        path => '/etc/nginx/nginx.conf',
        source => '/app/nginx.conf',
        owner => 'root',
        group => 'root',
        mode => 0644,
}

service{'nginx':
        ensure => running,
        name => 'nginx',
        hasrestart => true,
        restart => 'systemctl restart nginx',
}

Package['nginx'] -> File['nginx.conf'] ~> Service['nginx']
#单独一处,定义依赖及通知关系



6、exec资源

类似于ansible中的shell
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
cat exec.pp  
exec{'mkdir':
        command => 'mkdir /tmp/test',          #执行的命令,创建目录
        path => '/bin:/sbin:/usr/bin:/usr/sbin',     #PATH变量的路径
        creates => '/tmp/test',              #如果此处的文件存在就不会执行command,否则执行
}
#本例中,creates只是在创建文件、目录时生效,如果是用户类命令则还需要其他参数

cat exec2.pp  
exec{'useradd':
        command => 'useradd user2',
        path => '/bin:/sbin:/usr/bin:/usr/sbin',
        unless => 'id user2',          #unless表示本命令执行失败才会执行command,即没有user2用户本命令才会执行失败
}
#unless表示除非,其为假才会执行command
#onlyif表示只有,其为真才会执行command

试想下,我们复制nginx的配置文件时,想将原文件做个备份,而不是向file复制那样直接覆盖,这样该怎么做
我们使用exec资源的refreshonly参数实现

cat exec3.pp  
file{'nginx.conf':
        ensure => file,
        source => '/app/nginx.conf',
        path => '/etc/nginx/nginx.conf'
}

exec{'backupfile':
        command => 'cp /etc/nginx/nginx.conf /tmp/nginx.conf.bak',
        path => ['/bin','/sbin','/usr/bin','/usr/sbin'],
        refreshonly => true,                #关键步骤,刷新功能启动
        subscribe => File['nginx.conf'],
}
#订阅参数指定依赖的资源,所以当file资源改变时触发exec资源
#此例实现配置文件修改,然后将原文件备份



7、cron资源
计划任务

1
2
3
4
5
6
7
8
9
cat cron.pp  
cron{'timesync':
        command => 'ntpdate 172.18.0.1 &> /dev/null',
        ensure => present,    #创建计划任务
        minute => '*/3',
        user => root,
}
#每3分钟以root的身份执行一次同步时间操作
crontab -l   #查看效果



8、notify资源
发送提示信息



结束

                                       


运维网声明 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-419545-1-1.html 上篇帖子: puppet权威指南(不用金币) 下篇帖子: Puppet 之 流程控制介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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