1 概述


Puppet Dashboard是Puppet软件的一个Web界面程序,由puppetlabs开发创建的Ruby on Rails程序。Puppet Dashboard同时从一个或者多个Puppet master上收集来自于Puppet agent的资产数据(主机的Fact和其他信息)。它能够查看并分析Puppet的报告,指定节点的类和参数,并且能够查看存储数据及备份文件内容。


2 安装所需依赖


所需软件及版本:

RubyGems

Rake:0.8.3 or newer

MySQL database server:5.x

Ruby-MySQL bindings:2.7.x or 2.8.x


安装:

yum install ruby-mysql mysql-server


3 安装dashboard


安装Puppet Labs package repository:

Enterprise Linux 6(CentOS 6) i386:

rpm -ivh https://yum.puppetlabs.com/el/6/products/i386/puppetlabs-release-6-7.noarch.rpm

x86_64:

rpm -ivh https://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm


安装dashboard:yum install dashboard


4 配置Dashboard


4.1 创建管理Dashboard的MySQL数据库帐号和授权


/etc/init.d/mysqld restart

chkconfig mysqld on

mysql -u root -pyourkey

mysql> create database dashboard character set utf8;

mysql> grant all on dashboard.* to 'dashboard'@'localhost' identified by 'yourkey';

mysql> flush privileges;

测试帐号是否创建成功:mysql -u dashboard -pyourkey

mysql> show databases;

+--------------------+

|Database           |

+--------------------+

|information_schema |

|dashboard          |

+--------------------+

2 rows in set (0.00 sec)


4.2 优化数据库配置文件my.conf


配置MySQL的最大包数量来允许数据库中有更多的行。

vim /etc/my.conf 增加下面一行(至少24M)

[mysqld]

#Allowing 32MB allows an occasional 17MB row with plenty of spare room

max_allowed_packet= 32M

重启MySQL使其生效:/etc/init.d/mysqld restart



4.3 编辑dashboard YAML配置文件dashboard.yml来指定数据库


vim /usr/share/puppet-dashboard/config/database.yml:

production:

 database: dashboard

 username: dashboard

 password: yourkey

 encoding: utf8

 adapter: mysql


4.4 填充数据库


cd /usr/share/puppet-dashboard/

rake gems:refresh_specs

rake RAILS_ENV=production db:migrate

环境变量RAILS_ENV=production告诉Rubyon Rails我们工作在生产环境。每次运行一个rake命令都需要使用合适的环境值来设置RAILS_ENV环境变量


4.5查看是否导入成功


mysql -u dashboard -pyourkey

mysql> show tables;

+------------------------------+

| Tables_in_dashboard          |

+------------------------------+

| delayed_job_failures         |

| delayed_jobs                 |

| metrics                      |

| node_class_memberships       |

| node_classes                 |

| node_group_class_memberships |

| node_group_edges             |

| node_group_memberships       |

| node_groups                  |

| nodes                        |

| old_reports                  |

| parameters                   |

| report_logs                  |

| reports                      |

| resource_events              |

| resource_statuses            |

| schema_migrations            |

| timeline_events              |

+------------------------------+

18 rows in set (0.00 sec)


5 启动Dashboard(Webrick方式)


WEBrick有助于快速使用Dashboard,不过它不能很好地进行扩展,并且当有许多Puppet agent向Dashboard进行报告时,它的性能会非常差,因此不推荐使用。

5.1 关闭httpd服务


/etc/rc.d/init.d/httpd stop


5.2 启动puppetmaster服务


/etc/rc.d/init.d/puppetmaster start


5.3 启动puppet-dashboard服务


/etc/rc.d/init.d/puppet-dashboard start


5.4 通过浏览器访问


http://192.168.56.1:3000


6 启动并运行Dashboard(Passenger放式)


6.1 使用RubyGem安装Passenger


yum install ruby-devel ruby-libs rubygems libcurl-devel

yum install httpd httpd-devel apr-util-devel apr-devel mod_ssl

gem install passenger


6.2 配置虚拟主机和passenger


vim /etc/httpd/conf.d/passenger.conf:

LoadModule passenger_module

/usr/lib/ruby/gems/1.8/gems/passenger-4.0.33/buildout/apache2/mod_passenger.so

<IfModule mod_passenger.c>

   PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-4.0.33

   PassengerRuby /usr/bin/ruby

   PassengerHighPerformance on

   PassengerMaxPoolSize 12

   PassengerPoolIdleTime 1500

   PassengerStatThrottleRate 120

   #RailsAutoDetect On

</IfModule>

Listen 8147

<VirtualHost *:8147>

   DocumentRoot "/usr/share/puppet-dashboard/public/"

   <Directory "/usr/share/puppet-dashboard/public/">

   Options    None

   AllowOverride AuthConfig

   Order allow,deny

   allow from all

   </Directory>

   ErrorLog    /var/log/httpd/dashboard.error.log

   LogLevel warn

   CustomLog /var/log/httpd/dashboard.access.log combined

</VirtualHost>

设定虚拟机通过端口8147来访问。


6.3启动相关服务


先停掉puppetmaster服务:/etc/rc.d/init.d/puppetmaster stop

重启apache:/etc/rc.d/init.d/httpd restart


6.4通过浏览器访问测试


http://192.168.56.1:8147/


7 集成PuppetDashboard


7.1手工导入现有的报告(方式一)


cd /usr/share/puppet-dashboard/

rake RAILS_ENV=production reports:import  #导入已经存在的报告

备注:默认节点报告会在/var/lib/puppet/reports/产生,如果路径发生变化,导入报告时需要在后面加上“REPORT_DIR=report路径”,reports更改路径可在puppet.conf中设置参数“reportdir= 新路径”,这种方式不够实时。


7.2 配置实施汇总puppet报告(方式二)


配置agent节点自动发送报告:vim /etc/puppet/puppet.conf    

[agent]

report = true    #从2.7.0版本开始,报告系统会默认开启,不需要配置

配置master节点:vim /etc/puppet/puppet.conf

[main]

   reports = http    #定义为http报告处理器,除此之外还有store,log,tagmail,rrdgraph等报告处理器

   reporturl= http://192.168.56.1:8147/reports

   #http报告处理器将puppet报告发送到一个HTTPURL和端口(Dashboard位置)。Puppet报告以被转储为HTTP Poort形式的YAML格式进行发送。

重启apache服务:/etc/init.d/httpd restart


7.3 开启后台处理报告进程


cd /usr/share/puppet-dashboard  #一定要在此目录下执行下面的命令,否则报错

rake RAILS_ENV=production jobs:work &  

#运行“Delayed Job Workers”,使其在后台为我们处理报告日志


7.4 修改dashboard时区


Dashboard默认时区为UTC格式,我们这里需要更改为CST(Asia/Shanghai)格式

vim /usr/share/puppet-dashboard/config/settings.yml

time_zone: 'Asia/Shanghai'

**备注**:设置的settings.yml会覆盖掉config/environment.rb中对应的配置项(config.time_zone = 'UTC')


7.5 显示报告


通过http://192.168.56.1:8147/及时查看节点更新的报告信息,可以看到四个节点vm1,vm2,vm3,vm4,默认显示时间为CST格式,除此之外还可以看到某一个节点在某一个时刻的更新报告和运行曲线图。



8 自定义报告


8.1 编写外部报告处理器


使用现有的被存储的报告,就是那些yaml文件,可以通过设置puppet.conf中reports= store进行收集。然后编写一个外部的处理器来处理这些信息,例如绘图或者将他们存储在外部数据库。这也是Puppet Dashboard中的报告输入进程的工作原理。这些外部的报告处理器可以很简单地使用Ruby进行编写,以便使用Ruby反序列化YAML文件的能力以及使用生成的对象。可以使用任何支持导入第三方ymal数据的工具。


8.2 编写内部报告处理器


编写自定义报告处理器并将它添加到Puppet。和fact、函数、类型及提供者的插件不同,Puppet没有提供一个自动分发自定义报告的方法。

8.2.1 现有报告处理器信息


ls /usr/lib/ruby/site_ruby/1.8/puppet/reports

http.rb log.rb  rrdgraph.rb  store.rb  tagmail.rb


8.2.2 自定义摘要报告处理器


8.2.2.1 进入reports目录编写自定义summary.rb报告处理器


cd /usr/lib/ruby/site_ruby/1.8/puppet/reports

vim summary.rb

require 'puppet'

Puppet::Reports.register_report(:summary)do

   desc <<-DESC

   Send summary report information to the report directory.

   DESC

   def process

       client = self.host

       summary = self.summary

       dir = File.join(Puppet[:reportdir],client)

       client = self.host

       file = "summary.txt"

       destination = File.join(dir,file)

       File.open(destination, "w") do |f|

           f.write(summary)

           end

       end

end


8.2.2.2 将报告处理器的名字加入puppet.conf中,并重新启动httpd服务


vim /etc/puppet/puppet.conf

[main]

reports = http,summary

/etc/rc.d/init.d/httpd restart

Stopping httpd:                                            [  OK  ]

Starting httpd:                                            [  OK  ]


8.2.2.3 使用mco命令触发更新节点vm1


mco puppet -v runonce  mco facts -v --with-fact  hostname='vm1'

Discovering hosts using the mc method for 2 second(s) .... 1

*[ ============================================================> ]1 / 1

vm1.sysu                                                                                   : OK

   { :summary=>     "Started a background Puppet run using the 'puppet agent--onetime --daemonize --color=false --splay --splaylimit 30'command"}

----rpc stats ----

   Nodes:1 / 1

   Pass/ Fail: 1 / 0

   StartTime: Fri Oct 04 12:54:50 +0800 2013

DiscoveryTime: 2005.27ms

AgentTime: 1118.41ms

TotalTime: 3123.68ms


8.2.2.4 查看新生成的报告信息


cd /var/lib/puppet/reports/vm1.sysu/

cat summary.txt :

Changes:

               Total: 2

Events:

               Success: 2

               Total: 2

Resources:

               Total: 12

               Out of sync: 2

               Changed: 2

               Skipped: 6

Time:

               Filebucket: 0.00

                   File: 0.29

       Configretrieval: 0.29

               Last run:  1388995849

                   Exec: 8.74

                   Total: 9.32

Version:

                   Config: 1388994359

                   Puppet: 3.4.3


在整个报告处理器中,定义了一个叫做process的方法来承载处理器的核心逻辑。我们从报告中提取了一些信息:使用self.host方式提取了主机名,使用summary方式提取了变更的摘要。还可以使用self.logs和self.metrics方式来访问报告中的日子以及度量值。
我们同时还将报告的摘要输出了报告目录下对应的以Puppetagent主机名命名的目录中,报告目录的位置是由reportdir配置的值来指定的,默认在/var/lib/puppet/reports/目录下。


9 总结


本文旨在搭建一个基于Web图形界面的Puppet报告系统—Puppet Dashboard。该报告系统既可以使用自身的报告处理器来处理报告内容,亦可以自定义外部报告处理器来满足特定的要求 。后续文章将讲解Puppet语法及拓展性。

                                                                                                                      ——RangoChen