Puppet的服务器端内部有一张主机资源清单,每一台主机有对应的代码资源。当一台主机通过http发起请求到master时,master按照清单找到对应的代码编译生成catalog后发送给agent,其中master需要监听在一个套接字上8140端口,agent会运行一个守护进程周期性(30分钟)的向master发起请求。
master与agent之间的通信是使用加密的http,这就意味着master还得是一个CA,给自己和所有得agent签发证书。
配置示例:
首先puppet推荐使用主机名来识别master与agent,以后得实际生产中推荐使用DNS这里我们使用hosts文件来配置。
192.168.31.200 node1.lvqing.com
192.168.31.201 node2.lvqing.com
192.168.31.203 node3.lvqing.com
node1作master,node2与node3作agent,做之前要同步时间
然后master需要作
安装程序包
facter, puppet, puppet-server
初始化master:
puppet master --no-daemonize --verbose
站点清单的定义
vim /etc/puppet/manifests/site.pp
node 'node2.lvqing.com'{
include chrony
}
模式匹配
node /PATTERN/ {
...puppet code...
}
node /node[0-9]+\.magedu\.com/
还可以定义节点的继承
节点定义的继承:
node NODE inherits PAR_NODE_DEF {
...puppet code...
}
agent向master发起请求
puppet agent --server node1.lvqing.com --no-daemonize -v --noop
Info: Caching catalog for node2.lvqing.com
Info: Applying configuration version '1546050755'
Notice: Finished catalog run in 11.54 seconds
前面只是我们让master运行在前台以便直观的观察到程序的运行状态,实际上master只需要直接执行systemctl start puppetmaster.service
即可,agent稍微修改下配置文件也直接启动就行了。难点在于模块的制作与各资源之间的定义使用。
接下来我们可以直接在agent的配置文件中添加一条指向master的配置即可让agent以守护进程的方式运行了。
vim /etc/puppet/puppet.conf
添加
server = node1.lvqing.com
启动
systemctl start puppetagent.service
接下来模拟puppet创建nginx+tomcat实例
模块创建目录
mkdir ./{jdk8,tomcat}/{manifests,files,templates,lib,spec,tests} -pv
vim jdk8/manifests/init.pp
class jdk8{
package{'jdk8}:
name => 'java-1.8.0-openjdk-devel'
ensure => latest,
}
file{'java.sh':
path => '/etc/profile.d/java.sh',
source => 'puppet:///modules/jdk8/java.sh',
}
}
vim files/java.sh
export JAVA_HOME=/usr
tomcat的模板
vim modules/tomcat/manifests/init.pp
class tomcat{
package{"['tomcat','tomcat-admin-webapps']":
ensure => latest
} ->
file{'server.xml':
path => '/etc/tomcat/server.xml',
source => 'puppet:///modules/tomcat/server.xml',
} ~>
service{'tomcat':
ensure => running,
enable => true
}
}
cp /etc/tomcat/server.xml ./files
cp modules/* /etc/puppet/modules/ -a
模块都已经准备好了,接下来我们定义主机清单,给第二个节点安装tomcat
vim /etc/puppet/manifests/site.pp
添加
node 'node3.lvqing.com'{
include jdk8
include tomcat
}
node3修改配置文件或直接运行命令前台拉取数据puppet agent --server node1.lvqing.com --no-daemonize -v --debug
可以看到结果:
/Stage[main]/Tomcat/Package[tomcat]/ensure: created
/Stage[main]/Tomcat/Service[tomcat]/ensure: ensure changed 'stopped' to 'running'
Finished catalog run in 12.79 seconds
/Stage[main]/Tomcat/Service[tomcat]/ensure: ensure changed 'stopped' to 'running'
如果puppet管理的主机非常多,我们也可以对清单的配置信息进行模块化组织,不同的角色放置在不同的目录中,再在主manifests的site.pp中导入配置
databases.d/
tomcatservers.d/
nodes.d/
可通过多个pp文件分别定义各类站点的清单;而后统一导入site.pp,方法如下:
import 'DIRECTORY_NAME/*.pp
一般的公司都拥有三种环境,开发环境,生成环境和测试环境,puppet只能针对单一的一种环境设置,默认是指Production环境
puppet3.6之后的版本配置多环境的方法
master端:
(1) 配置文件puppet.conf
[master]
environmentpath = $confdir/environments
(2) 在多环境配置目录下为每个环境准备一个子目录
ENVIRONMENT_NAME/
manifests/
site.pp
modules/
agent端:
[agent]
environment = { production|development | testing }
多环境配置实例:
同一个包三种不同环境下不同的配置
每个环境下必须要有modules和manifests,这样默认目录下的modules就没有用了
mkdir environments/{production,development,testing}/{manifests,modules}
cp modules/chrony/ environments/testing/modules/ -a
cp modules/chrony/ environments/development/modules/ -a
cp modules/chrony/ environments/production/modules/ -a
vim /etc/puppet/puppet.conf #添加
[main]
environmentpath = $confdir/environments
#这里的$confdir是指/etc/puppet
对服务的配置进行区分修改
(development)node2修改chrony配置文件添加
server node2.lvqing.com iburst
(testing)node3修改chrony配置文件添加
server node3.lvqing.com iburst
接下来创建各环境下的site.pp
vim /etc/puppet/environments/development/manifests/site.pp
node 'node2.lvqing.com' {
include chrony
}
vim /etc/puppet/environments/testing/manifests/site.pp
node 'node2.lvqing.com' {
include chrony
}
这里包括的类都一样但因为node2所处的环境不同,chrony指向的服务器也不同
现在我们有两种环境,development和testing相同的服务不同的配置,agent根据自己的需求到对应的环境中拉取数据
agent端配置
vim /etc/puppet/puppet.conf
environment = development
注意不加s是让自己处于某种环境中而不是对变量进行赋值。
额外配置文件:
文件系统:fileserver.conf
认证(URL):auth.conf
对agent请求的资源作认证
当master上定义agent的配置更改了,如何通知给agent呢,agent默认30分钟访问master一次。
agent配置文件中需要添加listen = true
因为是master主动联系agent所以还要在agent的auth.conf文件中添加
path /run
method save
auth any
allow node1.lvqing.com
配置好后需要master使用命令主动通知agent过来拉取配置
puppet kick node2.lvqing.com
结果
Triggering node2.lvqing.com
Getting status
status is success
node2.lvqing.com finished with exit code 0
Finished
利用puppet来进行发布和回滚
发布
改完以后就使用kick将文件推到agent上。