Puppet--自动化运维工具基本功能介绍

puppet与ansible都是运维自动化工具,两者最大的区别在于,puppet重量级适用于较大规模运维场景,而ansible较轻量级在较大规模站点的功能显得不那么强。
nginx

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


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

yum -y install  puppet

puppet获取帮助信息ruby

puppet help

puppet有两种工做模型bash

standalone模型  
master/agent模型

puppet的资源类型app

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

定义资源的语法
less

resource {'title':
    attribute  => value
    ……
}
#resource必须使用小写,title在同一资源中必须惟一


puppet的八种经常使用资源类型:
运维

一、group资源
ide

建立组工具

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参数
#若是此组已经存在,多执行几回命令结果都是不变的,由于此资源是幂等的

二、user资源

建立用户

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 
#应用此清单,便可建立资源
资源依赖/资源引用
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

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

三、package资源

安装软件包

cat package.pp  
package{'nginx':
        ensure => latest,
        name => nginx,
}
#就这些字段就能够将nginx安装了

四、service资源

启动服务

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

五、file资源

管理文件,既能复制文件又能指定文件类型

类型1、文件
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服务,这部分后面会介绍
#以上实现复制文件的方法,下面进行目录的配置实现

类型2、目录
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便可

类型3、符号连接

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']
#单独一处,定义依赖及通知关系

六、exec资源

相似于ansible中的shell

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资源
#此例实现配置文件修改,而后将原文件备份

七、cron资源

计划任务

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

八、notify资源

发送提示信息



结束

相关文章
相关标签/搜索