puppet是一个IT基础设施自动化管理工具,帮助系统管理员管理基础设施的整个生命周期:provisioning(供应)、configuration(配置)、orchestration(联动)及reporting(报告);
puppet基于套接字实现,有两种工作模型:单机模型(standalone)和master/agent模型;当然master/agent模型应用最广泛;master/agent模型中需要agent,可以使用虚拟账号(安全性高),agent可以限制登录用户的管理权限,master-agent模型是基于https交换数据(只是一个协议,不用通过网络页面链接);支持多环境配置(默认环境是生产环境);使用ruby语言研发;适用于大型企业;
Ansible靠模块实现,而puppet靠的是资源实现;puppet的模块类似于Ansible的角色roles;定义的模块是为了复用,不是为了管控;定义模块的文件叫资源清单(manifest);为每个站点主机定义具体使用哪个模块的叫站点清单(sitemanifest);
今天边先结合单机模式讲一下puppet的资源;
puppet基本语法格式:puppet
subcommand:
help Display Puppet help.
apply Apply Puppet manifests locally
describe Display help about resource types
agent The puppet agent daemon
master The puppet master daemon
module Creates, installs and searches formodules on the Puppet Forge
在单机模式下,应用资源的是apply,既编译又运行;
puppet apply:Applies a standalone Puppet manifest to the local system.
用法:puppetapply [-d|--debug] [-v|--verbose][-e|--execute] [--noop] <file>
puppet describe 资源类型:Prints help about Puppet resource types, providers, andmetaparameters.
用法:puppetdescribe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta][type]
-l:列出所有资源类型;
-s:显示指定类型的简要帮助信息;
-m:显示指定类型的元参数,一般与-s一同使用;
资源定义:向资源类型的属性赋值来实现,可称为资源类型实例化; 定义了资源实例的文件即清单,manifest;
定义资源语法:(定义在.pp结尾的资源清单列表文件中)
type { ‘title’:
attribute1 =>value1,
attribute2 =>value2,
……
}
注意:type必须小写,title是一个字符串,在同一类型中必须唯一;
资源属性中的三个特殊属性:
Namwvar:可建成name(name可省略,此时将由title表示);
ensure:资源的目标状态;
Provider:指明资源的管理接口;
八种核心资源:user、group、file、package、service、cron、exec、notify;
属性:
name:用户名(不写时表示与title同名);
uid: UID;
gid:基本组ID;
groups:附加组,不能包含基本组;
comment:注释;
expiry:过期时间 ;
home:家目录;
shell:默认shell类型;
system:是否为系统用户 ;
ensure:present/absent;
password:加密后的密码串;
eg:/etc/puppet/manifest/user.pp
user{'sjj':
ensure => present,
system => false,
comment => 'A good Girl',
home => '/app/sjj',
uid => 2000,
}
在apply应用时可以先测试,dry run;
puppet apply -v --noop user.pp #只测试,不真正执行,-v:显示详细信息
puppet apply -v user.pp #执行时将-noop去掉,-v可以将执行过程中的信息显示;
属性:
name:组名;
gid:GID;
system:是否为系统组,true OR false;
ensure:目标状态,present/absent;
members:成员用户;
属性:
ensure:installed, present, latest, absent, any version string (implies present)
name:包名;
source:程序包来源,仅对不会自动下载相关程序包的provider有用,例如rpm或dpkg;
provider:指明安装方式;
platform:平台(X86_63…..)
属性:
enable:是否开机自起(true/false);
binary:启动程序的二进制路径
hasrestart:是否支持传参数重起(true:直接restart;false:先stop再start);
restart:定义重启命令,通常用于定义reload操作;
stop:
start:手动定义启动命令;
status:
path:脚本的搜索路径,默认为/etc/init.d/;
ensure:stopped/false;running/true;
属性:
path:文件路径;(相当于name)
content:定义文件内容(只是少量信息);
source:复制目标文件到path;
recurse:递归复制文件到path;(true/false)
ensure:present、file、directory、link、absent;
file:类型为普通文件,其内容由content属性生成或复制由source属性指向的文件路径来创建;
link:类型为符号链接文件,必须由target属性指明其链接的目标文件;
directory:类型为目录,可通过source指向的路径复制生成,recurse属性指明是否递归复制;
target:链接文件link路径;
owner:属主
group:属组
mode:权限;
eg:
file{'test.txt':
path => '/tmp/test.txt',
ensure => file,
source => '/etc/fstab',
}
file{'test.symlink':
path => '/tmp/test.symlink',
ensure => link,
target => '/tmp/test.txt',
require => File['test.txt'],
}
file{'test.dir':
path => '/tmp/test.dir',
ensure => directory,
source => '/etc/yum.repos.d/',
recurse => true,
}
注意:
1、资源引用时格式必须为Type[‘title’],类型首字母必须大写;
2、依赖关系:before/require
A before B: B依赖于A,定义在A资源中;
{
...
before => Type['B'], #也可以用"->'表示before
...
}
B require A: B依赖于A,定义在B资源中;
{
...
require => Type['A'],
...
}
3、通知关系notify/subscribe:通知相关的其它资源进行“刷新”操作;
notify
A notify B:B依赖于A,且A发生改变后会通知B;
{
...
notify => Type['B'], #也可以使用'~>'表示notify;
...
}
subscribe
B subscribe A:B依赖于A,且B监控A资源的变化产生的事件;
{
...
subscribe => Type['A'],
..
}
eg:
package{'redis':
ensure => installed,
}-> #先下载redis包
file{'/etc/redis.conf':
ensure =>file,
source => '/root/puppet/manifests/files/redis.conf',
owner => redis,
group => root,
mode => '0640'
}~> #若是配置文件有改变就通知service;
service{'redis':
ensure => running,
enable => true,
hasrestart => true
}
#或者在上面不写,直接在最后写:
Package['redis'] -> File['/etc/reids.conf'] ~> Service['redis']
属性:
command (namevar):要运行的命令(命令具有幂等性);
cwd:The directory from which to run the command.
creates:文件路径,仅此路径表示的文件不存在时,command方才执行;
user/group:运行命令的用户身份;
path:指明搜索路径;
onlyif:此属性指定一个命令,此命令正常(退出码为0)运行时,当前command才会运行;
unless:此属性指定一个命令,此命令非正常(退出码为非0)运行时,当前command才会运行;
refresh:重新执行当前command的替代命令;
refreshonly:仅接收到订阅的资源的通知时方才运行;
eg:刷新服务
package{'redis':
ensure => installed,
}
file{'/etc/redis.conf':
ensure =>file,
source => '/root/puppet/manifests/files/redis.conf',
owner => redis,
group => root,
mode => '0640'
}
exec{'redis':
command => '/usr/bin/redis-server /etc/redis.conf --daemonize yes',
refresh => '/usr/bin/kill $(/usr/sbin/pidof redis-server); /usr/bin/redis-server /etc/redis.conf --daemonize yes',
user => 'redis',
group => 'redis',
}
Package['redis'] -> File['/etc/reids.conf'] ~> Exec['redis']
属性:
command:要执行的任务;
ensure:present/absent;
minute:分
hour:时
monthday:日
month:月
weekday:周
user:以哪个用户的身份运行命令
target:添加为哪个用户的任务
name:cron job的名称;
eg:
cron{'backup-mysql':
command => '/usr/bin/mysqldump --all-databases --lock-all-tables --flush-log --master-data=2 > /backup/`date +%F-%T`-all.sql',
ensure => present,
weekday => '1',
target => 'root'
}
属性:
message:信息内容
name:信息名称;
为资源定义tag;格式:
type{'title':
...
tag => 'TAG1',
}
type{'title':
...
tag => ['TAG1','TAG2',...],
}
手动调用:
puppet apply --tags TAG1,TAG2,... FILE.PP