puppet基础与常用模块使用

1,puppet简介

puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。

puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互。每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证和该配置信息同步。每个puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置客户端. 配置完成以后,puppet客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息.



性    质 :    集中配置管理系统

特    点 :       使用自有的puppet描述语言

设计目标 :    简化对这些资源的管理

2,puppet工作模式

puppet既可以在单机上使用,也可以以c/s结构使用.在大规模使用puppet的情况下,通常使用c/s结构.在这种结构中puppet客户端只是指运行puppet的服务器,puppet服务器端是只运行puppetmaster的服务器.

puppet客户端首先会连接到puppet服务器端,并且通过facter工具把客户端的基本配置信息发送给服务器端. 服务器端通过分析客户端的主机名,通过node 定义,找到该主机的配置代码,然后编译配置代码,把编译好的配置代码发回客户端,客户端执行代码完成配置.并且把代码执行情况反馈给puppet服务器端.

工作模式图:

spacer.gifwKiom1aPTtWCdsc6AACLO2bTsuQ078.png

1,agent 每隔默认30分钟请求master自己的清单(站点清单)

2,master在清单内获取agent需要的站点清单

3,将清单编译为catalog

4,发送给agent

5-6,agent进行状态查询,如果已经和目标状态一致则不执行,不一致的则模拟执行,强制执行

7,将执行结果发送给master

3,单机puppet安装

libselinux-ruby-2.0.94-5.8.el6.x86_64  (报错依赖ruby(selinux)需要安装)

facter-2.2.0-1.el6.x86_64.rpm

hiera-1.3.4-1.el6.noarch.rpm

puppet-3.7.1-1.el6.noarch.rpm

4,puppet详细基础与常用模块使用

    OS Provisioning: PXE, Cobbler

    OS Config: puppet, saltstack

    task exec: fabric, func

    Deployment: fabric

    OS Config:

        ansible: tasks (yaml)

            - name: 

              module_name: module_arguments

        目标状态:expected state

        幂等性:

    puppet: 开源的新一代的集中化配置管理工具,它通过自己专有的“声明语言”来定义目标状态,并且通过C/S模式的架构,达成目标;

        Ruby语言研发;

        Puppet Labs, Luke Kanies

    运维工具:

        agent: agent/master

        agentless: ansible

        puppet: agent/master

            master: 

            agent: 默认每30分钟

            https: 互相验正彼此的证书;加密;

                master: 证书,一般为自签,master可自行扮演CA的角色;

                agent: 证书,生成CSR发送给master(CA)

        IT基础设施自动化管理的整个生命周期:

                provisioning

                configuration

                orchestration

                reporting

            puppet的工作模型:

                   定义:使用puppet的声明语言定义基础配置信息;

                   模拟:agent端从master拿到自己相关的配置之后先做测试性的应用于本地;

                   强制:将配置应用于本机;

                   报告:向master报告应用结果状态;

               puppet: 定义“目标状态”

                   配置语言层

                   事务层

                   资源抽象层

                       资源分为多种类型:例如用户、组、文件、程序包等;

                       属性及状态描述与实现方式分离:

                           定义时只需描述属性,而无须关心其实现方式

                       期望状态:present, absent等;

        puppet的使用模式:

            agent: 单机模式

            agent/master:主从模式

        Puppet的核心术语:

            资源(resource):

            清单(manifest):资源定义在的文件;

                资源清单:定义资源

                站点清单:定义主机及其调用的模块

            模块(module):manifest及其内部所定义的资源依赖到的其它数据,例如文件或模板等,按特定结构组织起来形式成目录结构即为“模块”;

    单机模式:

        程序包:

            http://yum.puppetlabs.com/

            http://docs.puppetlabs.com/guides/install_puppet/install_el.html

            版本:0.24.x --> 0.25.x --> 2.6.x --> 2.7.x --> 3.x

        获取所有可用资源类型:

            puppet describe -l

        获取某特定资源的使用帮助:

            puppet describe [-s] resource_type

        定义资源:保存于资源清单(manifest)中

            Resource_TYPE {title:

                attribute1    =>    value1,

                attribute2    =>     value2,

                ...

            } 


            注意:Resource_TYPE必须全部使用小写字母;同一类型中的资源的title不允许相同;

        示例:

            user {'mageedu':

                uid    => '700',

                shell    => '/bin/tcsh',

                ensure    => present,

            }

            每个资源的定义: 类型、title、属性;

执行:

1,测试,输出信息执行(不是真正的执行)

            puppet apply --test --noop --verbose --debug  file.pp

2,实际执行

             puppet apply  file.pp

       

 资源中的特殊属性:

            Name/NameVar:

                大多数的都有一个名为name的属性,其通常可默认引用资源的title为其值;

            ensure:

                指明资源的存在性及额外属性;

            MetaParameters

        常用的资源类型:

            notify, cron, exec, service, file, package, group, user

            (1) notify

                message:通知的信息内容

示例:

                notify {'warning':

                    message    => "From warning notify resource.",

                }

            (2) cron

                ensure: 目标状态

                command: 命令

                hour

                minute

                month

                monthday

                weekday

                name: 名称

                user: 接收此任务的用户

                environment: 运行时的环境变量

示例:

                cron {'message':

                    minute    => '*/10',

                    command    => '/bin/echo "puppet"',

                    name    => 'echo something',

                    ensure    => present,

                }

            (3) exec

                command (NameVar):要执行命令;必须幂等的;

                creates:此属性指定的文件不存在时才执行此资源;

                onlyif: 此属性指定的测试条件返回成功状态码时,才运行此资源指定的命令;

                unless: 此属性指定的测试条件返回错误状态码时,才运行此资源指定的命令;

                user: 以此属性指定的用户身份运行资源指定的命令;

                group:

                path: 命令的搜索路径合集;

                cwd:在此属性指定的路径下运行此命令;

                refresh: 定义如何refresh此资源;当此exec资源接收到其它资源的事件通知时的默认行为是再运行一次此资源,refresh属性就用于改变这种默认行为;

                refreshonly:仅在收到refresh通知时才执行此exec资源指定的命令;

                timeout: 命令运行超时时长;

                tries: 尝试运行的次数;

示例:

                exec{'touch':

                        command => '/bin/mkdir -p /abc && echo "one">>/abc/a.txt',

                        path => '/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin',

                        user => root,

                        onlyif => 'test -f /bb.txt',   #当这个条件返回为成功,才执行上面的命令

                }

                exec {'test':

                    command    => 'echo "hi from exec again" >> /tmp/hello.puppet',

                     path     => '/bin:/sbin:/usr/bin:/usr/sbin',

                    unless    => 'test -f /tmp/hello.puppet',  #当这个条件返回为失败,才执行上面的命令

                }            

                注意:如果不指定path属性,则命令必须为绝对路径,且shell内建命令可能无法运行;


            (4) file

                content:直接给定文件内容;

                source: 复制此属性指定的文件为此file定义的文件的内容;

                recurse: 如果source指定的路径为目录可递归传输整个目录;true or false;

                checksum: 指定使用何种方式检查文件内容是否发生改变;

                ctime:

                mtime:

                ensure: 文件存在与否及其文件类型

                    file, directory, link, present, absent

                target: 当ensure为link时,指定链接的源文件;

                force:强制运行与否;

                owner: 属主

                group: 属组

                links:复制时如何处理链接文件,follow, ignore, manage; 

                mode: 权限

                path: NameVar,文件路径;

示例:

                file {'/tmp/mydir':

                    ensure    => directory,

                }

                file {'/tmp/mydir/test.txt':

                    content    => 'hello from file resource',

                    ensure    => file,

                }

                file {'/tmp/mydir/fstab.puppet':

                    source    => '/etc/fstab',

                    ensure    => file,

                }

                file {'/tmp/mydir/fstab.link':

                    target    => '/tmp/mydir/fstab.puppet',

                    ensure    => link,

                }

                file {'/tmp/pam.puppet':

                    source    => '/etc/pam.d',

                    recurse    => true,

                    ensure    => directory,

                }

            (5) group

                name: 组名,NameVar

                gid: GID

                system: 是否为系统组;

示例:

                group {'mygrp':

                    gid    => 2000,

                    system    => false,

                }    

            (6) user

                comment:注释 

                ensure:

                expiry: 过期时间

                gid: 基本组

                groups: 附加组

                managehome: 是否让家目录具有“可管理性”;

                home: 家目录路径

                shell: 默认shell;

                system: 是否为系统用户;

                uid: UID

                name: NameVar,用户名;

                password:密码

                password_max_age:

                password_min_age:

示例:

                group {'mysql':

                    ensure    => present,

                    system    => true,

                    gid    => 306,

                }

                group {'dbusers':

                    ensure    => present,

                    gid    => 3306,

                }

                user {'mysql':

                    ensure    => present,

                    uid    => 306,

                    gid    => 306,

                    groups    => 'dbusers',

                    system    => true,

                }    

            (7) package

                ensure: present, absent, latest, installed或版本号;

                name: 程序包名,NameVar;

                source:程序包来源;

                provider: 指定要使用包管理器;

示例:

                package{'zsh':

                    ensure    => installed,

                }

                package{'nginx':

                    ensure    => installed,

                    provider => rpm,

                    source    => '/tmp/nginx-1.6.2-1.el6.ngx.x86_64.rpm',

                }

            (8) service

                ensure:running, true; stopped, false;

                enable: 是否开机自动启动;

                hasrestart: 告诉puppet服务脚本是否运行使用“restart”参数;

                hasstatus:告诉puppet服务脚本是否运行使用“status”参数;

                name: 脚本名称;

                path: 脚本查找路径

                pattern: 指明搜索服务相关的进程的模式;用于当脚本不支持使用restart/status参数时帮助判定服务是否运行;

                restart:手动指定用于服务“重启”的命令;

                start:

                stop:

                status:

示例:

                #安装nginx

                package{'nginx':

                    ensure    => installed,

                    provider => rpm,

                    source    => '/tmp/nginx-1.6.2-1.el6.ngx.x86_64.rpm',

                }

                #复制配置文件

                file {'/etc/nginx/conf.d/default.conf':

                    ensure    => file,

                    source    => '/tmp/default.conf',

                    notify    => Service['nginx'],      #一旦default.conf文件内容有变(MD5校验),会通知Service['nginx']做refresh(重新执行一遍)

                }

                file {'/etc/nginx/nginx.conf':

                    ensure    => file,

                    source    => '/tmp/nginx.conf',

                    notify    => Service['nginx'],

                }

                service{'nginx':

                    ensure    => running,

                    enable    => true,

                    require    => Package['nginx'],  #当前资源必须在Package['nginx'],之后运行。

                    restart    => '/etc/rc.d/init.d/nginx reload',   #手动指定用于服务“重启”的命令。默认为stop再start

                }            

5,资源的第三种特殊属性:Metaparameters

            定义资源间的依赖关系:

                before:当前资源必须在before属性指定的资源运行之前先运行;

                require:当前资源必须在require属性指定的资源运行之后再运行;

            定义资源间的依赖关系及触发关系:

                notify:当前资源必须在notify属性指定的资源运行之前先运行,而且,一旦此资源发生了改变,会通知nofity属性所引用的资源;

                subscribe:当前资源必须在subscribe属性指定的资源运行之后再运行,而且,一旦subscribe指定的资源发生了改变,会通知当前资源;

            注意:此四个参数均以其它资源为其值,通过“资源引用”来实现;

                资源引用的方式:Type['title'],类型首字母必须大写;、

示例:

                group {'mysql':

                        ensure  => present,

                        system  => true,

                        gid     => 306,

                        before  => User['mysql'],       #必须在User['mysql']之前运行。

                }

                group {'dbusers':

                        ensure  => present,

                        gid     => 3306,

                        before  => User['mysql'],

                }

                user {'mysql':

                        ensure  => present,

                        uid     => 306,

                        gid     => 306,

                        groups  => 'dbusers',

                        system  => true,

                }