当前位置: 首页 > 工具软件 > puppet-nginx > 使用案例 >

Puppet-server/agent

麻烨
2023-12-01

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来进行发布和回滚
发布

  • 1、创建一个新的资源目录,定义file资源将其推送过去
  • 2、用file创建一个符号链接指向新的版本
    回滚
  • 1、定义一个资源回滚,将旧的版本推送过去。
  • 2、用file创建一个符号链接指向旧的版本
    或者可以写在模块里,平时不使用,一但出现问题手动include模块,符号链接指向老的版本

改完以后就使用kick将文件推到agent上。

 类似资料: