puppet入门

作者: milo_e1ce | 来源:发表于2017-06-09 09:53 被阅读429次

    1.puppet 是什么

    puppet是一个开源的软件自动化配置和部署工具,很多大型IT公司均在使用puppet对集群中的软件进行管理和部署。

    2.  设计架构

    puppet是基于c/s架构的。服务器端保存着所有对客户端服务器的配置代码,在puppet里面叫做manifest.

    客户端下载manifest之后,可以根据manifest对服务器进行配置,例如软件包管理,用户管理和文件管理等等。

    如上图所示,puppet的工作流程如下:

    (1)客户端puppetd调用facter,facter探测出主机的一些变量,例如主机名,内存大小,ip地址等。pupppetd 把这些信息通过ssl连接发送到服务器端;

    (2)服务器端的puppetmaster 检测客户端的主机名,然后找到manifest里面对应的node配置, 并对该部分内容进行解析,facter送过来的信息可以作为变量处理,

    node牵涉到的代码才解析,其他没牵涉的代码不解析。解析分为几个阶段,语法检查,如果语法错误就报错。如果语法没错,就继续解析,解析的结果生成一个中间的“伪代码”,然后把伪代码发给客户端;

    (3)客户端接收到“伪代码”,并且执行,客户端把执行结果发送给服务器;

    (4)服务器端把客户端的执行结果写入日志。

    puppet工作过程中有两点值得注意:

    1.为了保证安全,client和master之间是基于ssl和证书的,只有经master证书认证的client可以与master通信;

    2.puppet会让系统保持在你所期望的某种状态并一直维持下去,如检测某个文件并保证其一直存在,保证ssh服务始终开启,如果文件被删除了或者ssh服务被关闭了,puppet下次执行时(默认30分钟),会重新创建该文件或者启动ssh服务。

    3 puppet语法

    1 资源

    1.常用的资源主要有以下几个:

    file:文件管理更详细资料

    package:软件包管理更详细资料

    service:系统服务管理更详细资料

    cron:配置定期任务更详细资料

    exec:运行shell命令更详细资料

    2.资源常用属性

    1资源公共属性

    before         用于控制不同对象(资源)的执行顺序关系,表示某个对象(资源)在另一个对象之后发生(require与之相反,它表示之前发生)。

    subscribe     检测某个资源,当它发生变化时,该资源会重新加载。

    2 file资源

    owner设置文件的属主

    group指定那个该文件的用户组,值可以是gid或者组名

    modemode用于设置文件的权限

    content        一个文件的内容可以由content属性来包含固定的内容,

    source         可以用source命令来从其他url复制文件内容。

    template      利用template,可以通过erb模板生成文件内容,erb模板可以使用变量。而且还可以对变量进行计算和操作。

    3 package资源

    ensure设置该软件包应该在什么状态.

    installed 表示要安装该软件,也可以写成present;

    absent 表示反安装该软件;

    pureged 表示干净的移除该软件;

    latest 表示安装软件包的最新版本.

    4 service资源

    enable          服务在开机的时候是否启动,可以设置的值是true和false,需要provider支持enableable

    ensure          是否运行服务, running表示运行服务,stopped 表示停止服务

    restart           指定重启脚本,否则就先停止该服务再启动该服务

    start              指定启动服务的命令,通常init模式的管理脚本都支持,不需要手工指定

    status            指定status命令,如果不指定,就从进程列表查询该服务

    stop              指定停止服务的脚本.

    2 类和函数

    1类

    类可以把多个相关的资源定义在一起,组成一个类,类可以继承。

    c l a s s  ssh {

    f i l e    {

    " / e t c / ssh / sshd_config ":

    source  =>   " puppet : / / $ f i l e s e r v e r / ssh / sshd_config

    . cfg " ;

    }

    package   {

    " ssh ":

    ensure=>   i n s t a l l e d ;

    }

    s e r v i c e    {

    " ssh ":

    ensure=>  running ;

    }

    }

    这里,file/etc/ssh/sshd_config的内容是从puppet服务器上面下载的,file资源的内容可以从

    别的url得到,也可以erb模板生成,erb模板是很强大的工具,这个后面会说到。package

    资源安装ssh软件,service资源保证ssh服务在运行状态。类的继承这里就不讲了,因为是

    入门手册,另外用的不多。

    2函数

    函数(在puppet中称为“defination”)可以把多个资源包装成一个资源,或者把一个资源包装成一个模型,便于使用。

    例如,在debian里面管理一个apache虚拟机非常简单,把一个虚拟主机的配置文件放到/etc/sites-available/里面,

    然后做一个符号链接到/etc/sites-enabled目录。

    你可以为你每个虚拟主机复制同样的配置代码,但是如果你使用下面的代码就会更好和更简单:

    define virtual_host($docroot,$ip,$order=500,$ensure= “enabled”) {

    $file= “/etc/sites-available/$name.conf”

    # The template fills in the docroot, ip, and name.

    file {$file:

    content => template(“virtual_host.erb”),

    notify  => Service[apache]

    }

    file { “/etc/sites-enabled/$order-$name.conf”:

    ensure=>$ensure? {

    enabled  =>$file,

    disabled => absent

    }

    }

    }

    然后,你就可以使用这个定义来管理一个apache虚拟主机,如下面代码所示:

    virtual_host { “reductivelabs.com”:

    order   =>100,

    ip      => “192.168.0.100″,

    docroot => “/var/www/reductivelabs.com/htdocs”

    3 节点

    puppet如何区分不同的客户端,并且给不同的服务端分配manifest呢?puppet使用叫做node的语法来做这个事情,node 后面跟客户端的主机名3,例如下面的例子:

    node' host1 . example . com '{

    i n c l u d e ssh

    }

    node' host2 . example . com '{

    i n c l u d e apache , mysql , php

    }

    当主机host1.example.com来连服务端时,只会执行node 'host1.example.com'里面的代码,不会执行nodehost2.example.com里面的代码。正如前面所说,可以定义一个default

    结点。比如没有针对host3的node配置,host3就用default的配置了。在这里include的意思是include 类。同样,节点也支持继承。

    4 变量和数组

    1 变量:

    puppet也和其他语言一样,支持变量和数组,puppet用$符号定义变量,变量的内容用双引号括起来。例如 :

    $ t e s t=" h e l l o , guys "

    f i l e {

    " /tmp/ t e s t ":

    content => $ t e s t ;

    }

    puppet可以使用由facter提交的变量,facter在客户端收集系统信息整理成不同的变量提交给puppet服务器端,服务器端的代码可以使用这些变量实现高级的功能,例如不同的硬件配置生成不同的应用软件配置文件。

    运行facter命令可以看到很多变量的输出,这些变量可以在puppet代码里面直接使用。

    2 数组:

    puppet利用方括号来定义数组,数组的内容由逗号分割,例如下面的例子:

    [ " apache2 " , " httpd " , " ssh " ]

    数组可以用在资源定义里面,例如前面提到的例子。也可以用在函数里面,例如:

    d e f i n e php : : pear ( ) {

    package { " `php

    $ {name} " :ensure=> i n s t a l l e d }

    }

    php : : pear { [' ldap ',' mysql ',' ps ','snmp ',' s q l i t e ',' t i d y ', '

    xmlrpc ' ] : }

    变量也有有效范围,同其他语言一样分为局部和全局变量,简单说来,就是在里面定义的变量的使用范围就限制在里面。

    5 模块

    一个模块就是一个/etc/puppet/modules目录下面的一个目录和它的子目录,在puppet的主文件site.pp里面用import modulename可以插入模块。新版本的puppet可以自动插入/etc/puppet/modules目录下的模块。

    引入模块,可以结构化代码,便于分享和管理。例如关于apache的所有配置都写到apache模块下面。

    一个模块目录下面通常包括三个目录:files,manifests,templates。manifests 里面必须要包括一个init.pp的文件,这是该模块的初始(入口)文件,导入一个模块的时候,会从init.pp开始执行。可以把所有的代码都写到init.pp里面,也可以分成多个pp文件,init 再去包含其他文件。files目录是该模块的文件发布目录,puppet提供一个文件分发机制,类似rsync的模块。templates 目录包含erb模型文件,这个和file资源的template属性有关。

    puppet安装好以后,modules目录是没有的,自己建立一个就行,然后在里面可以新增加你的模块。

    4 常用命令

    [root@linuxmaster1poc ~]# puppet help

    Usage: puppet [options] [options]

    Available subcommands, from Puppet Faces:

    ca                Local Puppet Certificate Authority management. #管理本地证书

    catalog           Compile, save, view, and convert catalogs. #编译、保存、查看puppet代码,或转换成Catalogs

    certificate       Provide access to the CAforcertificate management. #提供访问CA证书的管理

    certificate_request  Manage certificate requests. #管理证书的请求

    certificate_revocation_list  Manage the list of revoked certificates. #管理撤销证书的列表

    config            InteractwithPuppet's configuration options. #配置现象

    facts             Retrieve and store facts. #系统信息检查

    file              Retrieve and store filesina filebucket #在filebucket中检索和存储文件

    help              Display Puppet help. #查看帮助

    instrumentation_data  Manage instrumentation listener accumulated data. #管理监听的数据

    instrumentation_listener  Manage instrumentation listeners. #管理监听的状态

    instrumentation_probe  Manage instrumentation probes. #管理监听探测

    key               Create, save, and remove certificate keys. #创建、保存、删除证书密钥

    man               Display Puppet manual pages. #查看手册

    module            Creates, installs and searchesformodules on the Puppet Forge. #从Puppet Forge创建、安装、查询模块

    node              View and manage node definitions. #管理节点

    parser            Interact directlywiththe parser. #解析器管理,检查pp文件语法

    plugin            Interactwiththe Puppet plugin system. #插件管理

    report            Create, display, and submit reports. #创建、查看报告

    resource          API only: interact directlywithresources via the RAL. #查看资源帮助

    resource_type     View classes, defined resource types, and nodes from all manifests. #查看类、默认资源类型与节点信息

    secret_agent      Mimics puppet agent. #模拟Agent

    status            View puppet server status. #查看puppet状态

    Available applications, soon to be ported to Faces:

    agent             The puppet agent daemon #客户端进程,负责从Master端获取信息

    apply             Apply Puppet manifests locally #运行本地manifests

    cert              Manage certificates and requests #证书颁发,用于签署证书

    describe          Display help about resource types #资源帮助

    device            Manage remote network devices #管理远程网络设备

    doc               Generate Puppet documentation and references #生成puppet文档

    filebucket        Store and retrieve filesina filebucket #在filebucket中检索和存储文件

    inspect           Send an inspection report #发送report报告

    kick              Remotely control puppet agent #远程控制agent,远程触发puppet agent命令

    master            The puppet master daemon #编译配置文件、模板、节点的自定义插件

    queue             Queuing daemonforasynchronous storeconfigs #队列进程

    See'puppet help 'forhelp on a specific subcommand action.

    See'puppet help 'forhelp on a specific subcommand.

    Puppet v2.7.23

    1、常用命令:

    1.`puppet master`#编译配置文件、模板、节点的自定义插件

    2.`puppet agent`#客户端进程,负责从Master获取数据

    3.`puppet cert`#证书颁发,用于签署证书

    4.`puppet kick`#远程控制agent,远程触发puppet agent命令

    5.`puppet apply`#运行本地manifests

    2、帮助:

    1.`puppet doc`#生成puppet文档

    2.`puppet help`#显示puppet帮助信息

    3.`puppet resource`#查看资源帮助

    4.`puppet describe`#资源帮助

    5.`puppet status`#查看puppet状态

    3、模块和不常用命令:

    1.`puppet module`#从puppet forge创建、安装、查询模块

    2.` puppet device`#远程管理网络设备

    3.`puppet inspect`#发送report报告

    4.`puppet filebucket`#在filebucket中检索和存储文件

    5.`puppet queue`#队列进程

    5 实例操作

    启动

    [root@testsns opt]# /etc/init.d/puppetmaster start

    认证:

    客户端发送请求Puppeted --test –server testsns (testsns为client名称)

    服务器查看Puppetca –list

    服务器端签名Puppetca –s –a //对所有客户端全部签名Puppetca –s nfstest //只签名某个客户端  (nfs test为client名称)

    1文件分发:

    通过puppet可以向被管理机上推送文件,方法是使用file类型的source属性

    1:修改/etc/puppet/fileserver.conf

    2:修改/etc/puppet/manifests/ site.pp

    实例:要把server服务器上/opt目录下的mysql-5.1.49-linux-i686-icc-glibc23.tar.gz传输至client服务器的/opt目录下,文件名不变。

    第一步

    Vi /etc/puppet/fileserver.conf

    [files]

    path /opt/

    allow 192.168.133.0/24

    第二步

    vi /etc/puppet/manifests/site.pp

    file

    { "/opt/mysql-5.1.49-linux-i686-icc-glibc23.tar.gz":

    source => "puppet://$puppetserver/files/mysql-5.1.49-linux-i686-icc-glibc23.tar.gz",

    }

    第三步

    在client客户端执行更新命令

    puppetd --test --server testsns

    此处“$puppetserver”是puppet Server端的名称,即hostname,网上教程都是在hosts里指定。testnsns为client名字

    2修改文件属性:

    实例:把/tmp/dd142/ puppet-2.6.13.tar.gz文件的权限改为puppet用户,并设置权限为666。

    第一步:

    编辑Server端的site.pp

    vi /etc/puppet/manifests/site.pp

    ---内容如下

    file

    { "/tmp/dd142/puppet-2.6.13.tar.gz":

    owner => "puppet",

    group => "puppet",

    mode => 666,

    }

    第二步:

    在client端执行命令

    puppetd --test --server testsns

    3执行SHELL命令或shell脚本:

    实例:通过puppet分发执行shell脚本,在客户端的opt目录下新建一目录shelldir。

    第一步:

    编辑Server端的site.pp

    vi /etc/puppet/manifests/site.pp

    exec { "exec-mkdir":

    cwd => "/opt",

    command => "sh /opt/lgh.sh",

    user => "root",

    path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",

    }

    第二步:

    在client端编辑一shell脚本

    vi /opt/lgh.sh

    #!/bin/bash

    mkdir /opt/shelldir

    第三步:

    在client端执行命令

    puppetd --test --server testsns

    4Hello World

    实例:一个slave从master中获取其manifest,该maniftest要求slave依次做以下工作:安装gcc,创建文件夹/home/dxc/test,下载文件hello.c程序,编译hello.c。

    (1)    假设代码结构组织

    Master上代码的目录结构如下:

    |– auth.conf

    |– fileserver.conf   #puppet文件服务器配置文件

    |– manifests   #puppet主文件所在目录

    |   |– modules.pp        #puppet各个模块汇总

    |   |– nodes         #各个slave要处理的模块

    |   |   `– execHello.pp      #hello模块对应由那些slave处理

    |   `– site.pp                  #puppet主文件(入口文件)

    |– modules     #puppet的各个模块所在文件

    |   `– hello   #hello模块

    |       |– files    #该模块对应的文件资源,可能是要发送给slave的配置文件等

    |       |   `– hello.c

    |       `– manifests   #模块的manifest文件

    |           `– init.pp                  #模块入口文件

    `– ssl       #puppet的证书文件目录

    (2)    程序执行流程

    代码调用顺序是:

    Slave发起连接请求 =》site.pp =》nodes =》modules =》init.pp

    首先,slave向发起master连接请求,进行证书验证;

    接着,证书验证通过后,master会直接找到入口文件manifests目录下的site.pp文件,该文件可能包含一些全局变量,参数缺省值(当各个模块没有设置这些参数时,它们的缺省值)以及其它pp文件的调用(在该例子中,会调用modules.pp和nodes下的各个pp文件);

    然后,master通过nodes下的各个pp文件定位到该slave要执行的模块(init.pp是各个模块的入口),汇总这些模块代码返回给slave;

    最后,slave根据master发过来的manifest,配置信息。

    相关文章

      网友评论

        本文标题:puppet入门

        本文链接:https://www.haomeiwen.com/subject/tuodxxtx.html