码迷,mamicode.com
首页 > 其他好文 > 详细

puppet基础(一)

时间:2015-02-06 15:16:48      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:puppet

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

特点:

(1)puppet的使用模型:

    单机环境运行

    master/agent环境运行

(2)puppet的运行具有幂等性:

    也就是只要agent加入master,无论命令发送给agent执行多少次,其结果都是一样的。

(3)puppet的运行基本原理:

    资源类型(resource):用来定义agent(模糊的去除了单机环境)最终需要完成的任务,注意:不是定义agent使用什么具体的命令来执行。比如定义用户增加、删除、其他属性的"user 资源类型"。安装服务软件的"package 资源类型"。传递配置文件的"file 资源类型"。启动、停止、重启服务的"service 资源类型"。以及执行自定义命令的"exec 资源类型"。等等。。。

    类(class):用来定义一组具有关联的、可以流程化执行的"资源类型的集合"。比如我们可以先定义"package 安装软件",接着定义"file 传递配置文件",最后定义"service 启动服务"。

    模块(moudle):包含了多个类文件的目录。模块是为了实现预定义配置信息的复用,将类组成了模块。可以运行在不同的节点上,这些模块可以自动判断agent node的不同。模块才是puppet的核心。

    master端在发送命令到agent端前,先将需要运行的指定的命令编译成catalog的格式,然后再发送给agent执行。这类似于tomcat或者变异PHP,需要在执行前需要先编译成为二进制格式。但是当agent的操作系统、版本号、甚至软件是标准或编译版本(nginx/tengine),nginx是正向代理还是反向代理的呢?facter这个软件给我们提供了尽可能多的信息,可以使用"facter -p"命令得到我们想要几乎全部信息。这也类似于ansible啊!好多类似!!!

    而master与agent之间的通信是基于SSL协议进行,所以必须使用FQDN(所以不能使用IP了)进行连接。但是具体的传输配置时通过XMLRPM(模糊的讲可以是xml文件)通过httpd服务进行通信,但是agent却不需要安装浏览器。

    所以具体执行过程如下:

    master[moudle{class(resource)}] ==>  master[使用FQDN得到agent的facter信息,选择合适class]  ==>  master[生成适合agent node的catalog]  ==>  agent[执行]

    

puppet的工作流程:

    1、define:使用puppet语言定义资源的状态

    2、模拟:根据资源关系图,puppet可以模拟部署(无损运行测试代码)

    3、强制:比对客户端状态和定义的资源状态是否一致,自动强制执行

    4、report:通过puppet api,可以讲日志发送到第三方监控工具。

puppet的抽象工作模型:

    第一层:configuration language

            配置语言层

    第二层:transactional layer

            事务层:管理具有依赖关系资源间的联动顺序

    第三层:resource abstraction layer

            资源抽象层,管理资源对象的,比如给具体的对象赋值。


以上这些都是简单模糊的介绍,下面先从单机环境开始实操!


资源清单(mainfest):

    资源清单包含了很多(可以执行的)资源类型或者class,这些文件都以".pp"结尾,所以模块就是包含了一堆".pp"文件的目录。


资源申报:

     资源清单中"每一个"被定义的资源类型,也叫做资源申报。


安装:

    2.6版本:太老,epel的默认提供

    2.7版本:兼容性较好

    3.x版本:引入新特性

    puppet使用ruby语言开发,而ruby又是一种解释型语言,所以puppet安装与平台无关,也就是noarch。 

    puppt-2.7.23-el6.noarch.rpm

        agent端的服务,puppet所有的东西都在这里,而master端反而很小,可能会依赖于facter-1.7.3.1.el6.x86_64.rpm,epel中的老版本facter可以满足需求。

        如果是单机环境,就不需要启动agent了。

    puppt-dash-1.2.23-1.el6.noarch.rpm

        master上的gui访问接口

  puppet-server-2.7.23-1.el6.noarch.rpm

        master上的服务


帮助信息的使用:

puppet apply name.pp  :执行这个类或资源申报

puppet apply -d -v name.pp:执行显示详细的调试信息

puppet describe --help:查看如何使用describe帮助信息的

puppet describe --list:列出所有资源类型及简要描述

puppet describe resource_type:列出指定资源类型的详细帮助


再插入一个"资源定义"(也叫资源申报)的简要语法:

resource_type {"resource_title":
               这里后面必须有冒号,而且必须有引号,可以进行变量替换。
               所以双引号可以变量替换,而单引号不可以。
               一般title对用户而言就是name。
               而对文件而言,一般表示文件名称及路径。
        resource_attribute  =>  values,
               这里最后的","可有可无,一般都有。
               如果开头出现"#",则表示注释 
}


继续讲帮助信息:

# puppet describe package
name  :需要安装的软件名字,比如nginx,这里的一般就是指resource_tile了,
ensure:"present"、"installed"都表示安装
        "absent"表示卸载
        "latest"安装最新版本
比如安装nginx的资源申报这可以这么定义:
package {"vsftpd":
    ensure  =>  "install",
}

# puppet apply vs.pp
notice: /Stage[main]//Package[vsftpd]/ensure: created  返回装态,以创建
notice: Finished catalog run in 9.12 seconds   由于需要yum和编译catalog,所以时间较长。
# puppet describe service
name  :同title
ensure:stop=false停止服务
        true=running开启服务
下面定义vsftpd服务的启动
service {"vsftpd":
    ensure => running,
}
# puppet apply vs.pp 
notice: /Stage[main]//Service[vsftpd]/ensure: ensure changed ‘stopped‘ to ‘running‘
# puppet describe file
path   :一般和title同名,所以可以不指定
ensure :指定title的文件类型,值有link,directory,file,present,absent
         其中present会检查文件是否存在,不存在就会创建一个空文件。
         absent会删除文件或者目录,如果是目录需要指定recurse参数指定是否允许递归
target :如果ensure为link,那么这里就必须为link指定agent的源文件或目录
force  :该参数强制执行文件操作,当遇到"purge 子目录","用文件或者链接文件替换目录"、
         "使用ensure => absent参数删除目录"时,就需要用到该参数。
content:文件内容,由于很难进行格式控制,所以一般不用
source :指定要文件路径,这个文件会被传送到agent端的目标位置。也就是title
         也就是将source中的文件复制到title。
         可以指定多个,但是和content、target冲突。
         source => "puppet:///modules/ssh/etc/ssh/sshd_config" ,
         source => "/etc/passwd", 
mode   :权限,如0644
owner  :属主
group  :属组
file {"/etc/vsftpd/vsftpd.conf":
    ensure => file,
    source => "/root/vsftpd.conf",
    mode   => 0644,
    owner  => root,
    group  => root,
}
在很多语言中及工具都会有允许我们执行shell脚本命令的工具,比如ansible,python、capistrano等等,puppet同样不例外:
# puppet describe exec
path   :定义环境变量
command:可以是命令,多条的话使用";"隔开,也可以是一个脚本。
creates:在agent运行脚本时,可以创建临时的文件或目录
user   :以哪个用户的身份去执行

  


    上面已经完整的定义了vsftpd从安装、启动、到传送自定义配置文件的过程,但是我们如何使得在传递完配置文件后重启服务vsftpd呢?



     













本文出自 “Go right on” 博客,请务必保留此出处http://caduke.blog.51cto.com/3365689/1612237

puppet基础(一)

标签:puppet

原文地址:http://caduke.blog.51cto.com/3365689/1612237

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!