puppet简介、安装配置、语法、命令与实例

简介

puppet主要使用于自动化运维方面,对于拥有众多服务器需要管理的管理员来说,puppet是个不错的选择,使其管理更加轻松,容易。其设计的是c/s建构,可以一个master和多个client。通过master可管理配置客户端的文件、用户、cron任务、软件包、系统服务等。客户端默认半小时向master请求一次以使其与master配置同步,从而使管理员在master上设置配置就可以实现对于众多客户端机器的管理。

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

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

安装与配置

操作系统centos7.3

1、安装前准备

a.关闭selinux

sed -i '/s/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

b. 防火墙

systemctl stop firewalld && systemctl disable firewalld

c. 时间同步

ntpdatetime.nist.gov;echo '*/10 * * * * ntpdate time.nist.gov' >>/var/spool/cron/root

d. 配置域名解析,或直接在hosts里配置主机名

e.设置ssh-key互相通信

ssh-keygen
ssh-copy-id root@192.168.0.132

2、master安装

安装官方仓库
rpm -ivh http://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm
安装puppet
yum -y install puppet puppet-server facter

查看配置文件
cp /etc/puppet/puppet.conf{,.bak} #备份配置文件
vim /etc/puppet/puppet.conf
[main]
    logdir = /var/log/puppet  #默认日志存放路径
    rundir = /var/run/puppet  #pid存放路径
    ssldir = $vardir/ssl #证书存放目录,默认$vardir为/var/lib/puppet
[master]
    certname = puppetmaster.kisspuppet.com  puppetmaster.kisspuppet.com #设置puppetmaster认证服务器名

启动puppet
systemctl start puppetmaster

3、minion安装

安装官方仓库
rpm -ivh http://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm
yum -y install puppet facter

查看配置文件
cp /etc/puppet/puppet.conf{,.bak}
vim /etc/puppet/puppet.conf
[main]
    logdir = /var/log/puppet
    rundir = /var/run/puppet
    ssldir = $vardir/ssl

[agent]
    classfile = $vardir/classes.txt
    localconfig = $vardir/localconfig
    server = puppetmaster.kisspuppet.com  #指向puppetmaster端
    certname = agent1_cert.kisspuppet.com #设置自己的certname名

启动puppet
systemctl start puppet

4、互相认证

[root@agent1 ~]# puppet agent --test #向master断发起认证

[root@master ~]# puppet cert --list --all #查看认证情况
[root@master ~]# puppet cert --sign agent1_cert.kisspuppet.com #注册agent1
[root@master ~]# puppet cert --list --all #再次查看认证情况


[root@master ~]# puppet agent --test #master自己申请agent认证
[root@master ~]# puppet cert --sign --all #注册所有请求的节点
[root@master ~]# puppet cert --list --all #查看所有节点认证

puppet语法

1、资源

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

file:文件管理 更详细资料

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

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

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

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

a、资源公共属性

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

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

b、file资源

owner 设置文件的属主

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

mode mode用于设置文件的权限

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

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

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

c、package资源

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

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

absent 表示反安装该软件;

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

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

d、service资源

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

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

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

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

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

stop 指定停止服务的脚本.

2、类和函数

a、类

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

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服务在运行状态。类的继承这里就不讲了,因为是 入门手册,另外用的不多。

b、函数

函数(在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'里面的代码,不会执行node host2.example.com里面的代码。正如前面所说,可以定义一个default

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

4、变量和数组

a、变量:

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代码里面直接使用。

b数组:

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目录是没有的,自己建立一个就行,然后在里面可以新增加你的模块。

常用命令

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

[root@localhost ~]# puppet help Usage: puppet <subcommand> [options] <action> [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 CA for certificate management. #提供访问CA证书的管理 certificate_request Manage certificate requests. #管理证书的请求 certificate_revocation_list Manage the list of revoked certificates. #管理撤销证书的列表 config Interact with Puppet's configuration options. #配置现象 facts Retrieve and store facts. #系统信息检查 file Retrieve and store files in a 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 searches for modules on the Puppet Forge. #从Puppet Forge创建、安装、查询模块 node View and manage node definitions. #管理节点 parser Interact directly with the parser. #解析器管理,检查pp文件语法 plugin Interact with the Puppet plugin system. #插件管理 report Create, display, and submit reports. #创建、查看报告 resource API only: interact directly with resources 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 files in a filebucket #在filebucket中检索和存储文件 inspect Send an inspection report #发送report报告 kick Remotely control puppet agent #远程控制agent,远程触发puppet agent命令 master The puppet master daemon #编译配置文件、模板、节点的自定义插件 queue Queuing daemon for asynchronous storeconfigs #队列进程 See 'puppet help <subcommand> <action>' for help on a specific subcommand action. See 'puppet help <subcommand>' for help 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` #队列进程

实例操作

启动

[root@localhost]# /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

案例:Hello 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,配置信息。

posted @ 2021-05-10 15:31  woaibaobei  阅读(651)  评论(0编辑  收藏  举报