Puppet自动化部署项目实战

资源配置

操作系统配置主机名/IP
CentOS 7.92C2Gmaster.puppet.com/172.16.10.10
CentOS 7.92C2Gsvn.puppet.com/172.16.10.11
CentOS 7.92C2Grelease.puppet.com/172.16.10.12
CentOS 7.92C2Gweb-test.puppet.com/172.16.10.13
CentOS 7.92C2Gweb.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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值