Puppet自动化部署项目实战
资源配置操作系统配置主机名/IPCentOS 7.92C2Gmaster.puppet.com/172.16.10.10CentOS 7.92C2Gsvn.puppet.com/172.16.10.11CentOS 7.92C2Grelease.puppet.com/172.16.10.12CentOS 7.92C2Gweb-test.puppet.com/172.16.10.13CentOS
资源配置
| 操作系统 | 配置 | 主机名/IP |
|---|---|---|
| CentOS 7.9 | 2C2G | master.puppet.com/172.16.10.10 |
| CentOS 7.9 | 2C2G | svn.puppet.com/172.16.10.11 |
| CentOS 7.9 | 2C2G | release.puppet.com/172.16.10.12 |
| CentOS 7.9 | 2C2G | web-test.puppet.com/172.16.10.13 |
| CentOS 7.9 | 2C2G | web.puppet.com/172.16.10.14 |
一、基础环境
-
关闭防火墙
systemctl stop firewalld systemctl disable firewalld
-
关闭内核安全机制
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
-
时间同步,由于 Puppet 使用的 SSL 证书依赖时间同步
yum -y install chrony systemctl start chronyd systemctl enable chronyd chronyc sources -v
-
修改主机名
hostnamectl set-hostname master.puppet.com hostnamectl set-hostname web.puppet.com hostnamectl set-hostname web-test.puppet.com hostnamectl set-hostname release.puppet.com hostnamectl set-hostname svn.puppet.com
-
添加hosts
cat >> /etc/hosts << EOF 192.168.207.131 master.puppet.com 192.168.207.165 web.puppet.com 192.168.207.166 web-test.puppet.com 192.168.207.167 release.puppet.com 192.168.207.168 svn.puppet.com EOF
二、安装 Puppet
-
在 Puppet Master、发布服务器、Web 正式节点和 Web 测试节点都需要安装 Puppet 源。Puppet Master 需要安装 puppet-server 包,而发布服务器、Web 正式节 点和 Web 测试节点都被看作是 Puppet 的被管理节点,即通常所说的 Agent 端。
rpm -ivh puppetlabs-release-7-12.noarch.rpm # 安装并启动 Puppet 服务端 yum install -y puppet-server systemctl start puppetmaster systemctl enable puppetmaster # 客户端安装 yum install -y puppet
-
修改配置
# 修改puppet客户端 # 在 /etc/puppet/puppet.conf 文 件 中 的 [main] 标 题 下 添 加 “server = master.puppet.com”配置字段用于设置 Puppet Master 的域名,文件最后一行添加listen = true vi /etc/puppet/puppet.conf server = master.puppet.com listen = true //使 Puppet 监听 8139 端口 # 修改验证配置文件 auth.conf 定义一些验证信息及访问权限,最后一行添加 如下 vi /etc/puppet/auth.conf allow * # 启动 Puppet Agent 客户端 systemctl start puppetagent ############################################################################################# # 修改puppet服务端 # 在 /etc/puppet/puppet.conf 文件最后一行添加listen = true listen = true # 修改验证配置文件 auth.conf 定义一些验证信息及访问权限,最后一行添加 如下 vi /etc/puppet/auth.conf allow * systemctl restart puppetmaster
-
注册
# 在所有puppet客户端执行 puppet agent --server=master.puppet.com --no-daemonize --verbose # 完成注册 # 在 Master 上,将所有申请未注册的客户端进行注册 puppet cert sign --all # 注册成功后,可以通过目录去查看已经注册的客户端 ll /var/lib/puppet/ssl/ca/signed/ [root@master modules]# ll /var/lib/puppet/ssl/ca/signed/ 总用量 16 -rw-r--r-- 1 puppet puppet 2037 5月 13 16:48 master.puppet.com.pem -rw-r--r-- 1 puppet puppet 1960 5月 13 17:13 release.puppet.com.pem -rw-r--r-- 1 puppet puppet 1956 5月 13 16:49 web.puppet.com.pem -rw-r--r-- 1 puppet puppet 1960 5月 13 16:49 web-test.puppet.com.pem
三、安装配置 SVN 服务器
-
说明
Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。 简单的来说就是专门存放代码的,开发人员把写好的代码上传到svn里面,运维人员部署服务的时候从svn里面获取到代码,然后部署
-
在 svn.puppet.com 服务器上,安装并配置 SVN 服务
# 在 svn.puppet.com 服务器上安装 SVN 服务 yum install -y subversion # 创建目录 mkdir -p /var/svn/html # 创建版本库 svnadmin create /var/svn/html/ # 查看生成文件 ls /var/svn/html/
-
修改 svn 配置文件
vi /var/svn/html/conf/svnserve.conf # 匿名用户可读 anon-access = read # 授权用户可写 auth-access = write # 指定账号文件 password-db = /var/svn/html/conf/passwd # 指定权限文件 authz-db = /var/svn/html/conf/authz ###################################################### # 设置账号密码 vi /var/svn/html/conf/passwd [users] alpha = alphapasswd sysadmin = sysadminpasswd ####################################################### vi /var/svn/html/conf/authz //设置权限 [/] sysadmin = r alpha = rw [web] sysadmin = r alpha = rw ########################################################### # 启动版本库 svnserve -d -r /var/svn/html
-
创建测试目录并测试
cd /var/svn/html/ mkdir web svn import web file:///var/svn/html/web -m "init svn" # 提交后的版本为 1。
四、使用 Puppet 部署发布服务器
4.1、下载 concat 和 rsync 模块
-
在发布服务器和 Puppet Master 上需要下载安装 concat 和 rsync 模块。如果发布 服务器上没有 concat 和 rsync 模块,那么之后发布服务器上生成的 rsyncd.conf 文件 的 内 容 就 会 是 空 的 。 Puppet 对 应 concat 模 块 的 下 载 位 置 在 GitHub 位 置 https://github.com/onyxpoint/pupmod-concat,对应 rsync 模块的下载位置在 GitHub 位置 https://github.com/onyxpoint/pupmod-rsync。这里是使用 git。如果服务器没有安装,可以先使用 yum -y install git 安装。如果 不想安装 git,也可以下载 zip 压缩包,解压到相应目录
-
在发布服务器、Puppet Master 上执行如下命令
yum install -y git cd /etc/puppet/modules/ git clone https://github.com/onyxpoint/pupmod-concat && mv pupmod-concat concat git clone https://github.com/onyxpoint/pupmod-rsync && mv pupmod-rsync rsync
-
配置 Puppet Master,Puppet Master 开始创建管理 Agent 节点目录及文件,方便以后管理
mkdir -p /etc/puppet/manifests/nodes
vi /etc/puppet/manifests/nodes/release.puppet.com.pp
class rsync::client inherits rsync {
}
node 'release.puppet.com' {
include 'rsync::server'
rsync::server::global { 'global':
address => '192.168.207.168'
}
rsync::server::section { 'web':
comment => 'This is formal file path',
path => '/var/www/html/web',
hosts_allow => '192.168.207.165'
}
rsync::server::section { 'web_test':
comment => 'This is test file path',
path => '/var/www/html/web_test',
hosts_allow => '192.168.207.166'
}
}
###########################################################################
# 创建 site.pp 配置文件
# 在 site.pp 配置文件中定义 Puppet 相关的变量和默认配置,site.pp 是 Puppet 最先读取的文件
vi /etc/puppet/manifests/site.pp
import "nodes/release.puppet.com.pp"
############################################################################
# 自动配置发布服务器,release节点操作
puppet agent --server=master.puppet.com --test -v
# 查看发布服务器的/etc 目录,发现已经自动生成 rsyncd.conf 文件,但是 rsync 服务是未启动的。自动生成的/etc/rsyncd.conf 文件内容如下
[root@release ~]# cat /etc/rsyncd.conf
pid file = /var/run/rsyncd.pid
syslog facility = daemon
port = 873
address = 192.168.207.168
[web]
comment = This is formal file path
path = /var/www/html/web
use chroot = false
max connections = 0
max verbosity = 1
lock file = /var/run/rsyncd.lock
read only = true
write only = false
list = false
uid = root
gid = root
outgoing chmod = o-w
ignore nonreadable = true
transfer logging = true
log format = "%o %h [%a] %m (%u) %f %l"
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz *.rar *.jar *.pdf *.sar *.war
hosts allow = 192.168.207.165
hosts deny = *
[web_test]
comment = This is test file path
path = /var/www/html/web_test
use chroot = false
max connections = 0
max verbosity = 1
lock file = /var/run/rsyncd.lock
read only = true
write only = false
list = false
uid = root
gid = root
outgoing chmod = o-w
ignore nonreadable = true
transfer logging = true
log format = "%o %h [%a] %m (%u) %f %l"
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz *.rar *.jar *.pdf *.sar *.war
hosts allow = 192.168.207.166
hosts deny = *
-
启动 rsync 服务
# 在发布服务器上手动启动 rsync 服务 rsync --daemon --address=192.168.207.167
-
如果希望下次发布服务器能自动启动 rsync 服务,那么需要修改 Puppet Master 的 rsync 模块文件,将/etc/puppet/modules/rsync/manifests/server.pp 文件中的如下 行注释掉
vi /etc/puppet/modules/rsync/manifests/server.pp
stop => "/bin/kill `cat \\`grep \"pid file\" /etc/rsyncd.conf | cut -f4 -d' '\\``",
# 新增如下所示
stop => "/bin/kill `ps -ef | grep rsync | grep -v grep | awk '{print $2}'`",
五、版本发布
-
在上面搭建 SVN 服务器的时候只设置了一个版本库,但是目录里面实际是空的, 为了模拟真实性,上传一个本地文件到 svn 版本库,然后通过发布脚本将这个文件发 布到测试站点
-
从 SVN 服务器检出项目,检出的时候需要输入 SVN 服务器密码,然后输入 svn 用户和密码
svn co svn://svn.puppet.com/web cd web # 从本地拷贝一个文件到 SVN 版本库 cp /root/anaconda-ks.cfg . # 添加文件到 SVN 版本库,删除文件是使用 delete 参数。 svn add anaconda-ks.cfg # 提交到版本库,ci 是 commit 的简写 svn ci -m "add file"
-
编写 SVN 发布测试站点脚本,release节点操作
vi webtest.sh
########################################################################################
#!/bin/bash
#定义路径
path=$(cd $(dirname "$0");pwd);
svnRoot="svn://svn.puppet.com/web";
svndir="/var/svn/html/web_test";
webdir="/var/www/html/web_test";
choose="no yes"
echo "请确认要发布的是 web 项目测试环境";
select comfirm in $choose
do
if [ "${comfirm}" != "yes" ];then
echo "发布程序结束"
exit 0;
fi
break;
done;
echo "请确认 SVN 地址(默认 no):${svnRoot}";
select comfirm in $choose
do
if [ "${comfirm}" != "yes" ];then
echo "发布程序结束"
exit 0;
fi
break;
done;
#开始检出程序代码
svn co ${svnRoot} ${svndir};
rsync -acvz --exclude=".svn/" --delete --delete-after ${svndir}/ ${webdir}
##########################################################################################
# 执行脚本之前需要在发布服务器上创建需要的目录
mkdir -p /var/svn/html/web_test
mkdir -p /var/www/html/web_test
-
配置 Web 测试站点客户端,master节点操作
# 在 Puppet Master 上定义客户端模板文件。因为下载的 rsync 模块不带--delete 参数,但是在实际环境中完全同步代码的时候需要用到这个参数
mkdir /etc/puppet/modules/rsync/manifests/client
vi /etc/puppet/modules/rsync/manifests/client/host.pp
###############################################################
define rsync::client::host ($title,$rsyserver,$source,$target){
exec{"$title":
path => "/usr/bin:",
command => "rsync -acvz --delete $rsyserver::$source $target"
}
}
################################################################
title:定义的一个主题,可以任意定义
rsyserver:是 rsync server 的 IP。
source:是 rsync server 上定义的目录。
target:是网站测试节点上放置的目录
###########################################
# 创建测试站点文件
vi /etc/puppet/manifests/nodes/web-test.puppet.com.pp
node 'web-test.puppet.com' {
include 'rsync::client'
rsync::client::host {"web 项目测试环境":
title => 'web 项目测试环境',
source =>'web_test',
rsyserver => 'release.puppet.com',
target =>'/var/www/html/web_test'
}
}
########
# 上述内容很少,因为完全就是调用 rsync 命令复制文件。当然,里面也可以增加 同 步 完 后 的 一 些 预 设 动 作 , 比 如 exec 执 行 外 部 脚 本 之 类 的 。 最 后 , 需 要 将 web-test.puppet.com 文件也导入到 site.pp 文件里面
echo "import 'nodes/web-test.puppet.com.pp' ">> /etc/puppet/manifests/site.pp
-
手动测试
# 手动运行上面创建的发布脚本 webtest.sh sh webtest.sh [root@release ~]# ll /var/svn/html/web_test/ 总用量 4 -rw-r--r-- 1 root root 0 5月 13 17:40 aaa -rw-r--r-- 1 root root 1261 5月 13 17:40 anaconda-ks.cfg
-
在 Web 项目测试站点上创建同步目录,然后执行如下命令确认发布服务器上的 更新文件是否被同步到 Web 项目测试站点
mkdir -p /var/www/html/web_test puppet agent --server master.puppet.com --test --debug # 在 Web 测试节点查看文件是否被同步 ll /var/www/html/web_test/ # 再测试一下上面添加的 host.pp 是否可用,首先从 svn 删除 anaconda-ks.cfg, 然后重新上传一个文件进行测试 # release节点操作 cd web svn delete anaconda-ks.cfg svn ci -m "delete file" cp /root/webtest.sh . svn add webtest.sh svn ci -m "add new file" sh webtest.sh
-
Web 测试节点手动同步
puppet agent --server master.puppet.com --test # 在 Web 测试节点查看,发现文件旧文件已经删除,新文件已经同步 ll /var/www/html/web_test/
-
设置正式节点自动部署
# 上述都是手动执行拉取动作,而本案例的目的是自动部署,所以需要配置正式节 点的 Agent 自动更新应用
# 在正式环境上的 Agent 客户端的/etc/puppet/puppet.conf 配置文件中的[agent]字 段中增加如下内容
# web节点操作
vi /etc/puppet/puppet.conf
runinterval = 300s //表示 5 分钟自动更新
##############################################
systemctl restart puppetagent
# 编写正式发布脚本,其实原理就是把发布机上的/var/www/html/web_test 目录 下的文件拷贝到/var/www/html/web 目录下
# release节点操作
vi web.sh
#######################################
#!/bin/bash
#设置根目录
SOURCE_ROOT='/var/www/html';
SHELL_ROOT=$(cd $(dirname "$0"); pwd);
#设置源码目录
SOURCE_WEB="${SOURCE_ROOT}/web";
SOURCE_WEB_TEST="${SOURCE_ROOT}/web_test";
choose="no yes"
echo "请确认要发布的是 web 项目正式环境?(该脚本只能由运维人员执行)";
select comfirm in $choose
do
if [ "${comfirm}" != "yes" ];then
echo "发布程序结束"
exit 0;
fi
break;
done;
echo "请确认是否同步正式环境?请务必确认目录正确性!";
select COMFIRM in '否' '是'
do
if [ "${COMFIRM}" == "是" ]; then
echo '同步源码目录';
rsync -avr --delete-after ${SOURCE_WEB_TEST}/ ${SOURCE_WEB};
fi
break;
done;
echo 'web 项目正式环境发布完成,请通知相关开发和测试人员五分钟后进行测试!'
############################################################################
# 手动运行发布正式节点脚本
sh web.sh
# 查看发布机的正式目录文件是否同步
ll /var/www/html/web/
# 创建正式节点文件,master节点操作
vi /etc/puppet/manifests/nodes/web.puppet.com.pp
node 'web.puppet.com' {
include 'rsync::client'
rsync::client::host {"web 项目正式环境":
title => 'web 项目正式环境',
source =>'web',
rsyserver => 'release.puppet.com',
target =>'/var/www/html/web'
}
}
########
# 同样还需要将 web.puppet.com.pp 文件 import 到 site.pp 文件里面
echo "import 'nodes/web.puppet.com.pp'">>/etc/puppet/manifests/site.pp
# 重启 Puppet Master 服务
systemctl restart puppetmaster
# 在正式节点创建同步目录,web节点操作
mkdir -p /var/www/html/web
# 接下来,就是耐心得等待 5 分钟后进行查看文件已经同步
ll /var/www/html/web/
更多推荐




所有评论(0)