puppet简明教程

puppet简明教程
一、puppet工作流程介绍及安装:
puppet是一款自动化的管理工具,有了他的存在我们可以省去繁杂的重复性的操作。只要定义好相应的规则策略,就能将服务器设置成为我们希望的目标状态。
1、puppet的工作模型。


首先定义资源的状态,所谓的资源的状态,就是我们希望客户端的机器需要实现什么样的目标状态(比如说安装linux,安装mysql等),之后在客户端进行模拟部署,再到后面的强制执行,之后将执行的结果返回给master端可以利用第三方监控工具进行展示。
2、puppet的工作流程。


3、puppet的安装
一般在生产环境中,puppet都是应用在M/S模型下,首先介绍master端的安装
puppet的yum源地址yum.puppetlabs.com,在这个地址可以下载puppet以及puppet-server的rpm包,下载好了之后直接yum安装就可以了。
需要注意的是puppet是需要ruby作为支持的,首先需要保证我们的ruby是安装的。比较稳定的版本是ruby 1.8.7。


二:puppet核心资源介绍
puppet核心的地方就是资源的应用,下面简单的介绍下几种资源的使用方法:
package:用于软件包的安装
service:控制服务的启动情况
file:定义文件
exec:命令的执行
notify:消息通知
user:定义用户
group:定义用户组
cron:设置任务计划
1、package
    package {'nginx':
        ensure      =>present,
        provider    =>yum,
}
ensure =>present 代表的是需要安装上nginx,absent表示卸载,latest表示安装的需要是最新的。下面的yum表示我们安装的方式是什么。此处表示的是yum安装。
2、service
service{'nginx':
        ensure  =>true,
        enable  =>true,
}
ensure表示安装完之后启动服务,enable表示nginx服务以后开机启动(chkconfig nginx on),在定义资源的时候,一般会给资源一个名字,比如上面的package ‘nginx’,service ‘nginx’,并且同一种资源同一个名字只能出现一次。比如我们既然有了一个叫做nginx的package资源就不能再出现同一个的package也叫作nginx。另外两个属性之间利用逗号分开。属性的值一般利用单引号或者是双引号引起来。但是上面例子中的true为关键字不需要引起来。
3、file
file{'nginx.web.conf':
        ensure  =>file,
        path    =>'/etc/nginx/conf.d/default.conf',
        source  =>'puppet:///modules/nginx/nginx.web.conf',
        mode    =>0644,
       }
path指定文件的路径,source指定了在有模块和类的情况下,我们需要从哪个文件获取这个文件。mode为文件的权限。
4、user,group
group {'username':
  ensure => present,
}
 user { 'username':
   ensure           => 'present',
   home             => '/home/username',
   managehome       => true,
   password          =>’***************’ 
   password_max_age => '99999',
   password_min_age => '0', 
   shell            => '/bin/bash',
 }
注意password是我们生成的密文的密码openssl passwd -1 -salt '****',可以利用此命令生成,然后将密码粘贴到此处。
4、exec
    exec { "tar -xf /Volumes/nfs02/important.tar":
          cwd     => "/var/tmp",
          creates => "/var/tmp/myfile",
          path    => ["/usr/bin", "/usr/sbin"]
        }




exec{'echo hello>>/home/xizhao/test.txt':
    path    =>'/usr/bin/:/bin:/sbin:/usr/sbin,
}
其中path位置说明下命令的为止,一般title位置就写好我们需要执行的命令,下面的无非就是,cwd说明的是命令运行的目录,creates后面的value是后面需要创建的文件。
5、notify
notify {'hello world':
    message =>'hello world',
}
message后面直接接上的是要提示的内容。
6、cron
 cron { logrotate:
      command => "/usr/sbin/logrotate",
      user    => root,
      hour    => ['2-4'],
      minute  => '*/10'
}
command定义执行的命令,user定义用户,hour设置时间,此处代表的是2点到4点每10分钟执行一次这个命令。
经常使用的大概就是这几种资源。但是在资源的使用过程中,会有资源之间的相互依赖关系。比如在使用package安装nginx服务,并且在使用service启动nginx的过程中,首先我们需要保证的是nginx先安装,在启动。由此我们需要定义相关的依赖关系
下面通过一个例子加以说明:
  file{'nginx.web.conf':
        ensure  =>file,
        path    =>'/etc/nginx/conf.d/default.conf',
        source  =>'puppet:///modules/nginx/nginx.web.conf',
        mode    =>0644,
        require =>Package['nginx'],
}
    service{'nginx':
        ensure  =>true,
        enable  =>true,
        restart => '/etc/init.d/nginx reload',
        subscribe   =>File['nginx.conf','nginx.web.conf'],
}
require:我们需要引用的资源,引用的时候用法资源类型首字母大写,然后将资源的名称括起来,。require代表的是当前资源执行时,需要某个资源已经执行好。
before:当前资源的执行需要在某个资源的前面执行,和require是相对的。
subscribe:如果我们订阅的资源发生改变的时候,就执行当前资源。
notify:当前资源执行的时候,通知某个资源需要执行,和subscribe相对。
另外在资源的执行过程中我们同样可以使用->  ~>代表的是资源之前的依赖关系,->代表的是先执行符号前面的资源然后执行符号后面的资源,~>代表的订阅关系,前面的资源执行,通知后面的资源执行。


三、selector和case,if的差在哪里:
在使用puppet的过程中,经常会使用到变量,例如在安装web的过程中,我们根据操作系统的不同安装的webserver也是会有明显的差异的。比如说在centos或者是redhat上面我们安装的名字叫做httpd但是在Ubuntu或者是debian上面名字叫做apache2。
1、利用selector
$package = $operatingsystem ?{
/(?i-mx:redhat|centos|fedora)/   =>'httpd',
/(?i-mx:ubuntu|debian)/         =>'apache2',
}


package{"$package":
        ensure  =>present,
}
首先判断操作系统的版本类型并将操作系统的版本保存到package变量中去,然后利用变量进行软件包的安装。


2、利用case
3、
case $operatingsystem {
'CentOS','redhat':   {package{'httpd': ensure =>present}}
/^(Debian|Ubuntu)$/:   {package{'apache2':ensure =>present}}
default:    {notice("Unknown system")}
}
通过上面我们可以发现,利用selector的话我们可以直接将得到的结果赋值给一个变量,并且selector后面跟的也同样是一个变量。但是case后面跟的是一个程序块。如上面的例子中case后面接的package资源块。
3、if
if $operatingsystem == 'CentOS' {
        notify{'centos': message =>'hello centos'}
}elsif $operatingsystem == 'Redhat'{
        notify{'redhat': message =>'hello redhat'}
}elsif $operatingsystem == 'Debian' {
        notify{'Debian': message =>'hello debian'}
}else {notify {'other os': message =>'other os'}}
if和case的情况相同后面同样是一个代码块。


四:puppet模块的使用
在puppet中,有模块的概念,模块在本质上是一类资源的集合,并且模块中的资源可以实现类的相互继承,并且可以利用模板生成相关的文件。
1、
modules/
└── nginx
    ├── files
    ├── lib
    ├── manifests
└── templates
files:目录用于存储文件
lib:ruby插件存储目录
manifests:清单文件存储目录
templates:模板文件存储目录
note:在编写清单文件的时候,清单文件中必须包含的是一个叫做init.pp的文件,并且这个文件中必须包含一个和模块名字相同的类。
class nginx {
    package {'nginx':
        ensure      =>present,
        provider    =>yum,
}
    service {'nginx':
        ensure  =>true,
        enable  =>true,
        subscribe =>File['nginx.conf'],
}
    file {'nginx.conf':
        ensure  =>file,
        path    =>'/etc/nginx/nginx.conf',
        mode    =>0644,
        require =>Package['nginx']
 }


}
include nginx
在上面的例子中,定义了三个资源并且定义了三个资源的依赖关系,最后的include nginx是对nginx资源的引用。如果我们在单击的模型中,想验证清单文件是不是能够正常使用,我们可以puppet apply -d -v -e’include nginx(class-name)’可以显示类应用的详细的信息。
2、另外在引用类的过程中,可以使用变量
$webserver = $operatingsystem ? {
    /^(?i-mx:redhat|centos|fedora)/  =>'httpd',
    /^(?i-mx:ubuntu|debian)/         =>'apache2',


}
class httpd($pkgname = 'apache2') {
    package  {"$pkgname":
        ensure      =>present,
        provider    =>yum,
}
    service {"$pkgname":
        ensure  =>true,
        enable  =>true,
        require =>Package["$pkgname"],
}


}
class {'httpd':
    pkgname    =>$webserver,


注意此时如果我们在本机测试的话,直接puppet apply  httpd.pp(name)就可以了,不要使用puppet apply -v -d -e’include http’如果这样的话前面的判断赋值工作就不会做,那么会按照apache2进行安装。


五、类的继承
1、在使用模块的过程中,一个模块的manifests可以定义多个清单文件,并且多个清单文件直接可以实现继承。
在/etc/puppet/modules/nginx/manifests中定义init.pp文件。其中这个文件只是定义package的安装。
class nginx {
    package {'nginx':
        ensure      =>present,
        provider    =>yum,
}
}
定义子清单
class nginx::web inherits nginx {
    file {'web.nginx.conf':
        ensure  =>file,
        mode    =>0644,
        path    =>'/etc/nginx/nginx.conf',
        source  =>'puppet:///modules/nginx/web.nginx.conf',
        require =>Package['nginx'],
        notify  =>Service['nginx'],
}


    service {'nginx':
        ensure  =>true,
        enable  =>true,
}
}
source:引用的是files目录下的文件,格式为puppet:///modules/modules_name/file_name


2、利用模板生成配置文件
模板文件存放的位置是模块目录下的templates目录下,其中模板的名字以erb结尾,并且在模板中可以使用facts变量。
例如,生成nginx配置文件的时候,其中的开起的进程数量是需要和服务器的物理核心数量是挂钩的,所以在设置的时候可以
user nginx;
worker_processes <% processorcount %>;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
另外在使用模板生成配置文件是需要注意下
class nginx {
    package {'nginx':
        ensure      =>present,
        provider    =>yum,
}
    file {'nginx.conf':
        path    =>'/etc/nginx/nginx.conf',
        ensure  =>file,
        content =>template('nginx/nginx.conf.erb'),
        mode    =>0644,
        require =>Package['nginx'],
}


}
模板的使用情况为content =>template(‘module_name/template_file_name’)前面的属性是content,此处需要注意。






五、puppet M/S架构
puppet是工作在M/S架构上面的,就是在master端定义好相关的清单文件,然后agent端会在规定的一个时间内去读取清单文件,然后检查自己的状态是不是和清单文件中定义的一样,如果不一样则进行目标状态的同步。
1、证书的签订
在master端安装好puppet和puppet-server,agent端安装好puppet客户端即可。
证书的签订是依赖主机名的,所以首先需要在/etc/hosts设置好主机名的解析。在puppet的客户端配置文件设置好server的主机名称。puppet客户端默认的是1800秒向server端同步一次。
证书的签订:
puppet提供了puppet cert 命令来专门的对证书进行操作。较为常用的有
puppet cert list :查看等待服务器端签订的证书
puppet cert list --all:列出已经签订的所有的服务器证书
puppet cert sign hostname(--all):sign后面加上某个单独的主机名的话是对某一个主机进行证书的认证,--all则是对所有请求的证书进行认证。
认证好的证书文件存放的位置是/var/lib/puppet/ssl
2、在使用某个资源的时候,可以利用puppet 进行查看
puppet help:查看puppet支持的命令
puppet describe --list:查看puppet支持的资源有哪些
puppet describe resource_name:查看某个资源的使用方法。
3、M/S实例:
server提供nginx的两种配置,其中一种是nginx作为普通的web服务器,另外一种是nginx作为反向代理服务器。
建立nginx模块
mkdir -pv /etc/puppet/modules/nginx/{templates,files,lib,manifests}
创建清单文件
cd /etc/puppet/modules/nginx/manifests
cat init.pp


class nginx {
    package {'nginx':
        ensure      =>present,
        provider    =>yum,
}
    file {'nginx.conf':
        path    =>'/etc/nginx/nginx.conf',
        ensure  =>file,
        content =>template('nginx/nginx.conf.erb'),
        mode    =>0644,
        require =>Package['nginx'],       
}




}
cat web.pp
class nginx::web inherits nginx{
    file{'nginx.web.conf':
        ensure  =>file,
        path    =>'/etc/nginx/conf.d/default.conf',
        source  =>'puppet:///modules/nginx/nginx.web.conf',
        mode    =>0644,
        require =>Package['nginx'],
}
    service{'nginx':
        ensure  =>true,
        enable  =>true,
        restart => '/etc/init.d/nginx reload',
        subscribe   =>File['nginx.conf','nginx.web.conf'],
}
}
cat rproxy.pp
class nginx::rproxy inherits nginx{
    file{'nginx.rproxy.conf':
        ensure  =>file,
        path    =>'/etc/nginx/conf.d/default.conf',
        source  =>'puppet:///modules/nginx/nginx.rproxy.conf',
        mode    =>0644,
        require =>Package['nginx'],
}
    service{'nginx':
        enable  =>true,
        ensure  =>true,
        subscribe   =>File['nginx.conf','nginx.rproxy.conf'],
}
}
note:nginx::web和nginx::rproxy都继承了nginx类,所以子类中就有了两个file的配置文件,需要注意的是,在同一个类中,同一个资源可以有两个,但是这两个的名字不能相同。此处的两个配置文件一个是/etc/nginx/nginx.conf,而另外的一个则是/etc/nginx/conf.d/default.conf,另外需要注意的是service资源会订阅两个file资源,无论是主清单文件的file资源发生变化还是子清单的file资源发生变化都需要进行service资源的出发操作。
编辑主manifests,对模块和清单进行调用
cd /etc/puppet/manifests
需要加载才能使用
cat node3.pp
node 'node3.com' {
    include nginx::web
}
cat nod4.com.pp
node 'node4.com' {
    include nginx::web
}
最后在site.pp中进行倒入
cat site.pp
import "node3.com.pp"
import "node4.com.pp"
同样可以使用通配符  import “*.com.pp”
这样定义好资源之后重新载入下服务,然后agent端会自动应用资源。
如果我们的资源中没有模块。那么我们可以将资源直接定义在/etc/puppet/manifests/site.pp中。
4、在puppet安装的过程中,如果不同的服务器的需求不一样,我们可以使用节点的继承来解决这个问题
例如:
DBserver:ntp,mysql,zabbix_agent
webserver:ntp,nginx,zabbix_agent
两类节点都有需要安装的同样的部分,但是又都有自己单独的需要安装的软件包。
node ‘base’ {
include ntp
include zabbix_agent
}
node ‘webserver.com’ inherits base {
include nginx
}
这样就可以实现根据不同的需求来定义资源的引用。
5、多个主机需要用相同的资源
例如我们的webserver有多台,都需要用同一个资源。我们可以使用node节点的正则表达式来实现
node /^node[1234]\.com$/ {
include nginx
}
六:puppet模块管理
https://forge.puppet.com/
puppet module 
install
list
uninstall
upgrade
search
可以进行模块的安装,列出,卸载,升级等
七:puppet强制执行,在puppet2.7之后取消了puppet kick的主动推送
puppet kick -p 10 –host 客户端    puppetrun -p 10 –host 客户端 
好了,puppet的基础就暂时这些,有了新的内容之后在更新。
发布了166 篇原创文章 · 获赞 16 · 访问量 32万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章