您的位置:首页 > 运维架构

自动化运维puppet工具使用

2014-06-07 00:26 211 查看
http://puppet.wikidot.com 中文官方文档,有详细的资源介绍,注意看
1.什么是puppet
puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
2.设计架构
puppet是基于c/s架构的。服务器端保存着所有对客户端服务器的配置代码,在puppet里面叫做manifest.客户端下载manifest之后,可以根据manifest对服务器进行配置,例如软件包管理,用户管理和文件管理等等。
下图展示了一个典型的 puppet 配置的数据流动情况








如上图所示,puppet的工作流程如下:
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. 服务器端把客户端的执行结果写入日志,并发送给报告系统。

puppet工作过程中有两点值得注意,第一,为了保证安全,client和master之间是基于ssl和证书的,只有经master证书认证的client可以与master通信;第二,puppet会让系统保持在你所期望的某种状态并一直维持下去,如检测某个文件并保证其一直存在,保证ssh服务始终开启,如果文件被***了或者ssh服务被关闭了,puppet下次执行时(默认30分钟),会重新创建该文件或者启动ssh服务。

3.安装配置即使用
实验环境:rhel6.5
selinux and iptables disabled

puppet:
server端:
把下面的条目加入yum仓库
[puppet]
name=puppet
baseurl=http://yum.puppetlabs.com/el/6.5/products/x86_64/
gpgcheck=0

[ruby]
name=ruby
baseurl=http://yum.puppetlabs.com/el/6.5/dependencies/x86_64/
gpgcheck=0


yum仓库中没有包rubygems-1.3.7-1.el6.noarch.rpm,需要自己下载使用yum安装后才能装puppet-server,若是rhel6.2还需要将yum指向6.3或6.4才能安装(因为6.2缺少rubygems依赖包 ruby-rdoc )

yum install puppet-server -y
puppet 的第一个执行的代码是在/etc/puppet/manifest/site.pp,因此这个文件必须存在,而
且其他的代码也要通过该文件来调用。
# touch /etc/puppet/manifest/site.pp
# /etc/init.d/puppetmaster start           #启动 puppet master
# netstat -antlp |grep ruby
tcp     0      0 0.0.0.0:8140       0.0.0.0:*      LISTEN      52
13142      1645/ruby

clents端:
配置yum仓库,安装puppet
yum install puppet -y
puppet客户端连接puppet-server
puppet agent --server rhcs4.com --no-daemonize --verbose



client 向 master 发出证书验证请求,然后等待master 签名并返回证书。
参数--server 指定了需要连接的puppet master 的名字或是地址,默认连接名为“puppet”的主机
如要修改默认连接主机
可以修改/etc/sysconfig/puppet 文件中的PUPPET_SERVER=puppet 选项
参数--no-daemonize 是puppet 客户端运行在前台
参数--verbose 使客户端输出详细的日志

在server端:
# puppet cert list //显示所有等待签名证书的主机



# puppet cert sign rhcs3.com //签名证书发送给rhcs3.com



clients上可看到获取证书成功



如要同时签名所有证书,执行以下命令:
# puppet cert sign --all
# puppet cert clean desktop2.example.com //***签名证书

自动验证:
在 server 端,编辑 puppet.conf 文件:
[main]
autosign = true //添加行,允许所有客户端的认证

/etc/puppet 目录下创建 autosign.conf文件,内容如下:
*.com //表示允许所有example.com 域的主机
# service puppetmaster reload

在实际中有时会修改 client端的主机名,这样就需要重新生成证书:
1)在 server 端执行:puppet
cert --clean ty2.org //你要***的原client 端主机名
2)在 client 端执行:rm
-fr /var/lib/puppet/ssl/*
puppet agent --server=puppet.example.com

puppet 资源定义
以下资源均定义在/etc/puppet/manifest/site.pp文件中,在没有指定节点的情况下,对所有
已经经过验证的 client 都生效。
资源定义

1、创建文件
node "ty2.org" {                            //必须用双引号
file { "/tmp/testfile":            //在client上创建/tmp/testfile文件
content => "ty2.org",       //文件内容为ty2.org,多个参数时要用逗号分隔
mode => 755,                //mode定义文件权限
owner => mysql              //owner定义文件拥有者
}
}
2、软件包
package { "vsftpd":
ensure => present     //为present时install;absent为uninstall
}
3、从server端拷贝文件到clients
file { "/etc/vsftpd/vsftpd.conf":
source => "puppet:///serverconf/vsftpd.conf",//参数source定义源文件目录位置,此目录必须在fileserver.conf中定义
mode => 600          //权限为600
}
vi fileserver.conf     //添加如下行
[serverconf]          //puppet:///serverconf必须和[]中名一致
path /etc/puppet/serverconf    //该目录中文件要注意权限,other要有r权限才可以
allow *.org


4、服务定义
service { "vsftpd":
ensure => running
//参数ensure定义服务running或stoped
}

5、添加用户及密码
user { "test":
uid => 888,
home => "/home/test",
shell => "/bin/bash",
provider => useradd,     //指定provider,用什么命令来执行用户操作
managehome => true,     //管理用户的时候是否管理用户的home目录,可以设置的值是true,false
ensure => present       //present添加,absent***
}
exec { "echo westos | passwd --stdin test":    //让puppet执行外部命令
path => "/usr/bin:/usr/sbin:/bin",       //指定命令的路径
onlyif => "id test"      //如果这个参数被设定了,则exec只会在onlyif设定的命令返回0时才执行
}


6、文件系统挂载(挂载nfs)
file { "/public":                     //先创建挂载目录
ensure => directory
}
mount { "/public":
device => "192.168.1.21:/mnt",
fstype => "nfs",
options => "defaults",
ensure => mounted           //mounted挂载;unmounted卸载
}


7. crontab 任务
cron { echo:
command => "/bin/echo `/bin/date` >> /tmp/echo",
user => root,
hour => ['2-4'],
minute => '*/10'
}
# 任务会在 client上/var/spool/cron 目录中生成。

----------------------------------------------

使用puppet安装apache服务和nginx源码

使用模块配置
cd /etc/puppet/modules/
mkdir httpd //创建要安装服务的模块目录
cd httpd/
mkdir files manifests templates

touch init.pp //调用下边三个,使结构更加清晰
touch install.pp config.pp service.pp

vi install.pp
class httpd::install {
package { "httpd":
ensure => present
}
}

vi config.pp
class httpd::config {
file { "/etc/httpd/conf/httpd.conf":
ensure => present,
source => "puppet:///modules/httpd/httpd.conf",
require => Class["httpd::install"],
//只有install后才能被执行
notify => Class["httpd::service"]
//当改动了配置文件,就触发service服务restart
}
}

vi service.pp
class httpd::service {
service { "httpd":
ensure => stopped,
require =>
Class["httpd::install","httpd::config"]
}
}

vi init.pp
class httpd {
include httpd::install,httpd::config,httpd::service
}

ls files/ //将设置好的服务配置文件放在此目录,可以同步到clients
httpd.conf

cd /etc/puppet/manifests
touch nodes.pp //将节点分开定义

vi nodes.pp
node "ty2.org" {
include httpd
}

vi site.pp
//系统默认调用site.pp,使用其再调用nodes.pp,也可以将nodes.pp中内容直接写入site.pp,但这样不容易查看排错
import "nodes.pp"

/etc/init.d/puppetmaster start //启动,默认端口8140

现在就可以在clients端测试了:
puppet agent --server ty1.org --no-daemonize --verbose

安装nginx源码包:
cd /etc/puppet/modules
mkdir nginx //创建要安装服务的模块目录
cd nginx/
mkdir files manifests templates

touch init.pp //调用下边三个,使结构更加清晰
touch install.pp config.pp service.pp

vi install.pp
class nginx::install {
package { ["openssl-devel","pcre-devel","zlib-devel"]:
ensure => present
}
file { "/tmp/nginx-1.4.2.tar.gz":
ensure => present,
source =>
"puppet:///modules/nginx/nginx-1.4.2.tar.gz"
}
file { "/tmp/nginx_install.sh":
ensure => present,
source =>
"puppet:///modules/nginx/nginx_install.sh",
mode => 755
}
exec { "/tmp/nginx_install.sh":
path => "/bin:/usr/bin:/usr/sbin",
//指定命令的路径
unless => ["test -x /etc/init.d/nginx"],
//unless设定的命令执行失败才执行exec参数
require => File["/tmp/nginx_install.sh"]
//约束,有此文件时再执行
}
}

vi config.pp
class nginx::config {
file { "/usr/local/nginx/conf/nginx.conf":
ensure => present,
source => "puppet:///modules/nginx/nginx.conf",
require => Class["nginx::install"],
notify => Class["nginx::service"]
}
file { "/etc/init.d/nginx":
source => "puppet:///modules/nginx/nginx",
mode => 755,
ensure => present,
owner => "root",
require =>
File["/usr/local/nginx/conf/nginx.conf"]
}
}

vi service.pp
class nginx::service {
service { "nginx":
ensure => running,
require =>
Class["nginx::install","nginx::config"]
}
}

/etc/init.d/puppetmaster restart

clients推送:
puppet agent --server ty1.org --no-daemonize --verbose

--------------------------

Puppet dashboard 安装 (用以web 方式管理 puppet)
puppet dashboard是GUI(图形用户界面)方式管理puppet,可以查看puppet运行日志;是一个Ruby on Rails程序,用于显示Puppet master和agent的相关信息。它允许你查看从一个或多个Puppet
master汇总的图形和报告数据。它同时从一个或者多个Puppet master上收集来自于Puppet
agent的资产数据(主机的Fact和其他信息)。最后,它能作为一个ENC来配置Puppet节点,并指定这些节点上的类和参数。
依赖性:
* Ruby 1.8.7
* Rubygems
* Rake >= 0.8.3
* mysql-server 5.x
* Ruby-mysql bindings 2.7.x or 2.8.x

# rpm -ivh rubygem-rake-0.8.7-2.1.el6.noarch.rpm
# yum install puppet-dashboard ruby-mysql mysql mysql-server -y

# cd /usr/share/puppet-dashboard/
# vi config/database.yml
#只留下生产环境配置
production:
database: dashboard_production
username: dashboard
password: linux
encoding: utf8
adapter: mysql

配置数据库:
#/etc/init.d/mysqld start

#vi test.sql //创建dashboard_production库、用户,并做授权
CREATE DATABASE dashboard_production CHARACTER SET utf8;
CREATE USER 'dashboard'@'localhost' IDENTIFIED BY 'linux';
GRANT ALL PRIVILEGES ON dashboard_production.* TO
'dashboard'@'localhost';

#mysql < test.sql

puppet-dashboard 默认时区不正确,需要修改:
#rake time:zones:local //可以使用此命令获取时区
#vi /usr/share/puppet-dashboard/config/settings.yml
time_zone: 'Beijing'
#rake gems:refresh_specs //修改完后需要执行此命令

#cd /usr/share/puppet-dashboard/config
#rake RAILS_ENV=production db:migrate
//创建dashboard所需的表

启动服务:
[root@ty1 config]# /etc/init.d/puppet-dashboard start
Starting Puppet Dashboard: => Booting WEBrick
=> Rails 2.3.17 application starting on http://0.0.0.0:3000 [  OK ]
#chmod 666 log/production.log
[root@ty1 puppet-dashboard]# /etc/init.d/puppet-dashboard-workers
start
Starting puppet-dashboard-workers:                         [  OK ]


实时报告汇总
设置server端:
#vi /etc/puppet/puppet.conf
[main]
reports = http
reporturl = http://192.168.1.21:3000/reports
设置client端
# vi /etc/puppet/puppet.conf
[agent]
report = true

#puppet agent --server ty1.org --no-daemonize –verbose
//验证
现在就可以使用web访问192.168.1.21:3000查看效果了

搭建过程中出现的问题:
1.Could not run: Could not create PID file: /var/lib/puppet/run/master.pid
# ps -aux | grep puppet


应该能看到相应的进程。因为使用自动验证时,直接使用puppet agent启动,即以daemon方式启动;

如果以 daemonize 的方式启动,不能再以 no-daemonize 的方式启动了,杀死该进程重启即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息