zoukankan      html  css  js  c++  java
  • Puppet基于Master/Agent模式实现LNMP平台部署

    前言

    随着IT行业的迅猛发展,传统的运维方式靠大量人力比较吃力,运维人员面对日益增长的服务器和运维工作,不得不把很多重复的、繁琐的工作利用自动化处理。前期我们介绍了运维自动化工具ansible的简单应用,本期带来的是运维自动化神器puppet基于Master/Agent模式实现LNMP平台部署。

    Puppet

    简介

    Puppet是基于ruby语言开发的一种Linux、Unix、Windows平台的集中配置管理系统,可以C/S模式或独立运行,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。


    工作流程


    ①Agent向Master端发起认证请求

    ②Master端验证其合法性,允许其连接

    ③Agent将本机变量(主机名、内存大小、IP地址等)通过SSL连接发送给Master

    ④Master检测Agent的主机名,然后找到manifest对应的node配置,并对该部分内容进行解析。解析结果生成一个“伪代码”(catelog),并将其发给Agent

    ⑤Agent接收到“伪代码”,开始执行

    ⑥执行时判断有没有File文件,如果有,则向fileserver发起请求

    ⑦判断有没有配置Report,如果已配置,则把执行结果发送给服务器

    ⑧执行结束,检测系统状态


    实现过程


    实验拓扑


    #系统环境:CentOS6.6

    #各主机间可通过域名通信,基于hosts实现

    #各主机时间已同步


    Puppet Master配置

    安装所需软件包

    [root@node1 ~]# yum install puppet puppet-server -y


    创建模块目录

    [root@node1 ~]# cd /etc/puppet/modules/

    [root@node1 modules]# mkdir nginx/{files,manifests} php/{files,manifests} mysql/{files,manifests} -pv


    准备各服务配置文件

    [root@node1 modules]# cp /root/files/nginx.conf nginx/files/

    [root@node1 modules]# cp /root/files/www.conf php/files/

    [root@node1 modules]# cp /root/files/my.cnf mysql/files/


    创建各模块

    [root@node1 modules]# vim nginx/manifests/init.pp

     

    class nginx {

        package{'nginx':

            ensure  => present,

            name    => nginx,

        }

     

        file{'nginx.conf':

            ensure  => file,

            source  => 'puppet:///modules/nginx/nginx.conf',

            path    => '/etc/nginx/nginx.conf',

            require => Package['nginx'],

        }

     

       service{'nginx':

            ensure  => true,

            enable  => true,

            subscribe => File['nginx.conf'],

        }

    }

     

    [root@node1 modules]# vim php/manifests/init.pp

     

    class php {

        package{'php-fpm':

            ensure  => present,

            name    => php-fpm,

        }

     

        file{'www.conf':

            ensure  => file,

            source  => 'puppet:///modules/php/www.conf',

            path    => '/etc/php-fpm.d/www.conf',

            require => Package['php-fpm'],

        }

     

       service{'php-fpm':

            ensure  => true,

            enable  => true,

            subscribe => File['www.conf'],

        }

    }

     

    [root@node1 modules]# vim mysql/manifests/init.pp

     

    class mysql {

        package{'mysql-server':

            ensure  => present,

            name    => 'mysql-server',

        }

     

        file{'my.cnf',:

            ensure  => file,

            source  => 'puppet:///modules/mysql/my.cnf',

            path    => '/etc/my.cnf',

            require => Package['mysql-server'],

        }

     

       service{'mysqld':

            ensure  => true,

            enable  => true,

            subscribe => File['my.cnf'],

        }

    }

     

    [root@node1 modules]# cd ../manifests/

    [root@node1 manifests]# mkdir server

    [root@node1 manifests]# vim server/node3.pp

     

    node 'node3.scholar.com' {

      include mysql

    }

     

    [root@node1 manifests]# vim server/node4.pp

     

    node 'node4.scholar.com' {

      include nginx,php

    }

     

    [root@node1 manifests]# vim site.pp 

     

    import "server/*.pp"


    以上资源详解

    #package详解

    ensure:程序包目标状态,{present(installed)|absent|purged|held|latest}

    name:资源名称,即软件包名字,可省略,如果省略,将继承title的值

    provide:软件包管理器,会自动识别

    source:程序包文件路径

    install_options:安装选项,最常用的是通过INATALLDIR来制定安装目录

    #file详解

    ensuce:目标状态,{present|absent|directory|file|link}

    backup:通过filebacket资源来备份文件,值通常为filebucket资源的名称

    content:文件内容,生成方式有三种(content,source,target),三者彼此互斥

    source:通过制定的url下载文件至本地,格式:puppet:///modules/MODULE_NAME/file_name

    target:为符号链接指定目标

    links:文件为符号连接,{follow|manage}

    path:文件路径,必须使用双引号

    mode:定义权限,通常为8进制数字

    owner: 定义文件的属主

    group:定义文件的属组

    force:强制执行删除文件、链接或目录,仅用于ensure为absent时

    purge:清除指定目录中存在的,但未在资源中定义的文件

    resurce:目录递归,{true|false|inf|remote}

    replace:替换,本地存在的文件与资源中指定的文件内容不同时是否执行替换,默认为否

    #service详解

    ensure:服务目标状态,{ true(running)|false(stopped)}

    enable:是否开机自动启动,{true|false}

    name:服务名称,可以省略,如果省略,将继承title的值

    path:服务脚本路径,默认为/etc/init.d/

    start:是否启动服务

    stop:是否关闭服务

    restart:是否重启服务

    status:判断服务是否运行

    #特殊属性

    require:需要依赖于某个资源

    before:应该先执行本资源,在执行别的资源

    notify: 将当前资源的变动信息通知给别的资源

    subscribe:订阅某资源变动信息

    -> :后资源需要依赖前资源

    ~> :前资源变动通知后资源调用


    启动服务

    首次启动puppet-server守护进程时,其会自动进行运行环境的初始化,例如创建一个本地CA及服务器端相关的证书和密钥等。初始化操作完成后,puppet就会监听指定的套接字并等待客户端的连接请求。默认情况下,其证书和密钥等文件位于/var/lib/puppet/ssl/目录中。


    出于调试的目的,首次启动puppet服务进程可以以非守护进程方式进行,并让其输出详解信息以便于观察初始化过程。如下所示过程,其逐步展示了创建本地CA、作为puppet服务器的本地主机向CA申请证书、获得证书以及CA移出证书签署请求的过程等,而后启动服务进程并准备接受各agent的连接请求。为下面的命令额外使用–debug选项,还可以获得更为详细的输出信息。



    如果上述的测试启动没有问题,可中止当前的启动,正式启动服务了


    [root@node1 manifests]# service puppetmaster start

    Starting puppetmaster:                                     [  OK  ]

    [root@node1 manifests]# ss -tnlp | grep puppet

    LISTEN     0      5              *:8140         *:*      users:(("puppetmasterd",3186,5))


    Puppet Agent配置

    安装所需软件包

    [root@node3 ~]# yum install puppet -y


    指定puppet server

    [root@node3 ~]# vim /etc/puppet/puppet.conf   #也可手动命令指定

     

    [agent]

     

    server = node1.scholar.com


    启动服务之前先来看一下各agent端所需软件是否安装

    [root@node3 ~]# rpm -q mysql-server

    package mysql-server is not installed

    [root@node4 ~]# rpm -q ngnix

    package ngnix is not installed

    [root@node4 ~]# rpm -q php-fpm

    package php-fpm is not installed


    启动服务

    puppet agent在首次启动时,会向为其指定的puppet server申请证书,并完成后续连接请求。同样的理由,出于测试的目的,接入当前puppet集群中的首个agent节点可以以非守护进程的方式进行,以观察其初始化过程

    #所有agent端都执行以上系列操作


    此时,在puppet服务器端使用puppet cert命令管理客户端的证书请求,其–list选项能够查看等待签署证书的客户端列表,而–sign选项可用于为指定指定节点签署证书,如果要一次性地为多个节点的证书申请进行签署可同时使用–all选项


    正式启动服务

    [root@node3 ~]# service puppet start

    Starting puppet:                                           [  OK  ]

    [root@node4 ~]# service puppet start

    Starting puppet:                                           [  OK  ]


    再次检查各agent端软件状态

    [root@node3 ~]# rpm -q mysql-server

    mysql-server-5.1.73-5.el6_6.x86_64

    [root@node3 ~]# service mysqld status

    mysqld (pid  4526) is running...

    [root@node3 ~]# chkconfig --list mysqld

    mysqld             0:off   1:off   2:on    3:on    4:on    5:on    6:off

    [root@node4 ~]# rpm -q nginx 

    nginx-1.0.15-11.el6.x86_64

    [root@node4 ~]# service nginx status

    nginx (pid  6678) is running...

    [root@node4 ~]# chkconfig --list nginx

    nginx             0:off   1:off   2:on    3:on    4:on    5:on    6:off

    [root@node4 ~]# rpm -q php-fpm

    php-fpm-5.3.3-46.el6_6.x86_64

    [root@node4 ~]# service php-fpm status

    php-fpm (pid  6309) is running...

    [root@node4 ~]# chkconfig --list php-fpm

    php-fpm         0:off   1:off   2:on    3:on    4:on    5:on    6:off


    各服务已按预设启动,Puppet基于Master/Agent模式实现LNMP平台部署成功完成


    Puppet Kick

    agent跟master默认30分钟通信一次,如果在这期间,某一服务出现bug或配置有误,如何实现紧急推送,尽量减少业务损失呢?下面简单说一下puppet kick功能的实现


    Puppet Agent配置

    [root@node3 ~]# vim /etc/puppet/puppet.conf 

     

    [agent]

     

    listen=true

     

    [root@node3 ~]# vim /etc/puppet/namespaceauth.conf

     

    [puppetrunner]

    allow *.scholar.com

     

    [root@node3 ~]# vim /etc/puppet/auth.conf 

     

    path /run

    method save

    allow node1.scholar.com

    # this one is not stricly necessary, but it has the merit

    # to show the default policy which is deny everything else

    path /

    auth any

     

    [root@node3 ~]# service puppet restart

    Stopping puppet:                                           [  OK  ]

    Starting puppet:                                           [  OK  ]

     

    #所有agent都执行以上操作


    Puppet Master推送

    [root@node1 ~]# puppet kick -p 10 --host node3.scholar.com

    Triggering node3.scholar.com

    Getting status

    status is success

    node3.scholar.com finished with exit code 0

    Finished


    推送成功,puppet kick功能实现,至此,Puppet基于Master/Agent模式实现LNMP平台部署实验全部完成

    The end

    Puppet基本应用就先说到这里了,Puppet功能强大,从管理规模方面较之Ansible,Puppet还是略胜一筹的,以上只是牛刀小试,有兴趣的朋友可以深入研究。






  • 相关阅读:
    用华为云cli(命令行程序),管理华为云服务器的,安全组端口
    分布式运算中,高精度校时器的畅想
    powershell版,Fail2Ban脚本,阻止黑客攻击sshd
    对比nushell和powershell
    TagHelper 中使用 ViewBag 及其他
    测试其它 节选自《闻缺陷则喜》(此书可免费下载)
    单元测试 节选自《闻缺陷则喜》(此书可免费下载)
    概要设计 其它 节选自《闻缺陷则喜》(此书可免费下载)
    python进程
    JWT-jwt是什么
  • 原文地址:https://www.cnblogs.com/sanyuanempire/p/6169486.html
Copyright © 2011-2022 走看看