Puppet学习笔记

一、Puppet基础原理:

Puppet是一款使用GPLV2X协议授权的开源管理配置工具,用ruby语言开发,既可以通过客户端—服务器的方式运行,也可以独立运行。puppet可以为系统管理员提供方便,快捷的系统自动化管理。

二、puppet工作流程

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

三、puppet资源管理

Puppet中的资源是puppet工具的核心,它是通过puppet管理配置系统的最小单位。
1、查看资源类型

puppet describe -l

2、查看资源摘要

puppet describe -s <resource_name>

3、查看资源详细用法

puppet describe <resource_name>

4、资源的基本格式

资源名 { '标题':
       属性1 => '值',
       属性2 => '值',
}

以安装httpd为例

package { 'httpd':
       ensure   => 'present',
       provider => 'rpm',
}

puppet常用资源:file,filebucket,host,group,package,service,exec,cron,notify 等。

5、资源公有属性:

before :指明资源要在某个资源之前运行

require:指明某个资源要在某个资源之后运行。

notify: 主动通知其他资源,本资源的状态

subscibe :被动通知,当它检测到资源状态发生改变的时候,主动更新所在资源状态。

还可以使用

-> 表示资源前后关系

~> 表示资源之间的通知

四、puppet语言

1、puppet变量:

1、名称之前必须以$开头,赋值用=,支持追加赋值+=;  
2、变量名称有两种格式,简短名称,FQN($scope::variable)。

              $webserver = "httpd"

              package {"httpd":

                     ensure => "present",

                     name => $webserver

              }  
3、作用域:top > node > local 作用域越小,优先级越高

2、数据类型:

       1、直接字串

              可以使用引号,也可以不用。

              换行符为\n,windows中\r\n

       2、布尔型

              true,false

              其它类型会自动转换为布尔型。

              所有数字都是true

              空字符串为false,其它字符串为true

       3、数值

              整数

              浮点数

       4、数组,逗号隔开

              $array = ['httpd','mysql','php']

              package {$array:ensure => installed} #依次安装包

       5、hash

              { key1 => value1,key2 => value2,…}

       6、undef,声明未定义的东西不能加上引号的。

3、puppet支持的操作符和对应的表达式:

 比较操作符:

       ==

       !=

       <,>,<=,>=,

       =~ 正则匹配

       !~ 正则不匹配

       in

   布尔操作符:

       and

       or

       !

   算术运算

       +

       –

        /

        *

        <<   左移

        >>   右移
       $osfamily == 'CentOS'  
       $kernel in ['Linux','solaris','freebsd']
4)、puppet的条件判断语句:

       if ..elsif..else

       case

       selector语句 #意思是在两个选项中任选其中一个赋值
  if $operationsystem == 'CentOS'{
              notice("welcome to CentOS")
       }
       elsif $operationsystem == 'Redhat' {
              notice("Welcome to Redhat")
       }
       elsif $operationsystem == 'Fedora' {
              notice("Welcome to Fedora")
       }
       else{
              notice('Welcome to ET')
       }
case $operationsystem {
       'Solaris':  { include role::solaris }
       'Redhat','CentOS' : { include role::redhat }
       /^(Debian|Ubuntu)$/ : { include role::debian }
       default : { include role::generic }
}

$webserver = $operatingsystem ? {
        /(?i-mx:'ubuntu'|debian)/ => 'apache',
        /(?i-mx:redhat|centos|fedora)/ => 'httpd',
        default => 'httpd'
}
i:表示忽略大小写
- : 表示不使用某转移符号
m:表示把 "." 当做换行符使用
x :表示互略模式中空白字符和注释。

五、puppet类和模块

类是具有相同特性和行为的集合。就是一组代码块,在需要时可以通过名称进行调用。只定义类,并不会调用,需要声明才可以。
1、语法:

class class_name [inherits] [base_class] {
       正常的puppet代码
}

如果在同个模块定义了多个类, 可以采双冒号( :: ) 。 
例如定义个nginx模块, 
模块中 定义三个类:
class nginx { … }
class nginx::config { … }
class nginx::vhost { … }

2、类的继承(基类不能有参数):

1、继承资源属性         
2、覆盖资源属性
         =>         
3、追加资源属性
         +>

3、 模块

  模块结构
module name
       mainfests
              init.pp  #必须至少声明一个类。类与模块名相同
              *.pp
               # mudule_name::[subdirname]::mainfect_name
       files:包含的是一个静态文件。puppet的agentmaster模型。
              puppet:///modles/module_name/[subdir_name/]file_name
       templates:模板文件 *.erb 用到ruby语言
              template('');
              content => template('模板文件'),
       lib #插件目录。
       tests :当前模块的使用帮助或者实例文件
       spec :为lib目录的插件提供使用说明,范例的。

六、事例,puppet部署LNMP

1、假定已经安装好puppet-server。

2、主机名通信

cat >> /etc/hosts <<EOF192.168.198.139 puppet-server192.168.198.160 puppet-client
EOF

3、提供puppet文件

mkdir /etc/puppet/modules/lnmp/{manifests,files,templates,tests} -p
vim /etc/puppet/modules/lnmp/manifests/init.pp
class lnmp {
       include lnmp::nginx
       include lnmp::mysql
       include lnmp::php
}

nginx

vim /etc/puppet/modules/lnmp/manifests/nginx.pp
class lnmp::nginx {
    package{'nginx':
        ensure  => present,
        name    => nginx,
    }
    file{'nginx.conf':
        ensure  => file,
        source  => 'puppet:///modules/lnmp/nginx.conf',
        path    => '/etc/nginx/nginx.conf',
        require => Package['nginx'],
    } 
   service{'nginx':
        ensure  => true,
        enable  => true,
        subscribe => File['nginx.conf'],
    }
}

php

 vim /etc/puppet/modules/lnmp/manifests/php.pp
class lnmp::php {
    package{'php-fpm':
        ensure  => present,
        name    => php-fpm,
    }

    file{'www.conf':
        ensure  => file,
        source  => 'puppet:///modules/lnmp/www.conf',
        path    => '/etc/php-fpm.d/www.conf',
        require => Package['php-fpm'],
    }

   service{'php-fpm':
        ensure  => true,
        enable  => true,
        subscribe => File['www.conf'],
    }
}

mysql

 vim /etc/puppet/modules/lnmp/manifests/mysql.pp
 class lnmp::mysql {
    package{'mysql-server':
        ensure  => present,
        name    => 'mysql-server',
    }

    file{'my.cnf':
        ensure  => file,
        source  => 'puppet:///modules/lnmp/my.cnf',
        path    => '/etc/my.cnf',
        require => Package['mysql-server'],
    }

   service{'mysqld':
        ensure  => true,
        enable  => true,
        subscribe => File['my.cnf'],
    }
}
vim /etc/puppet/manifests/site.pp
node 'puppet-client' {   
 include lnmp
}

4、提供服务配置文件

cp /root/files/{nginx.conf,www.conf,my.cnf} /etc/puppet/modules/lnmp/files/

5、启动puppet服务

[root@puppet-server modules]# puppet master --verbose --no-daemonize   #第一次启动以便观察信息Info: Creating a new SSL key for ca
Info: Creating a new SSL certificate request for ca
Info: Certificate Request fingerprint (SHA256): 7B:A9:AB:84:C0:EB:DC:83:0E:EA:8C:81:1E:25:9A:47:5C:3F:10:31:6F:F7:5C:25:BE:B7:41:3C:B8:6B:35:38.....

[root@puppet-client ~]# puppet agent server --server puppet-server --verbose --no-daemonize  #客户端申请证书[root@puppet-server ~]# puppet cert sign puppet-client   #服务器签署证书#稍等一会[root@puppet-client ~]# ss -tnl | egrep "80|3306|9000"LISTEN     0      128                       *:9000                     *:*     
LISTEN     0      50                        *:3306                     *:*     
LISTEN     0      128                       *:80                       *:*

七、总结

供自己以后参考。会不断完善

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容

  • 1.puppet 是什么 puppet是一个开源的软件自动化配置和部署工具,很多大型IT公司均在使用puppet对...
    milo_e1ce阅读 4,851评论 0 4
  • 1. 概述 puppet是一个开源的软件自动化配置和部署工具,它使用简单且功能强大,正得到了越来越多地关注,现在...
    SkTj阅读 600评论 0 0
  • Puppet部署与应用 前言:到目前为止,我们已经搭建了很多的服务器,每一台服务器都需要执行很多的命令,给我的感觉...
    李伟铭MIng阅读 2,690评论 0 3
  • Puppet理论定义: Puppet 是一个跨平台的集中化配置管理系统,它使用自有的描述语言,可管理配置文件、用户...
    属于你的世界阅读 957评论 0 2
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,827评论 0 5