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 端
一、安装配置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',
}
}