Puppet擴展篇7-puppet代碼與版本控制系統的結合

1、介紹

經過安裝部署Puppet C/S模型,實現Puppet Server端管理全部被控制機的整個生命週期:從初始化到軟件升級、從配置文件建立到測試部署、從系統維護到服務器遷移等。Puppet可以持續化的與 被控制機進行交互,從而實現配置文件的及時檢測更新。結合SVN版本控制系統,puppet可在更新以前將當前正在運行的環境以版本的方式保存到SVN版 本控制系統中,方便之後經過puppet更新出錯或者須要回滾到以前的某一個環境時快速恢復。html

2、環境介紹

序號    服務器類型                     版本/IP參數
 1    PuppetMaster         RHEL6.4 x86_64(192.168.100.110)
 2    PuppetAgent             RHEL5.8 x86_64(192.168.100.111)和RHEL5.7 x86_64(192.168.100.112)
 3    SVN Service端     RHEL6.4 x86_64(192.168.100.110)
 4    SVN Service端     RHEL6.4 x86_64(192.168.100.110)和Windows 8.1 x86_64(192.168.100.2)

編號      類型       主機名/軟件名稱    系統/軟件版本                    其餘信息
 1    Software    Subversion        1.6.11-7    rpm                 package
 2    Software    TortoiseSVN        1.8.2.24708-x64-svn-1.8.3        msi

3、部署流程

1 SVN Server端部署

1.1 安裝相關軟件包linux

[root@puppetserver ~]# yum install subversion
[root@puppetserver ~]# svnserve –version  #經過查看版本驗證安裝是否成功
svnserve, version 1.6.11 (r934486)
   compiled Apr 12 2012, 11:09:11
Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).
The following repository back-end (FS) modules are available:
* fs_base : Module for working with a Berkeley DB repository.
* fs_fs : Module for working with a plain file (FSFS) repository.
Cyrus SASL authentication is available.

1.2 建立第一個版本庫數據庫

[root@puppetserver ~]# mkdir /svndata
[root@puppetserver ~]# svnadmin create /svndata/puppet
[root@puppetserver ~]# ll /svndata/puppet/
total 24
drwxr-xr-x 2 root root 4096 Oct 22 13:29 conf
drwxr-sr-x 6 root root 4096 Oct 22 13:29 db
-r--r--r-- 1 root root    2 Oct 22 13:29 format
drwxr-xr-x 2 root root 4096 Oct 22 13:29 hooks
drwxr-xr-x 2 root root 4096 Oct 22 13:29 locks
-rw-r--r-- 1 root root  229 Oct 22 13:29 README.txt

2 經過Apache+ssl安全認證訪問SVN服務器

2.1    安裝相關軟件包apache

[root@puppetserver ~]# yum install httpd httpd-devel mod_dav_svn

2.2    建立SVN虛擬主機vim

[root@puppetserver svndata]# vim /etc/httpd/conf.d/subversion.conf
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
Listen 8142
<VirtualHost *:8142>
<Location /svndata>
DAV svn
SVNListParentPath on
SVNPath "/svndata/puppet"
AuthType Basic
AuthName "Subversion repository"
AuthUserFile "/svndata/puppet/conf/authfile"
#AuthzSVNAccessFile /svndata/puppet/conf/svn-acl-conf
Require valid-user
SVNAutoversioning on
ModMimeUsePathInfo on
</Location>
</VirtualHost>

2.3    建立svn權限配置文件瀏覽器

[root@puppetserver svndata]# vim puppet/conf/authz  
[groups]
admin = puppet
[admin:/]
@admin = rw
[/]
* = r
[$name:/]
test = rw">>/svndata/puppet/conf/authz

2.4    建立用戶名及密碼並設置相應權限
[root@puppetserver ~]# /usr/bin/htpasswd -c /svndata/puppet/conf/authfile puppet #建立SVN服務器帳戶puppet密碼爲redhat
New password: redhat
Re-type new password: redhat
Adding password for user puppet
[root@puppetserver ~]# chown apache /svndata/puppet -R
[root@puppetserver ~]# echo "puppet = redhat" >>/svndata/puppet/conf/passwd

2.5    配置SVN服務信息安全

[root@puppetserver svndata]# vim /svndata/puppet/conf/svnserve.conf 
[general] 
anon-access = none
auth-access = write
password-db = /svndata/puppet/conf/passwd
authz-db = /svndata/puppet/conf/authz
realm = puppet Repository

2.6    經過瀏覽器測試訪問服務器

[root@puppetserver svndata]# /etc/rc.d/init.d/httpd restart #重啓httpd服務
http://192.168.100.110:8142/svndata/

svn版本控制測試界面svn版本控制測試界面微信

svn版本控制測試界面svn版本控制測試界面app

2.7    經過其餘linux節點訪問測試

[root@agent1 ~]# svn checkout http://192.168.100.110:8142/svndata/  /mnt/
Authentication realm: <http://192.168.100.110:8142> Puppet Subversion repository
Password for 'root': 
Authentication realm: <http://192.168.100.110:8142> Puppet Subversion repository
Username: puppet 
Password for 'puppet':
-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:
   <http://192.168.100.110:8142> Puppet Subversion repository
can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.
You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? no
Checked out revision 0.

2.8    經過Windows客戶端TortoiseSVN訪問測試

svn版本控制測試界面svn版本控制測試界面

svn版本控制測試界面svn版本控制測試界面

svn版本控制測試界面svn版本控制測試界面

備註:因爲還爲import版本,因此查看的內容爲空

3 整合puppet server端

3.1    將puppet server模塊目錄導入到版本庫中

[root@puppetserver ~]# svn import /etc/puppet/environments/testing
http://192.168.100.110:8142/svndata/puppet -m "Puppet Initial repository" 
Authentication realm: <http://192.168.100.110:8142> Puppet Subversion repository
Password for 'root': 
Authentication realm: <http://192.168.100.110:8142> Puppet Subversion repository
Username: puppet
Password for 'puppet': 
Adding         /etc/puppet/environments/testing/groups
Adding         /etc/puppet/environments/testing/groups/modules
Adding         /etc/puppet/environments/testing/groups/modules/grub
Adding         /etc/puppet/environments/testing/groups/modules/grub/files
Adding         /etc/puppet/environments/testing/groups/modules/grub/manifests
…
Committed revision 1.

備註:因爲SVN服務器端和puppetserver在同一臺服務器上,也能夠經過如下方式進行導入

[root@puppetserver ~]# svn import /etc/puppet/environments/testing  
file:///svndata/puppet -m "Puppet Initial repository"

3.2    經過IE瀏覽器訪問SVN服務器

svn版本控制測試界面svn版本控制測試界面

3.3    經過Windows客戶端TortoiseSVN checkout最新的版本庫到本地

svn版本控制測試界面svn版本控制測試界面

svn版本控制測試界面svn版本控制測試界面

svn版本控制測試界面svn版本控制測試界面

3.4    刪除puppetserver端testing目錄,並將版本庫中的數據導出

[root@puppetserver ~]# cd /etc/puppet/environments/testing/
[root@puppetserver testing]# rm -rf *  #刪除以前建議備份
[root@puppetserver testing]# svn checkout
http://192.168.100.110:8142/svndata/puppet  /etc/puppet/environments/testing 
Authentication realm: <http://192.168.100.110:8142> Puppet Subversion repository
Password for 'puppet':
Please type 'yes' or 'no': no
A    groups
A    groups/modules
A    groups/modules/grub
A    groups/modules/grub/files
A    groups/modules/grub/manifests
Checked out revision 1.
[root@puppetserver testing]# ls -a
.  ..  agents  environment  groups  manifests  .svn
[root@puppetserver testing]# ls .svn/  #每一個目錄下面都會生成.svn隱藏目錄,用於保存當前版本的信息
all-wcprops  entries  prop-base  props  text-base  tmp
備註:checkout以後,在/etc/puppet/environments/testing目錄下就會有一份SVN服務器上最新版本的副本。

4 部署SVN hooks

4.1    設置pre-commit

設置pre-commit鉤子能夠提交文件到SNV服務器以前對puppet語法進行檢查,語法經過則提交成功,語法錯誤則提交失敗。

[root@puppetserver hooks]# chmod 774 pre-commit^C
[root@puppetserver hooks]# cp pre-commit.tmpl pre-commit
[root@puppetserver hooks]# chmod 774 pre-commit 
[root@puppetserver hooks]# vim pre-commit 
#!/bin/sh
# SVN pre-commit hook to check Puppet syntax for .pp files
# Modified from http://mail.madstop.com/pipermail/puppet-users/2007-March/002034.html
# Access http://projects.puppetlabs.com/projects/1/wiki/puppet_version_control
REPOS="$1"
TXN="$2"
tmpfile=`mktemp`
export HOME=/
SVNLOOK=/usr/bin/svnlook
$SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[^D].*\.pp$/ {print $2}' | while read line
do
    $SVNLOOK cat -t "$TXN" "$REPOS" "$line" > $tmpfile
    if [ $? -ne 0 ]
    then
        echo "Warning: Failed to checkout $line" >&2
    fi
#    puppet --color=false --confdir=/etc/puppet --vardir=/var/lib/puppet --parseonly --ignoreimport $tmpfile >>/var/log/puppet/svn_pre-commit.log 2>&1
    puppet --color=false --confdir=/etc/puppet --vardir=/var/lib/puppet --parser --ignoreimport $tmpfile >>/var/log/puppet/svn_pre-commit.log 2>&1
    if [ $? -ne 0 ]
    then
        echo "Puppet syntax error in $line." >>/var/log/puppet/svn_pre-commit.log 2>&1
        exit 2
    fi
done
res=$?
rm -f $tmpfile
if [ $res -ne 0 ]
then
    exit $res
fi

4.2    設置post-commit

設置post-commit鉤子能夠在正確提交文件至SVN服務器以後,puppetmaster的模塊目錄/etc/puppet/environments/testing會自動從SNV服務器上update最新的版本庫到本地。

#!/bin/sh
# POST-COMMIT HOOK
REPOS="$1"
REV="$2"
#mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
export LANG=en_US.UTF-8
SVN=/usr/bin/svn
PUPPET_DIR=/etc/puppet
#/usr/bin/svn  up /etc/puppet -non-interactive
$SVN  update $PUPPET_DIR --username puppet --password 123.com >>/var/log/puppet/svn_post-commit.log

5 SVN Client端部署測試

5.1    本地測試

1)導出版本數據庫文件到本地

[root@puppetserver ~]# svn checkout file:///svndata/puppet  /puppet/puppet

2)、建立並添加新的目錄及文件

[root@puppetserver puppet]# svn add ssh

3)、將修改後的文件提交到SVN服務器,此時版本庫版本加1

[root@puppetserver .svn]# svn commit -m "add ssh modules" /puppet/puppet/*

5.2    遠程測試(Linux)

[root@agent1 svndata]#  svn checkout http://172.16.200.100/svndata/  /mnt/

5.3    客戶端TortoiseSVN測試(Windows)

svn版本控制測試界面svn版本控制測試界面

svn版本控制測試界面svn版本控制測試界面

返回主目錄

交流方式:

微信公衆號:puppet2014,可微信搜索加入,也能夠掃描如下二維碼進行加入

微信公衆號微信公衆號

QQ交流羣:296934942

相關文章
相關標籤/搜索