一、概述

1.1 puppet的概念

Puppet是一款使用GPLV2X协议授权的开源管理配置工具,用Ruby语言开发。其既可以通过客户端–服务器的方式运行,也可以独立运行。Puppet可以为系统管理员提供方便、快捷的系统自动化管理。对于系统管理员来说通过Puppet配置管理系统,底层的操作系统的发行版本是透明的,Puppet通过(Provider又称提供者)属性来完成软件的配置与安装,管理员不必关心操作系统的种类与发行版本,

Puppet还可以提供一个强大的框架来完成系统管理功能,在框架的基础上系统管理员可以通过Puppet语言来描述系统的一些事务,如安装软件、初始化系统、启动、删除服务、推送配置文件和差异化配置管理服务器等。同时系统管理员和系统管理员之间可以分享用Puppet语言描述好的事务,从而减少重复劳动,提高工作效率。

1.2 puppet工作模型

a.部署调度

puppet master在一台服务器以守护进程方式运行,同时也包含客户端各节点的配置信息,puppet agent 在与master的通信过程中,通过标准的SSL协议进行加密和验证,验证通过后,agent从masteer上读取响应节点信息应用在本地。

b.配置语言和资源抽象

puppet使用描述性语言来定义配置项,在puppet中将配置项被称为resource,当Agent连接Master时,Master并不知道Agent的操作系统型号和版本。Agent通过Facter工具收集系统相关信息,并通过SSL协议将Agent的信息传递给Master。Master根据Agent收集到的相关信息,通过资源的提供者来为Agent服务。比如Package资源收到Agent的信息后,会识别Agent的系统型号版本,并通过资源提供者(如yum aptitude pkgadd apt-get等)匹配,为Agent服务。

c.事物层

Puppet事务层其实就是它的解析引擎。Puppet事务层配置每一台主机的过程包括:

  • 解析和配置编译。

  • 将编译好的配置同步到Agent。

  • 在Agent上应用配置。

  • 向Master报告运行结果。

首先Puppet会创建一个图表来表示所有资源的关系和上下游执行顺序,以及和Agent的关系。然后

Puppet将按照资源之间的关系和上下游顺序依次执行。
接着Puppet为每一个Agent获取相应的资源,并把它们编译成“目录”,然后将目录依次分发到各
主机,并通过Agent来应用它们,最后应用结果以报告形式反馈给Master。

1.3 puppet的细节和原理

Puppet采用了非常简单的C/S架构,所有数据的交互都通过SSL进行,以保证安全。

1.客户端Puppetd向Master发起认证请求,或使用带签名的证书。

2.Master告诉Client你是合法的。

3. 客户端Puppetd调用Facter,Facter探测出主机的一些变量,例如主机名、内存大小、IP地址

等。Puppetd将这些信息通过SSL连接发送到服务器端。
4. 服务器端的Puppet Master检测客户端的主机名,然后找到manifest对应的node配置,并对该
部分内容进行解析。Facter送过来的信息可以作为变量处 理,node牵涉到的代码才解析,其他
没牵涉的代码不解析。解析分为几个阶段,首先是语法检查,如果语法错误就报错;如果语法
没错,就继续解析,解析的结 果生成一个中间的“伪代码”(catelog),然后把伪代码发给客
户端。
5. 客户端接收到“伪代码”,并且执行。
6. 客户端在执行时判断有没有File文件,如果有,则向fileserver发起请求。
7. 客户端判断有没有配置Report,如果已配置,则把执行结果发送给服务器。
8. 服务器端把客户端的执行结果写入日志,并发送给报告系统。

二、安装部署

主机清单

主机名
IP地址
系统
puppet-master
172.20.4.50 CentOS release 6.9 (Final)
puppet-1 172.20.4.51 CentOS release 6.9 (Final)
puppet-2 172.20.4.52 CentOS release 6.9 (Final)

2.1 初始化环境:

yum install ntpdate -y && ntpdate time1.aliyun.com                    #同步时间service iptables stop                                                 #关闭iptablessed -i "s/SELINUX=enforcing/SELINUX=disabled/"  /etc/selinux/config   #关闭selinuxsetenforce 0
设置主机直接可以通过主机名相关访问,在三台主机修改/etc/hosts文件127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4::1         localhost localhost.localdomain localhost6 localhost6.localdomain6172.20.4.50  puppet-server172.20.4.51  puppet-1172.20.4.52  puppet-2

2.2 master端安装配置

rpm -ivh yum install -y puppet-server facter puppet

编辑/etc/puppet/puppet.conf

[main]logdir = /var/log/puppetrundir = /var/run/puppetssldir = $vardir/ssl[agent]classfile = $vardir/classes.txtlocalconfig = $vardir/localconfigcertname = puppet-server		#设置本机的certname名称server = puppet-server		        #设置指向puppetmaster进行身份验证[master]certname = puppet-server		###设置puppetmaster认证服务器名称
/etc/init.d/puppetmaster startchkconfig puppetmaster on

查看端口和进程

2.3 agent端安装配置

rpm -ivh yum install -y puppet facter

编辑/etc/puppet/puppet.conf

[agent]    classfile = $vardir/classes.txt    localconfig = $vardir/localconfig    certname = puppet-2			        #设置本机的certname名称    server = puppet-server			#指向puppetmaster进行身份验证

启动服务

/etc/init.d/puppet start

2.4 证书签发

在master端查看证书

没有带“+”说明没有进行身份验证

puppet cert --sign puppet-1  签发证书puppet cert --sign puppet-2#puppet cert clean puppet-2   清理证书

在agent端验证

三、puppet文件资源

3.1 /etc/puppet配置目录:

[root@puppet-server ~]# tree /etc/puppet//etc/puppet/├── auth.conf                        #认证配置文件├── environments                 │   └── example_env│       ├── manifests│       ├── modules│       └── README.environment├── fileserver.conf├── manifests                  #文件存储目录(puppet 会先读取该目录的.PP 文件
)├── modules                    #定义模块└── puppet.conf                ##主配置配置文件,详细内容可执行 puppet --genconfig

3.2 模块目录结构

模块:目录结构    module_name/        manifests/            init.pp:包含一个与模块名称同名的类            *.pp:一个清单文件通常只包含一个类,而且建议清单文件名与类名相同 nginx::web文件名为web.pp            web/                *.pp            访问路径:module_name::mainfest_file_name,module_name::subdir_name::manifest_file_name        files/            访问路径:puppet:///modules/module_nname/file_name            nginx_web/                puppet:///modules/module_name/subdir/file_name        templates/            *.erb:使用模块函数template()装载并运行其中模块语言,运行后会生成静态文件            访问路径 templates(‘moduleName/templates’)        lib/            用户自定义的插件目录        tests/            当前模块的使用说明和样例        spec/            为lib目录中的插件提供使用说明和样例        在模块根目录下,通常还应该具有几个文档            LICENSE            Modulefile            README

3.3 puppet命令

puppet 命令总结    apply,agent,master,cert,describe    apply:应用本地清单文件    agent:客户端进程    master:服务端进程    cert:证书管理    describe:资源帮助信息    module:模块管理    kick:master触发模式    帮助类命令        describe        doc:生成puppet文档        help:查看帮助        resource:查看资源帮助        status:查看puppe状态    master命令的选项        --no-daemonize:非守护进程        --daemonize:-D        --debug -d        --verbase -v        --genconfig    agent命令的常用选项        --daemonize,-D        --no-daemonize        --debug -d        --verbose -v        --noop:no operation 模式,不真正应用catalog        --test:测试        --waitforcert:等待证书签署成功    apply命令的常用选项        --debug -d        --verbose -v        --execute -e        --modulepath    cert命令的常用操作        list        sign:签署        clean:清除证书        revoke:吊销证书        verify:验证本地指定的证书        generate:为客户端生成证书

3.4 puppet资源清单

puppet 资源    type { 'title':        attibute => value,    }    而资源定义的核心也可以抽象为type、title、attribute和value四个部分。type分类:package:    puppet支持使用的软件包管理器        yum,rpm,apt,ports,gem,msi,dpkg,pkg    常用的参数        ensure:程序包的目标状态        name:资源的名称,即软件包的名字        provider:软件包管理器        source:指定程序包文件路径        install_options:安装选项,最常用的是通过INSTALLDIR来制定安装目录        window下安装mysql        package{‘mysql:            ensure => install,            provider =>'msi',            source => 'D:\software\mysql-5.5.36.msi',            install_options => { 'INSTALLDIR' => 'c:\mysql' },        }service:    常用参数:        ensure:服务的目标状态,ture(启动)和false(关闭)        enable:是否开机自动启动,ture(启动)和false(关闭)        name:服务名称        path:服务脚本路径;默认为/etc/init.d下查找        start:定制启动命令        stop:关闭        restart:重启        status:状态资源名称仅是一个字符串,在同一个类型中必须唯一在定义时,资源类型必须是小写字母file:    管理文件、目录、软链接;    生成文件内容    管理文件权限、属性    也可以通过source属性到指定位置下载文件    通过recurse属性来获取目录    常用参数:        ensuce:absent(不存在) present(存在) file(文件) directory(目录)        backup:通过filebucket资源来备份文件,值通常为filebucket资源的名称        content:文件内容,生成方式有三种(content,source,target),彼此互斥        source:通过制定的url下载文件至本地,获取文件方式为puppet url 格式:puppet:///modules/MODULE_NAME/file_names;        target:为符号链接指定目标        links:文件为符号链接,值为“follow”,“manage”        path: 文件路径,必须使用双引号        mode:定义权限        owner:定义属主        group:定义属组        force: 强制执行删除文件、连接或目录,仅用于ensure为absent时。        purge:清空指定目录中存在的,但未在资源中定义的文件;        recurse:目录递归,值true,false,inf,remote        replace:替换,本地存在的文件与资源中指定的文件内容不同时是否执行替换,默认为否;exec:    执行命令,通常在不得不用时才使用,慎用,通常用于完成puppet自身无法完成的功能    常用的参数:        command:要执行的命令,通常为命令文件的完整路径        path:命令搜索路径         group:执行命令的组        user:执行命令的用户        onlyif:0,表示仅在命令的状态返回值为0时才执行此命令        refresh:定义接受到其他资源的通知时,则要重新执行此命令        refreshonly:仅当被依赖的资源发生改变时才被触发         tries:尝试次数,默认为1        try_sleep:多次尝试之间的时间间隔group:管理系统上的用户组        常用参数            ensure:目标状态,present,absent            name:组名            gid:GID            system:系统组user:管理用户        常用属性:            ensure:目标值状态            name:            uid:            system:            home:            shell:            gid:            password:加密后的密码            managehome: true,false(默认)cron:定义周期性任务        常用属性            ensure:目标状态            command:命令或脚本            environment:运行时的环境变量            hour:            minute:            mouth:            monthday            weekday            name            user:默认为root        cron { 'ntpdate'         ensure => present,         command => '/usr/sbin/ntpdate 172.16.0.1' &> /dev/null         minute => '*/3'        }

3.5 puppet资源引用

元参数:用于定义资源间的依赖关系,及应用次序,通知机制等等    require:表示需要依赖        package { 'nginx'            ensure => present,        }        service{'nginx'            ensure =>ture,            enable =>ture            require =>Package['nginx']        }    before:先应用本资源        package { 'nginx'            ensure => present,            before =>Service ['nginx']        }        service{'nginx'            ensure =>ture,            enable =>ture        }    notify:将当前资源的变动信息通知给别的资源,通知发出者    subscribe:定义在后一个资源中,通知接收者,订阅资源引用:    使用Type['title'],首字母必须大写依赖关系        package { 'nginx'            ensure => present,        } ->        service{'nginx'            ensure =>ture,            enable =>ture            restart => '/etc/rc.d/init.d/nginx reload'        }-> 表示依赖~> 表示通知

3.6 puppet表达式:

puppet的条件表达式    if    单分支    双分支    多分支        if 条件 {        动作        } elsif 条件 {        动作        } else 条件 {        动作        }    case:指定代码块    selectors:返回结果

四、验证

编辑资源清单,在puppet-1安装nginx,puppet-2安装mysql并设置开机自启动

在agent端测试手动执行,(默认三十分钟agent自动去master拉取)

五、puppet dashboard安装配置

5.1 安装并配置mysql数据库

yum install -y ruby-mysql mysql-server service mysqld startmysqladmin -uroot password "mysqladmin"

创建数据库并授权

create database dashboard character set utf8;create user 'puppet'@'localhost' identified by 'puppetadmin';grant all on dashboard.* to puppet@'localhost';flush privileges;

5.2 安装并配置puppet-dashboard

yum -y install puppet-dashboardvim /usr/share/puppet-dashboard/config/database.yml

vim /usr/share/puppet-dashboard/config/environment.rb

导入数据库文件

cd /usr/share/puppet-dashboard/rake gems:refresh_specsrake RAILS_ENV=production db:migrate

5.3 启动服务,并测试访问

/etc/rc.d/init.d/puppetmaster start  启动服务http://IP:3000  浏览器进行访问

手工导入报告

cd /usr/share/puppet-dashboard/rake RAILS_ENV=production reports:import

启动报告

env RAILS_ENV=production /usr/share/puppet-dashboard/script/delayed_job -p dashboard -n 4 -m start

查看进程job

查看dashboard