Puppet管理工具

什么是Puppet?

是一个IT基础设施自动化管理工具,它能够帮助系统管理员管理基础设施的整个生命周期,该工具基于ruby语言开发,相比较于Ansble和SaltStack它的安全性会高一些,它通过加密认证进行通信,如果说ansible是通过模块使用,那么puppet就是通过资源定义使用

工作流程:
1.客户端puppet调用facter搜集变量,通过SSL发送给服务器
2.服务器端的puppetmaster通过facter工具分析检测客户端的信息,配置生成伪代码,返给客户端
3.客户端接受伪代码并执行,反馈给服务器结果
4.服务器将执行结果写入日志
puppet管理工具需要通过puppetmaster和puppetagent这两个程序来进行通信管理,管理端和客户端需要通过安装不同的软件来进行管理和应用

Puppet使用模型
puppet的使用模型分为单机使用模型master/agent模型

  • 单机使用模型:使用apply手动应用清单,单独执行本地*.pp文件的代码工具,通常用于本地测试调试puppet代码
  • master/agent模型:master/agent模型实现的是集中式管理,即 agent 端周期性向 master 端发起请求,请求自己需要的数据。然后在自己的机器上运行,并将结果返回给 master 端

TOC

一、安装配置Puppet

★准备工作★

环境信息:
master:192.168.31.101
agent:192.168.31.102、192.168.31.103
1.修改hosts文件把三台机器的地址解析添加进去
三台服务器都要配置

vim /etc/hosts
------------------------
192.168.31.101 master
192.168.31.102 agent1
192.168.31.103 agent2

2.配置ntp服务器,使三台服务器时间同步
master(192.168.31.101):

yum -y install ntp
systemctl start ntpd
ntpdate time1.aliyun.com

agent(192.168.31.102、192.168.31.103):

yum -y install ntpdate
ntpdate master

3.安装puppet镜像源

rpm -ivh https://mirrors.aliyun.com/puppet/yum/puppetlabs-release-el-7.noarch.rpm

开始安装

1.在master(192.168.31.101)上安装puppet-server启动服务

yum -y install puppet-server
systemctl start puppetmaster

2.在两台client上安装puppet

yum -y install puppet

3.在agent(192.168.31.102、192.168.31.103)上进行认证

puppet agent --server=master --no-daemonize --verbose

这个时候在master上执行puppet cert --list可以进行查看认证请求
4.在master(192.168.31.101)上同意请求

puppet cert sign --all

可以在master上执行ll /var/lib/puppet/ssl/ca/signed/查看生成的认证文件,路径注意看上个命令生成的路径
5.在agent(192.168.31.102、192.168.31.103)上修改配置文件

vim /etc/puppet/auth.conf
-----------------------------
allow * #表示同意所有地址访问

vim /etc/puppet/puppet.conf
-------------------------------
[main]
server = master #在[main]下添加master的名字
[agent]
listen = true  #这个添加在最后一行,监听8139端口

6.在agent(192.168.31.102、192.168.31.103)上启动puppetagent服务

systemctl start puppetagent

二、资源简介

资源格式

资源抽象
puppet 从以下三个维度来对资源完成抽象:

  • 相似的资源被抽象成同一种资源“类型” ,如程序包资源、用户资源及服务资源等
  • 将资源属性或状态的描述与其实现方式剥离开来,如仅说明安装一个程序包而不用关心其具体是通过yum、pkgadd、ports或是其它方式实现
  • 仅描述资源的目标状态,也即期望其实现的结果,而不是其具体过程,如“确定nginx 运行起来” 而不是具体描述为“运行nginx命令将其启动起来”

这三个也被称作puppet 的资源抽象层(RAL) ,RAL 由type( 类型) 和provider( 提供者,即不同OS 上的特定实现)组成
资源定义格式语法
资源定义通过向资源类型的属性赋值来实现,可称为资源类型实例化;
定义了资源实例的文件即清单,manifest;

type {'title':
	attribute1 	=> value1,
	atrribute2	=> value2,
	……
}

注意:type必须使用小写字符;title是一个字符串,在同一类型中必须惟一;每一个属性之间需要用“,”隔开,最后一个“,”可省略

class类

类是puppet中命名的代码模块,常用于定义一组通用目标的资源,可在puppet全局调用;类可以被继承,也可以包含子类;一个类里面可以有很多个type,会依次执行
例如:

vim nginx.pp
---------------------------------
class nginx {
    package{'nginx':
        ensure => installed,
        allow_virtual => false;
    }
    service{'nginx':
        ensure     => running,
        hasrestart => true,
        hasstatus  => true,
        enable     => true,
    }
}
include nginx

注意:类只有被调用才会执行,include后可以跟多个类,直接用","隔开即可

特殊资源属性

before:表示需要依赖于某个资源
require:表示应该先执行本资源,在执行别的资源
notify:A notify B:B依赖于A,且A发生改变后会通知B
subscribe:B subscribe A:B依赖于A,且B监控A资源的变化产生的事件
同时,依赖关系还可以使用->和~>来表示
->表示后资源需要依赖前资源
~>表示前资源变动通知后资源调用

常用资源总结

查看资源

puppet describe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta] [type]
	-l:列出所有资源类型;
	-s:显示指定类型的简要帮助信息;
	-m:显示指定类型的元参数,一般与-s一同使用;

1.group(用户组管理)

name:组名
gid:定义GID值
system:是否为系统组,true OR false
ensure:状态,present/absent
members:成员用户

group{'test':
    name => 'test',
    ensure => present,
    gid => 300,
}

2.user(用户管理)

name:用户名
uid: 定义UID值
gid:基本组ID
groups:附加组
comment:注释
expiry:过期时间
home:用户的家目录
shell:默认shell类型
system:是否为系统用户
ensure:状态,present/absent
password:加密后的密码

user{'test':
    ensure => present,
    system => false,
    comment => 'Test User',
    shell => '/bin/tcsh',
    home => '/home/test',
    managehome => true,
    groups => 'test',
    uid => 3000,
}

3.package(软件包管理)

ensure:installed/present/latest/absent
name:包名
source:程序包来源,仅对不会自动下载相关程序包的provider有用,例如rpm或dpkg
provider: 指明安装方式

package{'nginx':
   	ensure   => installed,
    procider => yum,
}

4.service(管理服务的状态)

ensure:服务状态,值有true(running)和false(stopped)
enable:是否开机自动启动,值有true和false
name:服务名称
path:服务脚本路径,默认为/etc/init.d/下
start:定制启动命令
stop:定制关闭命令
restart:定制重启命令
status:定制状态

service{'nginx':
    ensure     => running,
    hasrestart => true,
    hasstatus  => true,
    enable     => true,
}

5.file(文件管理)

ensure:目标状态,absent/present/file/directory/link
file:类型为普通文件,其内容由content属性生成或复制由source属性指向的文件路径来创建
link:类型为符号链接文件,必须由target属性指明其链接的目标文件
directory:类型为目录,可通过source指向的路径复制生成,recurse属性指明是否递归复制
path:文件路径
source:源文件
content:文件内容
target:符号链接的目标文件
owner:定义文件的属主
group:定义文件的属组
mode:定义文件的权限
atime/ctime/mtime:时间戳

file{'test.txt':
   	path    => '/data/test.txt',
    source  => '/etc/test.txt',
    owner   => 'test',
    mode    => '600',
}

6.exec(执行shell环境命令,通常为外部命令)

command:要运行的命令
cwd:指定运行该命令的目录
creates:文件路径,仅此路径表示的文件不存在时,command方才执行
user/group:运行命令的用户身份
path:指定命令执行的搜索路径
onlyif:此属性指定一个命令,此命令正常(退出码为0)运行时,当前command才会运行
unless:此属性指定一个命令,此命令非正常(退出码为非0)运行时,当前command才会运行
refresh:重新执行当前command的替代命令
refreshonly:仅接收到订阅的资源的通知时方才运行

exec{'cmd':
   	command => 'mkdir /data/testdir',
    path => ['/bin','/sbin','/usr/bin','/usr/sbin'],
}

7.cron(定义周期性任务)

command:要执行的任务
ensure:目标状态,present/absent
hour:时
minute:分
monthday:日
month:月
weekday:周
user:以哪个用户的身份运行命令(默认为root)
target:添加为哪个用户的任务
name:cron job的名称

cron{'timesync':
    command => '/usr/sbin/ntpdata 192.168.31.101',
    ensure  => present,
    minute  => '*/5',
    user    => 'root',
}

8.notify(调试输出)

message:记录的信息
name:信息名称
该选项一般用于master/agent模型中,来记录一些操作的时间,比如重新安装了一个程序呀,或者重启了应用等等。会直接输出到代理机的运行日志中

三、master/agent模型应用

远程安装

定义agent1安装apache,agent2安装nginx
1.创建模块目录

mkdir -pv /etc/puppet/modules/nginx/{manifests,files,templates}
mkdir -pv /etc/puppet/modules/apache/{manifests,files,templates}
chown -R puppet /etc/puppet/modules/

2.到/etc/puppet/manifests/目录下创建一个site.pp文件指定分配agent调用不同的模块

vim /etc/puppet/manifests/site.pp
-------------------------------------
node 'agent1'{
    include apache
}
node 'agent2'{
    include nginx
}

这里说明两个node分别后面就是两台agent服务器的名字,一个调用apache模块,一个调用nginx模块
这里的模块可以理解为在/etc/puppet/modules/下创建的文件目录,下面可以放很多目录去写不同的模块,使不同的管理服务器可以调用不同的模块去完成不同群体部署,方便管理一个群集中不同的服务器
补充:也可以把node信息写在别的.pp文件下,在site.pp文件中使用import插入即可(如下所示)

mkdir /etc/puppet/manifests/nodes
vim /etc/puppet/manifests/nodes/nodes.pp
-----------------------------------------
node 'agent1'{
    include apache
}
node 'agent2'{
    include nginx
}

在site.pp文件中使用import插入

vim /etc/puppet/manifests/site.pp
------------------------------------
import "nodes/nodes.pp"

3.分别编写两个init.pp文件去配置自动安装apache和nginx的步骤
apache模块:

vim /etc/puppet/modules/apache/manifests/init.pp
--------------------------------------------------
class apache {
    package{'httpd':
        ensure => installed,
        allow_virtual => false;
    }
    service{'httpd':
        ensure     => running,
        enable     => true,
    }
}

nginx模块

vim /etc/puppet/modules/apache/manifests/init.pp
--------------------------------------------------
class nginx {
    package{'nginx':
        ensure => installed,
        allow_virtual => false;
    }
    service{'nginx':
        ensure     => running,
        hasrestart => true,
        hasstatus  => true,
        enable     => true,
    }
}

执行的步骤都是从init.pp文件为最初执行的入口,当然你也可以创建几个.pp文件把这里的步骤分为几步,然后在init.pp文件中用clude方法把这几个方法加载进去依次执行
4.在需要安装的服务器上执行拉取命令
agent(192.168.31.102、192.168.31.103)

puppet agent -t

查看状态:
agent(192.168.31.102):

[root@agent1 ~]# puppet agent -t
Notice: Ignoring --listen on onetime run
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for agent1
Info: Applying configuration version '1658382097'
Notice: /Stage[main]/Apache/Service[httpd]/ensure: ensure changed 'stopped' to 'running'
Info: /Stage[main]/Apache/Service[httpd]: Unscheduling refresh on Service[httpd]
Notice: Finished catalog run in 0.29 seconds
[root@agent1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-07-21 01:41:04 EDT; 1s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 2738 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─2738 /usr/sbin/httpd -DFOREGROUND
           ├─2739 /usr/sbin/httpd -DFOREGROUND
           ├─2740 /usr/sbin/httpd -DFOREGROUND
           ├─2741 /usr/sbin/httpd -DFOREGROUND
           ├─2742 /usr/sbin/httpd -DFOREGROUND
           └─2743 /usr/sbin/httpd -DFOREGROUND

Jul 21 01:41:04 agent1 systemd[1]: Starting The Apache HTTP Server...
Jul 21 01:41:04 agent1 httpd[2738]: AH00558: httpd: Could not reliably determine the server’s fully qualif...ssage
Jul 21 01:41:04 agent1 systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.

agent(192.168.31.103):

[root@agent2 ~]# puppet agent -t
Notice: Ignoring --listen on onetime run
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for agent2
Info: Applying configuration version '1658376373'
Notice: /Stage[main]/Nginx/Package[nginx]/ensure: created
Notice: /Stage[main]/Nginx/Service[nginx]/ensure: ensure changed 'stopped' to 'running'
Info: /Stage[main]/Nginx/Service[nginx]: Unscheduling refresh on Service[nginx]
Notice: Finished catalog run in 7.57 seconds
[root@agent2 ~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-07-21 00:07:11 EDT; 5s ago
 Main PID: 1836 (nginx)
   CGroup: /system.slice/nginx.service
           ├─1836 nginx: master process /usr/sbin/nginx
           └─1839 nginx: worker process

Jul 21 00:07:11 agent2 systemd[1]: Starting The nginx HTTP and reverse proxy server...
Jul 21 00:07:11 agent2 nginx[1832]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Jul 21 00:07:11 agent2 nginx[1832]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Jul 21 00:07:11 agent2 systemd[1]: Started The nginx HTTP and reverse proxy server.

远程文件传输

1.配置fileserver.conf文件设置共享目录
master(192.168.31.101):

vim /etc/puppet/fileserver.conf
----------------------------------
[files]
path /data/puppet
allow *

#重启服务
systemctl restart puppetmaster
#创建要传输的测试文件
echo 11111111111111 > /data/puppet/test.txt

agent(192.168.31.102):

vim /etc/puppet/puppet.conf
-----------------------------------
server_datadir = /data/puppet

#重启服务
systemctl restart puppetagent

2.创建模块,编辑资源定义
source加载puppet://master/files路径为master设置的共享目录
master(192.168.31.101):

vim /etc/puppet/modules/test/manifests/init.pp
-----------------------------------------------
class test{
    file{'test.txt':
    path    => '/data/test.txt',
    source  => 'puppet://master/files/test.txt',
    recurse  => 'true',
    owner    => 'root',
    mode    => '777',
    }
}