资源配置
操作系统 | 配置 | 主机名/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/