一、pupper概述
puppet,这是目前运维主流的运维自动化工具,大多数运维管理人员都听说过,或者在使用以及在正在考虑使用中。puppet可以配合cobbler,puppet也可以配合func实现运维自动化,简单化,化繁杂为简单。
1.什么是puppet
puppet是一种Linux、Unix平台的集中配置管理系统,使用ruby语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
2.puppet的语法
由于puppet是由ruby写的,因此如ruby语法非常相近,关于ruby的介绍:请参阅http://ruby-lang.org
3.puppet能管理哪些资源:
能管理file(文件),user(用户),group(组),package(软件包),mount(挂载),schedule和cron(计划任务),service(服务),tidy(清理),yumrepo(yum仓库),sshkey(ssh认证)等常用资源。
4.Puppet的工作模式
Puppet是一个C/S架构的配置管理工具,在中央服务器上安装puppet-server软件包(被称作Puppetmaster)。在需要管理的目标主机上安装puppet客户端软件(被称作PuppetClient)。
当客户端连接上Puppetmaster后,定义在Puppetmaster上的配置文件会被编译,然后在客户端上运行。每个客户端默认每半个小时和服务器进行一次通信,确认配置信息的更新情况。如果有新的配置信息或者配置信息已经改变,配置将会被重新编译并发布到各客户端执行。也可以在服务器上主动触发一个配置信息的更新,强制各客户端进行配置。如果客户端的配置信息被改变了,它可以从服务器获得原始配置进行校正。
二、puppet的单机应用
1、安装puppet
下载此安装包文件夹
puppet安装包
[root@mariadb ~]# cd 2.7.25/ [root@mariadb 2.7.25]# yum -y install facter-1.7.3-1.el6.x86_64.rpm puppet-2.7.25-1.el6.noarch.rpm
2、puppet常用资源
2.1如何定义资源
资源是puppet用于模型化系统配置的基础单元,每个资源都从某个角度描述了系统属性,如某程序包必须安装或某用户必须移除等,在puppet,用于完成此类功能的代码也即“资源申报”
格式:
type { ‘title’:
atttibue => value,
}
注:资源的文件统一以.pp结尾
在定义时,资源类型必须使用小写字母,而资源名称仅是一个字符串,但要求在同一类型中期必须唯一
2.2、package资源:puppet管理软件包
puppet支持使用的软件包管理器:yum,rpm,apt,prots,gem,msi,dpkg,pkg
常用的参数:
ensure:程序包的目标状态,值有present(installed)、absent(不存在)、purged、held、latest
name:资源的名称,即软件包的名字,可以省略,如果省略,将继承title的值
provide:软件包管理器
source:指定程序包文件路径
install_options:安装选项,最常用的是通过INATALLDIR来制定安装目录
2.3、service资源:用于定义服务的状态
常用的参数
ensure:服务的额目标状态,值有true(running)和false(stopped)
enable:是否开机自动启动,值有true和false
name:服务名称,可以省略,如果省略,将继承title的值
path:服务脚本路径,默认为/etc/init.d/下
start:定制启动命令
stop:定制关闭命令
restart:定制重启命令
status:定制状态
示例:
[root@localhost tmp]# vim test1.pp //添加如下: package {'nginx': ensure => present, } service {'nginx': ensure => true, enable => true, }
注:此资源会自动安装nginx,并且使之立即启动,开机启动
可以使用此命令检查语法:
[root@localhost tmp]# puppet parser validate /tmp/test1.pp
如何使用此命令在本地应用:
puppet apply test1.pp
2.4、file资源
此资源可以管理文件、目录、软链接;生成文件内容;管理文件权限、属性;也可以通过source属性到指定位置下载文件;通过recurse属性来获取目录
常用参数:
ensuce:目标状态,值有absent, present, file, 和directory.
backup:通过filebacket资源来备份文件,值通常为filebucket资源的名称
content:文件内容,生成方式有三种(content,source,target),三者彼此互斥,
使用template模板生成属性时为content,如:content =>template(‘module_name/template_file_name’)
source:通过制定的url下载文件至本地,获取文件格式为:puppet:///modules/MODULE_NAME/file_names
target:为符号链接指定目标
links:文件为符号连接,值为“follow”,“manage”
path:文件路径,必须使用双引号
mode:定义权限,通常为8进制数字
owner: 定义文件的属主
group:定义文件的属组
force:强制执行删除文件、链接或目录、仅用于ensure为absent时
purge:清除指定目录中存在的,但未在资源中定义的文件
resurce:目录递归,值为true,false,inf,remote
replace:替换,本地存在的文件与资源中指定的文件内容不同时是否执行替换,默认为否
示例:
[root@localhost tmp]# vim test2.pp //添加如下: file {'abc.txt': ensure => present, content => 'Hello puppet', path => "/tmp/abc2.txt", } file {'fstab.symbolic': ensure => present, target => "/etc/fstab", path => "/tmp/fstab.symbolic", links => follow, }
注:此资源会生成abc2.txt文件和fstab.symbolic这个链接文件。
2.5、exec资源
执行命令,通常在不得不用时才使用,慎用,通常用于完成puppet自身无法完成的功能
常用的参数:
command:要执行的命令,通过为命令文件的完整路径
path:命令搜索路径
group:执行命令的组
user:执行命令的用户
onlyif:0,表示仅在命令的状态返回值为0时才执行此命令
refresh:定义接受的其他资源的通知时,则要重新执行此命令
refreshonly:仅被当被依赖的资源发生改变时才被触发
tries:尝试次数,默认为1
try_sleep:多次尝试之间的时间间隔
示例:
[root@localhost tmp]# vim test3.pp //添加如下: exec {'echo command': command => 'echo "hello puppet" >> /tmp/command.txt ', path => '/bin:/sbin:/usr/bin:/usr/sbin', refreshonly => true, } exec {'mkdir': command => 'mktemp /tmp/tmp.XXXX', path => '/bin:/sbin:/usr/bin:/usr/sbin', }
注:此资源会echo出信息和创建个随机文件
[root@localhost tmp]# vim test4.pp //添加如下: file {'/tmp/test4.txt': ensure => file, content => "hello puppet", notify => Exec['monitor'] } exec {'monitor': command => 'echo "/tmp/test4.txt changed" >> /tmp/monitor.txt', # subscribe => File['/tmp/test4.txt'], path => '/bin:/sbin:/usr/sbin:/usr/bin', refreshonly => true, }
注:此资源会创建test4.txt文件,并且当此文件内容改变时,输出信息
2.6、group资源:管理系统上的用户组
常用参数:
ensure:目标状态,present,absent
name:组名
gid:GID
system:系统组
2.7、user:管理用户
常用参数:
ensure:目标状态,present,absent
name:用户名
uid:用户uid
system:系统用户
home:用户家目录
shell:用户默认shell
gid:用户的gid
password:密码,使用加密后密码
magagehome: 是否创建家目录,默认为false
示例:
[root@localhost tmp]# vim test5.pp //添加如下: group {'testgrp': ensure => present, gid => 1001, } user {'testuser': ensure => present, gid => 1001, uid => 1001, home => ' /home/test', shell => '/bin/bash', password => '$1$a8edbf1f$u4bv1EahJEAfYxWIDyXKn.', managehome => true, }
注:此资源会创建testuser用户,密码可以使用此命令生成:
[root@localhost tmp]# openssl passwd -1 -salt `openssl rand -hex 4`
2.8、cron资源:定义周期性任务
常见属性:
ensure:目标状态,present,absent
command:命令或脚本
environment:运行时的环境变量
hour:小时
mouth:月
monthday:日
weekday:周
minute:分
name:名称
user: 默认为root
2.9、notify资源: 调试输出
常用参数
message: 信息
name: 信息名称
示例:
[root@localhost tmp]# vim test6.pp //添加如下: file {'/tmp/test4.txt': ensure => file, content => "hello puppet", notify => Notify['notice'], } notify {'notice': message => '/tmp/test4.txt changed'}
3、puppet变量
puppet的变量名称以“$”开头,赋值操作符为“=”,应用变量值为“”,或者什么都不写
puppet的变量可以接受的数据类型:
布尔型:true和false,不能加引号,if语句的测试条件和比较表达式都会返回布尔型值,另外,其他数据类型也可以自动转换为布尔型,如空字符串为false等
undef:从未声明的变量的值类型即为undef,也可以手动为某变量赋予undef值,即直接使用不加引号的undef字符串
字符型:非结构化的文本字符串,可以使用引号,也可以不用。单引号中的变量不会替换,而双引号中的能够进行变量替换;字符型也支持使用转移符
数值型:可为整数或浮点数,不过,puppe只有在数值上下文才把数值当数值对待,其他清理下一律以字符型处理
数组:数组值为中括号“[]”中的以逗号分隔的项目列表,最后一个项目后面可以有逗号;数组中的袁术可以为任何可用数据类型,包括hash或其他数组,属组索引为从0开始的整数,也可以使用负数索引
hash:即为外键值数据类型,键和值之间使用“=>”分隔,键值对定义在“{ }”中,彼此间以逗号分隔;其键位字符型数据,而值可以为puppet支持的任意数据类型,访hash类型的数据元素要使用“键”当作索引进行
正则表达式:属于puppet的非标准数据类型,不能赋值给变量,仅能用于有限的几个接收正则表达式的地方,即接受使用“=~”及“!~”匹配操作符的位置,通常包括case语句中的selector,已经节点名称匹配的位置,他们不能传递给函数或用于资源属性的定义
facter变量:可以通过facter查看
内置变量:
agent端:$environment,$clientcert,$clentbversion
server端:$servername,$serverip,$serverversion
puppet中的正则表达式支持使用(?<ENABLED OPTION>:<SUNPATTERN>)和(?-<DISABLED OPTION>:<SUNPATTERN>)两个特殊的符号,
如下面的示例,表示做正则表达式匹配时启用选项“i(忽略字符大小写)”,但不支持使用“m(把.当作换行符)”和启用“x(忽略模式中的空白字符和注释)”
$packages = $operatingsystem ? { /(?i-mx:ubuntu|debian)/ => 'apache2', /(?i-mx:centos|fedora|redhat)/ => 'httpd', }
4、puppet的判断语句
puppet的判断语句主要有三种分别为if,case,selector
if语句示例:
[root@localhost tmp]# vim test8.pp //添加如下: if $operatingsystem =='CentOS' { notify {'centos': message => "welcome to Centos Linux"} } elsif $operatingsystem =='RedHat' { notify {'redhat': message => "welcome to Redhat Linux"} } elsif $operatingsystem =='Fedora' { notify {'fedora': message => "welcome to Fedora Linux"} } else { notify {'unknow': message => "Unknown operating system"} } if $operatingsystem =~/^(?i-mx:(centos|redhat|fedora))/{ notice("welcome to $1 linux system") }
注:此资源包含了if的单分支语句和多分支语句,效果是一样的
selector语句示例:
[root@localhost tmp]# vim test9.pp //添加如下: $webserver = $operatingsystem ? { /^(?i-mx:centos|fedora|redhat)/ => 'httpd', /^(?i-mx:ubuntu|debian)/ => 'apache2', } $webprovider = $operatingsystem ? { /^(?i-mx:centos|fedora|redhat)/ => 'yum', /^(?i-mx:ubuntu|debian)/ => 'apt', } package {"$webserver": ensure =>present, provider => $webprovider, }
case语句示例:
[root@localhost tmp]# vim test10.pp //添加如下: case $operatingsystem { /^(?i-mx:redhat|centos|fedora)/: { package {'httpd': ensure => present, provider => yum, } } /^(?i-mx:ubuntu|debian)/: { package {'apache2': ensure => present, provider => apt, } } default: { notify {'notice': message => "unknown system.", }} }
好了,到此,puppet的安装与单机应用已经介绍完毕,下次我们来介绍下在C/S模式下的puppet应用!