一、ruby介绍(pupet4以上已用其他语言重写)
puppet3以下版本是由ruby语言研发的,所以在学习Puppet之前,可以先了解下ruby语言。
ruby 是一种面向对象、命令式、函数式、动态的通用编程语言。在20世纪90年代中期由日本人松本行弘设计并开发,遵守BSD许可证和Ruby License。它的灵感与特性来自于Perl、Smalltalk、Eiffel、Ada以及Lisp语言。
Ruby的作者--松本行弘于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。之所以称为Ruby是取法自Perl,因为Perl的发音与6月的诞生石pearl(珍珠)相同,Ruby选择以7月的诞生石ruby(红宝石)命名。
特色
完全面向对象:任何东西都是对象,没有基础类型
变量没有类型(动态类型)
任何东西都有值:不管是四则运算、逻辑表达式还是一个语句,都有回传值。
运算符重载
垃圾回收
强类型
变量无需声明
在Windows上,加载DLL
注:puppet4已经“重构”,对比puppet3已经发生了“很大”的改变。可以看以下文章更详细的了解。http://www.cnblogs.com/yuxc/p/5945944.html
二、puppet介绍
puppet是一种Linux、Unix、windows平台的集中式的配置管理工具,通过自有配置语言对节点进行目标状态定义,并能够基于网络实现目标状态的维护。使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互。每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证和该配置信息同步。每个puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置客户端. 配置完成以后,puppet客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息.
master: 中心配置库
agent: 读取并应用配置的节点
puppet工作过程
1)定义:使用puppet特定的语言定义基础配置信息。通常将信息写在modules中。
2)模拟:在配置执行之前检测代码,但不真正执行。
3)执行:按步骤1)定义的配置自动部署。检测并记录下所发生变化的部分。
4)报告:将期待的变化、实际发生的变化及任何修改发送给报告系统。
puppet工作模型
三、puppet安装
3.1 安装puppet
解决依赖关系安装ruby模块:
1
|
yum
install
ruby ruby-libs ruby-shadow
|
安装puppet3
1
2
|
rpm -Uvh http:
//yum
.puppetlabs.com
/el/6Server/products/x86_64/puppetlabs-release-6-6
.noarch.rpm
yum clean all
|
服务器端安装:
1
|
yum
install
puppet-server
|
客户端安装:
1
|
yum
install
puppet
|
安装puppet4
1
|
yum localinstall http:
//yum
.puppetlabs.com
/puppetlabs-release-pc1-el-7
.noarch.rpm
|
服务器安装:
1
|
Yum
install
puppetserver
|
客户端安装:
1
|
yum
install
puppet
|
3.2 配置puppet
配置防火墙
1
|
iptables -A INPUT -m tcp -p tcp --dport 8140 -j ACCEPT
|
启动puppetserver服务:
设置主机名和指定的host。
Master
1
|
#hostname centos
|
Agent(3个客户端)
1
2
3
|
#hostname centos-test1
#hostname centos-test2
#hostname centos-test3
|
两端/etc/hosts同时添加:
1
2
3
4
|
192.168.39.135 centos
192.168.39.200 centos-test1
192.168.39.201 centos-test2
192.168.39.202 centos-test3
|
Master端/etc/puppetlabs/puppet/puppet.conf :
指定cert服务器名:
Agent端/etc/puppetlabs/puppet/puppet.conf:
指定puppet server端:
3.3 puppet agent ca认证
puppet认证机制:
master/agent:
1、master启动时会为自己生成Key, 并签署证书;
2、agent首次启动要为自己生成Key, 生成证书签署请求;
3、master收到agent端的签署请求后,要先验正请求是否合法,而后做证书签署;
Agent发起认证请求:
1
|
# puppet agent --test (同puppet agent -t)
|
Master查看认证请求:
1
|
[root@centos puppet]
# puppet cert --list
|
1
|
# puppet cert list --all
|
查看所有客户端的请求(有+号的代表已经签好证书可以通信,没有加号的代表尚未签好证书)
Master下发认证:
1
|
[root@centos puppet]
# puppet cert sign centos-test1
|
也可以使用命令puppet cert sign -all 受理所有认证
此时,认证请求已经没有了。
Agent确认已经成功:
Master清理证书:
1
|
[root@centos puppet]
# puppet cert clean centos-test1
|
注:所有证书文件在/etc/puppetlabs/puppet/ssl目录,证书文件可以删除但之后需要从新颁发认证。
可以通过以下命令查看ca证书文件内容。
1
|
openssl x509 -text -noout -
in
/etc/puppetlabs/puppet/ssl/certs/ca
.pem —查看ca证书里面的内容
|
puppet命令的用法格式:
1
|
Usage: puppet <subcommand> [options] <action> [options]
|
四、puppet资源详解
4.1 puppet资源
如果把OS的所有配置,如用户账号、特定的文件、文件所属的目录、运行的服务、程序包以及cron任务等,看作是许多独立原子单元的集合的话,这些所谓的“单元”就是“资源”,不过,这些资源在其大小、复杂程度以及生命周期的跨度上等多个维度上可能会各不相同。
通常来说,类属于同一种资源的属性是相近的,如文件都有其属主和属组,而用户账号则由用户名、UID、GID等组成。但,即便是同一种资源,其在不同OS上的实现方式却又可能各不相同,例如,在windows上和Linux上启动和停止服务的方式相去甚远。
因此,puppet从以下三个维度来对资源完成抽象。
相似的资源被抽象成同一种资源“类型”,如程序包资源、用户资源及服务资源等;
将资源属性或状态的描述与其实现方式剥离开来,如仅说明安装一个程序包而不用关心其具体是通过yum、pkgadd、ports或是其它方式实现;
仅描述资源的目标状态,也即期望其实现的结果,而不是其具体过程,如“确定nginx运行起来”而不是具体描述为“运行nginx命令将其启动起来”;
这三个也被称作puppet的资源抽象层(RAL)。RAL由type(类型)和provider(提供者,即不同OS上的特定实现)组成。
1.2 puppet资源解构
在为puppet定义一个资源时,需要为其指定所属的类型和资源标题,并同时配置一系列的属性和对应的值。puppet通过其特有的语言来描述和管理资源,如下面所示的资源定义。
1
2
3
4
5
6
7
8
|
user {
'test'
:
ensure => present,
uid =>
'601'
,
gid =>
'601'
,
shell =>
'/bin/bash'
,
home =>
'/home/test'
,
testhome =>
true
,
}
|
这种语法被称作“资源申报(resource declaration)”,它是puppet语言的核心组成部分。上述的定义中,仅描述了资源的目标状态而没有提到为达成目标所需要采取的任何步骤。而资源定义的核心也可以抽象为type、title、attribute和value四个部分。
puppet有许多内置的资源类型,而通过安装插件还可以继续新增额外的类型。可以通过puppet官方的类型参考页面(http://docs.puppetlabs.com/references/latest/type.html)获取详细的信息。也可以使用“puppet describe”命令来获取puppet当前所支持的类型列表及每种类型的详细信息,下面给出了一个简要的使用说明。
puppet describe -l:例如puppet支持的所有资源类型及其描述信息;
puppet describe -s <TYPE>:列出指定资源的简要说明;
puppet describe <TYPE>:显示指定资源的详细说明;
常用的资源类型:user, group, file, package, service, exec, cron, notify
group:
管理组资源
常用属性:
name: 组名,NameVar
gid:GID
system: true, false
ensure: , absent
members:组内成员
user:
管理用户
常用属性:
commet:注释信息
ensure:present, absent
expiry:过期期限;
gid:基本组id
groups:附加组
home:家目录
shell:默认shell
name: NameVar
system:是否为系统用户,true|false
uid: UID
password:
file:
管理文件及其内容、从属关系以及权限;内容可通过content属性直接给出,也可通过source属性根据远程服务器路径下载生成;
指明文件内容来源:
content:直接给出文件内容,支持\n, \t;
source:从指定位置下载文件;
ensure:file, directory, link, present, absent
常用属性:
force:强制运行,可用值yes, no, true, false
group:属组
owner:属主
mode:权限,支持八进制格式权限,以及u,g,o的赋权方式
path:目标路径;
source:源文件路径;可以是本地文件路径(单机模型),也可以使用puppet:///modules/module_name/file_name;
target:当ensure为“link”时,target表示path指向的文件是一个符号链接文件,其目标为此target属性所指向的路径;此时content及source属性自动失效;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
file
{
'/tmp/mydir'
:
ensure => directory,
}
file
{
'/tmp/puppet.file'
:
content =>
'puppet testing\nsecond line.'
,
ensure =>
file
,
owner =>
'centos'
,
group =>
'distro'
,
mode =>
'0400'
,
}
file
{
'/tmp/fstab.puppet'
:
source
=>
'/etc/fstab'
,
ensure =>
file
,
}
file
{
'/tmp/puppet.link'
:
ensure => link,
target =>
'/tmp/puppet.file'
,
}
|
exec:
运行一外部命令;命令应该具有“幂等性”;
幂等性:
1、命令本身具有 幂等性;
2、资源有onlyif, unless,creates等属性以实现命令的条件式运行;
3、资源有refreshonly属性,以实现只有订阅的资源发生变化时才执行;
command:运行的命令;NameVar;
creates:此属性指定的文件不存在时才执行此命令;
cwd:在此属性指定的路径下运行命令;
user: 以指定的用户身份运行命令;
group: 指定组;
onlyif:给定一个测试命令;仅在此命令执行成功(返回状态码为0)时才运行command指定的命令;
unless:给定一个测试命令;仅在此命令执行失败(返回状态码不为0)时才运行command指定的命令;
refresh:接受到其它资源发来的refresh通知时,默认是重新执行exec定义的command,refresh属性可改变这种行为,即可指定仅在refresh时运行的命令;
refreshonly:仅在收到refresh通知,才运行此资源;
returns:期望的状态返回值,返回非此值时表示命令执行失败;
tries:尝试执行的次数;
timeout:超时时长;
path:指明命令搜索路径,其功能类型PATH环境变量;其值通常为列表['path1', 'path2', ...];如果不定义此属性,则必须给定命令的绝对路径;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
exec
{
'/usr/sbin/modprobe ext4'
:
user=> root,
group=> root,
refresh=>
'/usr/sbin/modprobe -r ext4 && /usr/sbin/modprobe ext4'
,
timeout=> 5,
tries=> 2,
}
exec
{
'/bin/echo helloworld. > /tmp/hello.txt'
:
user=> root,
group=> root,
creates=>
'/tmp/hello.txt'
,
}
exec
{
'/bin/echo helloworld > /tmp/hello2.txt'
:
user=> root,
group=> root,
unless=>
'/usr/bin/test -e /tmp/hello2.txt'
,
}
|
notify:
核心属性:
message:要发送的消息的内容;NameVar
notify{"hello there.": }
cron:
管理cron任务;
常用属性:
ensure:present, absent
command:要运行的job;
hour:
minute:
month:
monthday:
weekday:
name:
user:运行的用户
environment:运行时的环境变量;
1
2
3
4
5
|
cron{
"sync time"
:
command=>
'/usr/sbin/ntpdate 172.16.0.1 &> /dev/null'
,
minute=>
'*/10'
,
ensure=> present,
}
|
package:
管理程序包;
常用属性:
ensure: installed, latest, VERSION(2.3.1-2.el7),present, absent
name:程序包名称;
source:包来源;可以本地文件路径或URL;
provider:rpm
1
2
3
4
5
6
7
8
|
package{
'zsh'
:
ensure=> latest,
}
package{
'jdk'
:
ensure=> installed,
source
=>
'/usr/local/src/jdk-8u25-linux-x64.rpm'
,
provider => rpm,
}
|
service:
管理服务;
常用属性:
enable:是否开机自动启动,true|false;
ensure:启动(running), 停止(stopped);
hasrestart:是否支持restart参数;
hasstatus:是否支持status参数;
name:服务名称,NameVar
path:脚本查找路径;
pattern:用于搜索此服务相关的进程的模式;当脚本不支持restart/status时,用于确定服务是否处于运行状态;
restart:用于执行“重启”的命令;
start:用于执行“开始”的命令;
stop: 用于执行“停止”的命令;
status:用于执行“状态查询”的命令;
1
2
3
4
5
6
7
8
9
10
|
package{
'nginx'
:
ensure=> latest,
}
service{
'nginx'
:
ensure=> running,
enable
=>
true
,
hasrestart =>
true
,
hasstatus =>
true
,
restart=>
'systemctl reload nginx.service'
,
}
|
1.3 定义资源
如前所述,资源是puppet用于模型化系统配置的基础单元,每个资源都都从某个角度描述了系统属性,如某程序包必须安装或某用户必须移除等。在puppet,用于完成此类功能的代码也即“资源申报”。
1
2
3
|
type
{
'title'
:
attribute => value,
}
|
在定义时,资源类型必须使用小写字符;而资源名称仅是一个字符串,但要求在同一个类型中其必须惟一,这意味着,可以同时有名为nginx的“service”资源和“package”资源,但在“package”类型的资源中只能有一个名为“nginx”。
尚未完成,参考:http://docs.puppetlabs.com/puppet/latest/reference/lang_resources.html
1.4 资源的浏览及查找
“puppet resource”命令可用于交互式查找及修改puppet资源。
# puppet resource <TYPE> [<NAME>] [ATTRIBUTE=VALUE ...]
未完待续....