puppet简介及配置(入门)

Puppet官网https://puppetlabs.com

Puppet简介

    Puppet是开源的基于Ruby的系统配置管理工具,依赖于C/S的部署架构。puppet使用跨平台语言规范,管理配置文件、用户、软件包、系统服务等内容,在puppet里这些内容都被看做是“资源”,每种资源都有对应的属性,如软件包有安装不安装的属性,文件有权限属性等。Puppet的代码主要由这些资源和其属性组成。其代码化的好处:分享,保存,快速的恢复和部署。
    Puppet客户端默认每半小时连接一次服务器端(此时puppet客户端进程工作在后台模式,也可根据需要手动执行),从服务器端下载最新的配置文件,并且严格按照配置文件来配置服务器. 配置完成以后,puppet客户端可以反馈给服务器端一个消息. 简单流程可如下图:

    NOTE:/etc/puppet目录存放着puppet的配置文件及代码,因此可将/etc/puppet整个目录放在svn上,管理员编写puppet代码至svn服务器,puppetmaster可每隔一段时间svn update puppet代码至puppetmaster本地,再传送给client执行。(本文演示未涉及svn)

Puppet安装

1:安装前准备  
  (1):主机名    
   服务器端:/etc/hostname 
  
  
  
  
  1. server.puppet.com 
   客户端:/etc/hostname 
  
  
  
  
  1. client.puppet.com 
  (2):添加解析:
   服务器端:/etc/hosts 
  
  
  
  
  1. 192.168.1.93    client.puppet.com 
   客户端:/etc/hosts 
  
  
  
  
  1. 192.168.1.92    server.puppet.com 
  (3):同步时间
2:安装puppet(OS:ubuntu server 12.04)    
   服务器端:
   
   
   
   
  1. $ sudo apt-get install puppet puppetmaster 
   客户端:
   
   
   
   
  1. $ sudo apt-get install puppet 
   NOTE:apt-get方便快捷一步到位,当然你也可源码安装依次安装ruby,facter,puppet。详情参照官网:http://docs.puppetlabs.com/guides/installation.html此处不再详述。
Puppet工作原理 :(此图 by :守住每一天)
 


 (1)客户端puppetd向master发起认证请求。或使用带签名的证书    
   (2)master告诉client你是合法的。    
   (3)客户端puppetd调用facter,facter探测出主机的一些变量,例如主机名,内存大小,ip地址等。pupppetd 把这些信息通过ssl连接发送到服务器端 
   (4)服务器端的puppetmaster 检测客户端的主机名,然后找到manifest里面对应的node配置,并对该部分内容进行解析,facter送过来的信息可以作为变量处理,node牵涉到的代码才解析,其他没牵涉的代码不解析。解析分为几个阶段,语法检查,如果语法错误就报错。如果语法没错,就继续解析,解析的结果生成一个中间的“伪代码”(catelog),然后把伪代码发给客户端
   (5)客户端接收到“伪代码”,并且执行。 
   (6)客户端在执行时判断有没有file文件,如果有向fileserver 发起请求。    
   (7)客户端判断有没有配置report。如果配置把执行结果发送给服务器。
   (8)服务器端把客户端的执行结果写入日志。并可以发送给报告系统(DashBoard)

Puppet验证证书: 

   客户端:
      
      
      
      
  1. $ sudo puppetd --test --server server.puppet.com 
   服务器端:
     
     
     
     
  1. $ sudo puppetca --list 
  2. $ sudo puppetca -s -a  #给所有请求签名
   NOTE:puppet的客户端和服务器通过ssl连接,在服务器端上一个自签名的根证书,在安装软件的时候自动生成.因此在安装软件以前须设置好主机名,生成证书的时候要把主机名写入证书,如果证书生成后再改主机名,会导致无法通信.每个客户端的证书要经过根证书的签名才能和服务器连接.所以要执行以上命令,请求证书=>签发证书        
   NOTE:自动签名:创建/etc/puppet/autosign.conf文件,添加*.puppet.com一行。根据实际情况,修改客户机对应的域名.puppet会检查证书请求是否匹配该配置文件的任何一行,客户端端主机如匹配*.puppet.com,puppetmaster都会自动签名。(因只要主机名匹配,master都会信任,此为潜在的安全问题,不建议使用)
Puppet目录结构(/etc/puppet 
     
     
     
     
  1. |-auth.conf                     #认证配置文件 
  2. |-puppet.conf                   #主配置文件 
  3. |-fileserver.conf            #文件服务器配置文件 
  4. |-autosign.conf              #自动验证配置文件 
  5. |‘-manifests                    #puppet代码文件存储目录 
  6.     |‘-nodes                    #节点配置目录 
  7.          |-node1.pp           #节点1配置文件 
  8.     |-site.pp                   #入口文件,定义变量,默认配置等 
  9.     |-modules.pp                #加载模块 
  10. |‘-modules                      #模块配置目录,其下一个目录相当于一个模块,如mysql 
  11.     |‘-mysql                    #mysql模块,一般有files,manifests,templates三个子目录 
  12.          |‘-files             #文件存储目录,如my.cnf 
  13.               |-my.cnf 
  14.          |‘-manifests         #模块配置代码所在目录,其下必须有init.pp文件 
  15.               |-init.pp 
  16.          |‘-templates         #针对此模块模板目录 
  17. |‘-templates                    #模板目录 

Puppet的几个常见资源:

(1)文件:管理系统文件 
   
   
   
   
  1. file { 
  2.     "/etc/mysql/my.cnf"
  3.     source => "puppet:///mysql-server/my.cnf"
  4.     owner => root, 
  5.     group => root, 
  6.     mode => 0644;        
   NOTE:上面的代码是让/etc/mysql/my.cnf这个文件权限保持644,并且属于root用户root组,第二行为资源的title,默认和文件的名字相同,source是指定文件复制到客户端并覆盖已有的文件,上面代码定义的source代码也可这样写source=>"puppet://$fileserver/mysql-server/my.cnf",此处的mysql-server指的是定义在fileserver.conf中的一个模块所对应的全路径.这里需要知道fileserver.conf的配置:
  
  
  
  
  1. $ vim fileserver.conf    #添加如下行: 
  2. [mysql-server] 
  3.   path /etc/puppet/modules/mysql-server/files #指定文件所在的目录 
  4.   allow *            #可配置allow,deny做限制,支持使用主机名,IP,
  5. 及通配符,此处为方便,允许所有主机 
   通过fileserver.conf的定义,代码source =>"puppet:///mysql-server/my.cnf"所指定的路径可以解析为/etc/puppet/modules/mysql-server/files/my.cnf,代码source => "puppet:///mysql-server/my.cnf"中的mysql-server可简单理解为等价于/etc/puppet/modules/mysql-server/files
(2)软件包:管理软件包的安装升级和删除。 
  
  
  
  
  1. package { 
  2.       ["nginx","mysql-server"]: 
  3.       ensure => installed; 
  4.       ["vim"]: 
  5.       ensure => absent; 
   NOTE:该资源的主要是ensure,表示该软件包应该在什么状态。installed 表示要安装该软件,也可以写成present; absent表示卸载该软件
(3)服务:管理系统服务(启用,禁用,重启等) 
  
  
  
  
  1. service {  
  2.     "mysql"
  3.     enable => true
  4.     ensure => running; 
  5.     "nginx"
  6.     ensure => stopped;   
NOTE:enable表示服务在开机的时候是否启动,可以设置的值是true和false;
        ensure表示是否运行服务, running表示运行服务,stopped 表示停止服务
(4)Exec:执行外部命令 
  
  
  
  
  1. exec { 
  2.     "set mysql root password"
  3.     path => "/usr/bin"
  4.     unless => "mysql -uroot -p$root_mysql_password"
  5.     command => "mysqladmin -u root password $root_mysql_password"
   NOTE:path:命令执行的搜索路径。如果path没有被定义,命令需要使用绝对路径。路径可以以数组或以冒号分隔的形式来定义。
        unless:如果unless所设定的命令返回0,此定义的资源将不被执行         
        command:将会被执行的命令,必须为被执行命令的绝对路径,或者得提供该命令的搜索路径更多资源介绍请访问puppet官网或者puppet中文维基:http://puppet.wikidot.com/ 

Puppet资源间的关系:

 (1)puppet 资源之间简单依赖关系
   before:在某个资源之前执行
 after在某个资源之后执行   
 require:某个资源必须存在或者正确执行后,才执行相应的资源。  
 (2)puppet 资源之间触发更新:   
 notify:用来通知某个资源进行更新   
 subscribe:该资源有更新时,通知另一个资源执行相应的动作 

Puppet类:

作用:把一组资源收集到一个盒子里面,一起使用,其他地方要用到直接包含此个类就可以,便于维护。例:
  
  
  
  
  1. class ssh { 
  2.         package { 
  3.                 [ "openssh-server" ]: 
  4.                 ensure => installed; 
  5.         } 
  6.  
  7.         file { 
  8.                 "/etc/ssh/sshd_config": 
  9.                 mode => 0644, 
  10.                 owner => root, 
  11.                 group => root, 
  12.                 source => "puppet://$fileserver/ssh/sshd_config", 
  13.                 require => Package["openssh-server"];  #在指定的Packgae资源执行成功后再执行此File资源
  14.         } 
  15.  
  16.         service { 
  17.                 "ssh": 
  18.                 ensure => running, 
  19.                 require => Package["openssh-server"], 
  20.                 subscribe => File["/etc/ssh/sshd_config"]; #sshd_config文件有变动,重启ssh服务,使其生效
  21.         } 

Puppet节点:

 puppet用来区分不同的客户端,并且给不同的服务器端分配manifest.例:
  
  
  
  
  1. node 'host1.puppet.com' { 
  2.            include ssh  #此处的ssh指的是定义的ssh类
  3. node 'host2.puppet.com' { 
  4.          include apache,mysql,ssh 

Puppet模块:

  (1):一个模块包含/etc/puppet/modules目录下的一个目录和它的子目录,通常一个模块目录下面含三个目录files,manifests,templates.    
  (2):在puppet的主文件site.pp里面可以用import modulename可以插入模块。新版本的puppet可自动插入modules目录下的模板。引入模块,可以结构化代码,便于分享,保存,及管理    
  (3):manifests里面必须包含一个init.pp的文件,为此模块的初始文件.    
  (4):files目录是该模块的文件发布目录,    
  (5):templates包含erb模型文件。

一个完整示例

(1)修改主机名,hosts文件,同步时间  
(2)服务器端安装好puppet,puppetmaster;客户端安装好puppet  
(3)客户端请求签名,服务器端签名  
(4)/etc/puppet下代码的配置 
  
  
  
  
  1. $ cd /etc/puppet 

  2. #modules目录配置:
  3. $ sudo mkdir -pv modules/mysql-server/{files,manifests,templates} #创建模块目录及其子目录
  4. $ cd /etc/puppet/modules/mysql-server/files
  5. $ sudo vim my.cnf #此文件配置好,放在files目录下即可
  6. ...
  7. ...
  8. $ cd /etc/puppet/modules/mysql-server/manifests/ 
  9. $ sudo vim init.pp  #模块的主配置文件,添加如下行:
  10.  #mysql-server install and set psaaword 
  11.  # 
  12.  class mysql-server { 
  13.         package { 
  14.                 [ "mysql-server","mysql-client" ]: 
  15.                 ensure => installed; 
  16.         } 
  17.         file { 
  18.                 "/etc/mysql/my.cnf"
  19.                 source => "puppet://$fileserver/mysql-server/my.cnf"
  20.                 owner => root, 
  21.                 group => root, 
  22.                 mode => 0644, 
  23.                 require => Package[ "mysql-server","mysql-client" ]; 
  24.         } 
  25.         service { 
  26.                 "mysql"
  27.                 ensure => running, 
  28.                 require => File[ "/etc/mysql/my.cnf" ], 
  29.                 subscribe => File[ "/etc/mysql/my.cnf" ]; 
  30.         } 
  31.         exec { 
  32.                 "set mysql root password"
  33.                 path => "/usr/bin"
  34.                 unless => "mysql -uroot -p$root_mysql_password"
  35.                 command => "mysqladmin -u root password $root_mysql_password"
  36.                 require => Service['mysql']; 
  37.         } 
  38.  } 

  39. #manifests目录下配置:
  40. $ cd /etc/puppet/manifests 
  41. $ sudo vim site.pp  #puppet入口文件配置,添加如下行:
  42.  $fileserver = "server.puppet.com"  #puppet变量定义,注意$
  43.  $root_mysql_password = "123456" 
  44.  node default { 
  45.         file { 
  46.                 "/tmp/test1.txt"
  47.                 content => "hello"
  48.         } 
  49.  } 
  50.  import "modules.pp" 
  51.  import "node*.pp" 
  52.  
  53. $ sudo vim modules.pp   #导入模块配置,添加如下行:
  54.  import "mysql-server" 
  55.  
  56. $ sudo vim node1.pp  #节点配置文件,添加如下行:
  57.  node 'client.puppet.com' { 
  58.         include mysql-server 
  59.  }  
  60.  
  61. #文件服务器配置:
  62. $ cd /etc/puppet 
  63. $ sudo vim fileserver.conf  #文件服务器配置文件,添加如下:
  64.  [mysql-server] 
  65.     path /etc/puppet/modules/mysql-server/files 
  66.     allow * 
(5)在客户端执行如下命令:mysql就会在客户端下安装(如想让puppet以守护进程运行,去掉--test参数即可,puppetd命令的详细参数请参照:puppetd --help) 
  
  
  
  
  1. $ sudo puppetd --test --server server.puppet.com 
至此puppet已配置完毕,此篇内容,主要针对入门级简单应用,更多的puppet的语法,如puppet函数(puppet称之为define),数组,以及puppet的更高级的内容,如和nginx结合puppet做集群等等,本文并未涉及,有兴趣的同学可参考puppet官方文档。

你可能感兴趣的:(类,配置,资源,puppet)