Puppet 集中化管理系统

时间:2021-08-01 17:38:40

Puppet 集中化管理系统

    Puppet 是一个配置管理工具,  Puppet 是一个典型的C/S 结构, 当然,这里的C 可以有很多,因此,也可以说是一个星型结构. 所有的puppet 客户端同一个服务器端的 puppet 通讯. 每个puppet 客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置服务器. 配置完成以后,puppet 客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息. 下图展示了一个典型的 puppet 配置的数据流动情况.

 Puppet 集中化管理系统

 

Puppet 的细节和原理

    Puppet 的目的是让你只集中于你要管理的目标,而忽略实现的细节,例如命令名,参数或者文件格式. Puppet 把系统里面的用户,软件包,服务看作是"资源", Puppet 的作用就是管理这些资源以及资源之间的相互联系.Puppet 采用了非常简单的 C/S 架构,所有数据的交互都通过 SSL 进行,以保证安全。它的工作流程如图所示.

 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.服务器端把客户端的执行结果写入日志,并发送给报告系统。

 

系统环境:rhel6.5 selinux and iptables disabled

sever:172.25.44.33 server3.example.com puppet master

client:172.25.44.44 server4.example.com puppet agent

client:172.25.44.55 server5.example.com puppet agent

重要:server与所有client之间需要解析,以及时间同步,不然会验证失败。

 

1.server端和client端进行配置

server端:

yum install -y puppet-server-3.8.1-1.el6.noarch.rpm 
puppet-3.8.1-1.el6.noarch.rpm  facter-2.4.4-1.el6.x86_64.rpm
hiera-1.3.4-1.el6.noarch.rpm  rubygem-json-1.5.5-3.el6.x86_64.rpm
ruby-shadow-2.2.0-2.el6.x86_64.rpm  ruby-augeas-0.4.1-3.el6.x86_64.rpm
rubygems-1.3.7-5.el6.noarch.rpm


/etc/puppet下的配置目录如下图所示:

 Puppet 集中化管理系统

 

在client端:yum install -y puppet-3.8.1-1.el6.noarch.rpm  facter-2.4.4-1.el6.x86_64.rpmhiera-1.3.4-1.el6.noarch.rpm  rubygem-json-1.5.5-3.el6.x86_64.rpmruby-shadow-2.2.0-2.el6.x86_64.rpm  ruby-augeas-0.4.1-3.el6.x86_64.rpmrubygems-1.3.7-5.el6.noarch.rpmpuppet agent --server  server3.example.com --no-daemonize -vt  ##客户端连接到puppet master,client向master发出证书验证请求,然后等待master签名并返回证书。参数--server 指定了需要连接的puppet master的名字或是地址,默认连接名为“puppet”的主机如要修改默认连接主机可以修改/etc/sysconfig/puppet 文件中的 PUPPET_SERVER=puppet选项参数--no-daemonize是puppet客户端运行在前台.如图:


 Puppet 集中化管理系统

 

如果报错为Exiting; no certificate found and waitforcert is disabled,需要在puppet master上对client端进行证书验证, puppet cert sign server4.example.com.

 

server端:

puppet cert list --all  ##显示所有等待签名的证书如图:


 Puppet 集中化管理系统

 

2.开启自动验证

server端:

vim /etc/puppet/puppet.conf[main]      autosign = true  ##允许所有客户端认证     # The Puppet log directory.    # The default value is '$vardir/log'.    logdir = /var/log/puppet/etc/puppet 目录下创建autosign.conf文件,内容如下:*.example.com  ##表示允许所有example.com域内的主机进行认证puppet cert --clean server4.example.com  ##可以删除原client端的签名认证


3.puppet资源定义

(1)定义用户

在server端:vim /etc/puppet/manifests/site.ppfile {     '/tmp/testfile':     content => 'www.westos.org',     mode => 600,     owner => puppet,     group => puppet} /etc/init.d/puppetmaster reload在client端:puppet agent --server server3.example.com --no-daemonize -vt如图:


 Puppet 集中化管理系统

 

[root@server4 ~]# ll /tmp/testfile-rw------- 1 puppet puppet 14 7月   5 11:29 /tmp/testfile  ##查看对testfile权限的修改是否生效在server端:cd /etc/puppet/mkdir filescp /etc/passwd files  ##把passwd拷贝到files里用作检测vim fileserver.conf[files]path /etc/puppet/filesallow *.example.com/etc/init.d/puppetmaster reloadvim /etc/puppet/manifests/site.ppfile {     '/tmp/testfile':     content => 'www.westos.org',     mode => 600,     owner => puppet,     group => puppet}file {     '/tmp/passwd':      source => 'puppet:///files/passwd'}  在client端:[root@server4 ~]# puppet agent --server server3.example.com --no-daemonize -vtInfo: Retrieving pluginfactsInfo: Retrieving pluginInfo: Caching catalog for server4.example.comInfo: Applying configuration version '1467815900'Notice: /Stage[main]/Main/File[/tmp/passwd]/ensure: defined content as '{md5}ee6c5e7a60a74d4a2e40825a7575d383'Notice: Finished catalog run in 0.20 seconds[root@server4 ~]# ll /tmp/testfile -rw------- 1 puppet puppet 14 7月   5 11:29 /tmp/testfile[root@server4 ~]# cat /tmp/testfile www.westos.org


 

(2)定义软件包

server端:

vim /etc/puppet/manifests/site.ppfile {     '/tmp/testfile':     content => 'www.westos.org',     mode => 600,     owner => puppet,     group => puppet}file {     '/tmp/passwd':      source => 'puppet:///files/passwd'}package {      'httpd':       ensure =>present}在client端:[root@server4 ~]# puppet agent --server server3.example.com --no-daemonize -vtInfo: Retrieving pluginfactsInfo: Retrieving pluginInfo: Caching catalog for server4.example.comInfo: Applying configuration version '1467857897'Notice: /Stage[main]/Main/Package[httpd]/ensure: createdNotice: Finished catalog run in 12.00 seconds


 

(3)定义服务

server端:

vim /etc/puppet/manifests/site.ppfile {     '/tmp/testfile':     content => 'www.westos.org',     mode => 600,     owner => puppet,     group => puppet}file {     '/tmp/passwd':      source => 'puppet:///files/passwd'}package {      'httpd':       ensure =>present}service {      'httpd':      ensure => running,      require => Package['httpd']}在client端:


如图:

 Puppet 集中化管理系统

 

(4)定义用户及用户组

server端:

vim /etc/puppet/manifests/site.ppfile {     '/tmp/passwd':      source => 'puppet:///files/passwd'}package {      'httpd':       ensure =>present}service {      'httpd':      ensure => running,      require => Package['httpd']}user { "test": uid => 900,home => "/home/test",shell => "/bin/bash",provider => useradd,managehome => true,ensure => present,#password => westos}exec { "echo westos | passwd --stdin test":path => "/usr/bin:/bin",onlyif => "id test"  ##只有在用户ID存在时执行}在client端:如图:


 Puppet 集中化管理系统

 

查看password,如图:

 Puppet 集中化管理系统

 

(5)文件系统挂载

在server端:vim /etc/puppet/manifests/site.pppackage {      ['httpd','nfs-utils']:       ensure =>present}file { "/public":ensure => directory}mount { "/public":device => "172.25.254.251:/var/ftp/pub",fstype => "nfs",options => "defaults",ensure => mounted}在client端:如图:


 Puppet 集中化管理系统

 

(6)crontab任务

在server端:vim /etc/puppet/manifests/site.ppcron { echo:command => "/bin/echo `/bin/date` >> /tmp/echo",user => root,hour => ['2-4'],minute => '*/10'}


client端:

如图:

 Puppet 集中化管理系统

cat /var/spool/cron/root

如图:

 Puppet 集中化管理系统

4.Puppet不同节点的定义

server端:

cd /etc/puppet/manifestsmkdir nodes  ##创建不同节点cp site.pp nodes/server4.ppvim site.ppimport 'nodes/*.pp'file {     '/tmp/testfile':     content => 'www.westos.org',     mode => 600,     owner => puppet,     group => puppet}vim server4.ppnode 'server4.example.com' {package {      'httpd':       ensure =>present}service {      'httpd':      ensure => stopped,  ##停掉sever4上的apache服务      require => Package['httpd']}}vim server5.ppnode 'server5.example.com' {package {      'httpd':       ensure =>present}service {      'httpd':      ensure => running,  ##开启server5上的apache服务      require => Package['httpd']}}在client端:puppet agent --server server3.example.com  --no-daemonize -vt  ##server4如图:


 Puppet 集中化管理系统

 

time puppet agent --server server3.example.com  --no-daemonize -vt  ##server5


如图:

 Puppet 集中化管理系统

5.编写模板

server端:

cd /etc/puppet/modules/mkdir vsftpd  ##添加vsftpcd vsftpd/mkdir filescd files/yum install -y vsftpd cp /etc/vsftpd/vsftpd.conf .  ##把vsftp的主配置文件拷贝到当前路径chmod 644 vsftpd.conf  ##修改主配置文件的权限vim vsftpd.confanonymous_enable=NO  ##关闭匿名用户登录限制cd /etc/puppet/modules/vsftpd/mkdir manifests/cd manifests/touch install.pp config.pp service.pp init.ppvim install.ppclass vsftpd::install {      package { 'vsftpd':                 ensure => present      }}vim config.ppclass vsftpd::config {      file {             '/etc/vsftpd/vsftpd.conf':             source => 'puppet:///modules/vsftpd/vsftpd.conf',  ##资源调用的路径             mode => 600,             require => Class['vsftpd::install'],             notify => Class['vsftpd::service']     }}vim service.ppclass vsftpd::service {      service {               'vsftpd':                ensure => running,                require => Class['vsftpd::install','vsftpd::config']      }}vim init.ppclass vsftpd {      include vsftpd::install,vsftpd::config,vsftpd::service}cd /etc/puppet/manifests/nodes/vim server4.ppnode 'server4.example.com' {include vsftpdpackage {      'httpd':       ensure =>present}service {      'httpd':      ensure => stopped,      require => Package['httpd']}}vim server5.ppnode 'server5.example.com' {include vsftpdpackage {      'httpd':       ensure =>present}service {      'httpd':      ensure => running,      require => Package['httpd']}}在client端:puppet agent --server  server3.example.com --no-daemonize -vt  ##server4如图:


Puppet 集中化管理系统 

time puppet agent --server  server3.example.com --no-daemonize -vt  ##server5


 

如图;

 Puppet 集中化管理系统

 

6.添加虚拟主机配置――模板应用

文件存放在 templates 目录中,*.erb结尾。

server端:

cd /etc/puppet/modules/yum install -y httpdcp vsftpd/ -r httpd/cd /etc/puppet/modules/httpd/filesrm -rf *cp /etc/httpd/conf/httpd.conf  .  ##将http的主配置文件拷贝到当前路径vim httpd.confNameVirtualHost *:80<VirtualHost *:80>    DocumentRoot /var/www/html    ServerName server4.example.com</VirtualHost>cd /etc/puppet/modules/httpd/manifestsvim install.ppclass httpd::install {      package { 'httpd':                 ensure => present      }}vim config.ppclass httpd::config {      file {             '/etc/httpd/conf/httpd.conf':             source => 'puppet:///modules/httpd/httpd.conf',             mode => 600,             require => Class['httpd::install'],             notify => Class['httpd::service']     }}vim service.ppclass httpd::service {      service {               'httpd':                ensure => running,                require => Class['httpd::install','httpd::config']      }}vim init.ppclass httpd {      include httpd::install,httpd::config,httpd::service}define httpd::vhost($domainname) {file { "/etc/httpd/conf.d/${domainname}_vhost.conf":content => template("httpd/httpd_vhost.erb"),require => Class["httpd::install"],notify => Class["httpd::service"]}file { "/var/www/$domainname":ensure => directory}file { "/var/www/$domainname/index.html":content => $domainname}}cd /etc/puppet/manifests/nodes/vim server5.ppnode 'server5.example.com' {include vsftpd,httpdhttpd::vhost { 'www.example.com':domainname => "www.example.com",}httpd::vhost { 'www.gaofang.com':domainname => "www.gaofang.com",}}cd /etc/puppet/modules/httpdmkdir templatesvim /etc/puppet/modules/httpd/templates/httpd_vhost.erb<VirtualHost *:80>ServerName <%= domainname %>DocumentRoot /var/www/<%= domainname %>ErrorLog logs/<%= domainname %>_error.logCustomLog logs/<%= domainname %>_access.log common</VirtualHost>在物理机上:vim /etc/hosts172.25.44.55    server5.example.com  www.example.com  www.gaofang.com  ##加入解析在client端:puppet agent --server server3.example.com --no-daemonize -vt  ##server5


如图:

 Puppet 集中化管理系统Puppet 集中化管理系统

 

 

cd /var/www/www.example.com/[root@server5 www.example.com]# cat index.html www.example.comcd /var/www/www.gaofang.com/[root@server5 www.gaofang.com]# cat index.html www.gaofang.com登陆网页访问如图:


 Puppet 集中化管理系统

Puppet 集中化管理系统

Puppet 集中化管理系统



 


本文出自 “jeffrey13” 博客,谢绝转载!