搭建GIT伺服器(CentOS)

來源:互聯網
上載者:User
文章目錄
  • (1) 由於 Gitosis 是基於 Python 開發的,先安裝依賴的 Python-Setuptools RPM
  • (2) 從 Gitosis 官方複製代碼
  • (2) 準備系統管理使用者公開金鑰
  • (3) 初始化 Gitosis
  • (4) 添加使用者公開金鑰
  • (5) 許可權控制
  • (6) 其他

@http://www.inanu.net/post/742.html

這幾天研究 Puppet,剛好需要搭建一個 Git Repository。把過程及遇到的問題簡答記錄一下。

環境:CentOS 6.2 x86_64

1. 安裝 RPM
[root@c1.inanu.net]# yum install httpd[root@c1.inanu.net]# yum install git git-daemon

此處安裝 httpd 和 gitweb 是為了能夠通過 web 對 git 進行方便的瀏覽、管理。正好 apache 也可以用來替換掉 puppet 內建的 WEBrick,一舉兩得了。

2. 配置 Git

在 CentOS 中,Git 是以 xinetd 方式提供服務的,預設的 xinetd 設定檔在:/etc/xinetd.d/git。
編輯設定檔,以下是改好的一份 git xinetd 設定檔:

12345678910111213
# default: off# description: The git dæmon allows git repositories to be exported using \#       the git:// protocol.service git{    disable = no        socket_type     = stream        wait            = no        user            = nobody        server          = /usr/libexec/git-core/git-daemon        server_args     = --base-path=/var/lib/git --export-all --user-path=public_git --syslog --inetd --verbose        log_on_failure  += USERID}

接下來啟動 xinetd 服務:

[root@c1.inanu.net]# service xinetd start
3. 建立 Puppet 伺服器端 Git 倉庫
[root@c1.inanu.net]# useradd -d /var/lib/git -s /usr/bin/git-shell git #建立 git 使用者[root@c1.inanu.net]# passwd git #設定 git 使用者密碼[root@c1.inanu.net]# chown -R git:git /var/lib/git[root@c1.inanu.net]# su git #切換到 git 使用者[git@c1.inanu.net]$ cd ~[git@c1.inanu.net]$ mkdir .ssh[git@c1.inanu.net]$ chmod 700 .ssh[git@c1.inanu.net]$ touch .ssh/authorized_keys[git@c1.inanu.net]$ chmod 600 .ssh/authorized_keys[git@c1.inanu.net]$ mkdir /var/lib/git/puppet.git #建立 Puppet 伺服器端 Git 倉庫[git@c1.inanu.net]$ cd /var/lib/git/puppet.git[git@c1.inanu.net]$ git --bare init #初始化 Puppet 伺服器端 Git 倉庫
4. 在用戶端建立 Git 本地倉庫
[root@c2.inanu.net]# ssh-keygen -t rsa #產生使用者使用的 SSH-Key 金鑰組[root@c2.inanu.net]# ssh-copy-id git@c1.inanu.net #將上一步產生的 SSH-Key 公開金鑰複製到伺服器 git 使用者中[root@c2.inanu.net]# mkdir -p /data/git/repo/puppet[root@c2.inanu.net]# cd /data/git/repo/puppet[root@c2.inanu.net]# git init #初始化 Git 倉庫[root@c2.inanu.net]# git clone git@c1.inanu.net:puppet[root@c2.inanu.net]# git config --global user.name 'Nanu'[root@c2.inanu.net]# git config --global user.email 'nanu@inanu.net'[root@c2.inanu.net]# rsync -avz --progress --rsh=ssh root@c1.inanu.net:/etc/puppet/ ./ #將現有的 Puppet Master 設定檔同步到 Git 倉庫中 [root@c2.inanu.net]# git add . #添加所有檔案、目錄到 Git 版本控制中[root@c2.inanu.net]# git status #查看操作結果,確認所有檔案都已添加[root@c2.inanu.net]# git commit -m 'Init' #提交至本地 Git 倉庫[root@c2.inanu.net]# git push -u origin master #提交至遠程 Git 倉庫
5. 更新檢出 Puppet 設定檔

在 Puppet Master 端 (c1.inanu.net) 上執行:

[root@c1.inanu.net]# cd /etc/puppet[root@c1.inanu.net]# git clone git@c1.inanu.net:puppet

這樣就完成了對 Puppet 設定檔的更新。

6. Gitweb 配置

安裝好所有的 RPM 包之後,Gitweb 就可以運行了,預設的訪問地址是:http://IP/git/。
Gitweb 的 Apache 設定檔位於:/etc/httpd/conf.d/gitweb.conf

可以在伺服器端的 Git 倉庫設定檔中對 Gitweb 進行一些定製,以上面的 puppet 倉庫為例:

[root@c1.inanu.net]# vi /var/lib/git/puppet/config

開啟 puppet Git 倉庫設定檔 config 進行編輯,預設的 config 檔案應該是這樣的:

1234
[core]    repositoryformatversion = 0    filemode = true    bare = true

增加針對 Gitweb 的配置段,變成如下內容:

12345678
[core]    repositoryformatversion = 0    filemode = true    bare = true [gitweb]    owner = Nanu    url = git@c1.inanu.net:puppet.git

新增的 [gitweb] 配置段中指定了一些倉庫資訊。

7. Git 許可權控制

Git 預設不提供許可權管理的功能,一般都是通過作業系統自身的安全控制機制來實現,非常麻煩,而且不靈活。我們需要藉助第三方的 Git 應用來管理,一般最常用的是 Gitosis。

把所有使用者的公開金鑰儲存在 authorized_keys 檔案的做法,只能湊和一陣子,當使用者數量達到幾百人的規模時,管理起來就會十分痛苦。每次改刪使用者都必須登入伺服器不去說,這種做法還缺少必要的許可權管理。每個人都對所有項目擁有完整的讀寫權限。

Gitosis 是一套用來管理 authorized_keys 檔案和實現簡單串連限制的指令碼。有趣的是,用來添加使用者和設定許可權的並非通過網頁程式,而只是管理一個特殊的 Git 倉庫。你只需要在這個特殊倉庫內做好相應的設定,然後推送到伺服器上,Gitosis 就會隨之改變運行策略,聽起來就很酷,對吧?

(1) 由於 Gitosis 是基於 Python 開發的,先安裝依賴的 Python-Setuptools RPM
[root@c1.inanu.net]# yum install python-setuptools
(2) 從 Gitosis 官方複製代碼
[root@c1.inanu.net]# cd /usr/local/src[root@c1.inanu.net]# git clone git://eagain.net/gitosis.git[root@c1.inanu.net]# cd gitosis[root@c1.inanu.net]# python setup.py install
(2) 準備系統管理使用者公開金鑰

建立 Gitosis 的主目錄:

[root@c1.inanu.net]# mkdir -p /data/gitosis

Gitosis 將會幫我們系統管理使用者公開金鑰,所以先把當前控制檔案改名備份,以便稍後重新添加,準備好讓 Gitosis 自動管理 authorized_keys 檔案:

[root@c1.inanu.net]# mv /var/lib/git/.ssh/authorized_keys /var/lib/git/.ssh/authorized_keys.bak

接下來,把之前 git 使用者的登入 git-shell 改為普通的 shell。改過之後,大家仍然無法通過該帳號登入。因為 authorized_keys 檔案已經沒有了,不用擔心,這會交給 Gitosis 來實現。所以現在先修改 /etc/passwd 檔案,找到 git 使用者所在的行:

1
git:x:501:501::/var/lib/git:/usr/bin/git-shell

將此行改為:

1
git:x:501:501::/var/lib/git:/bin/bash
(3) 初始化 Gitosis
[root@c1.inanu.net]# su git[git@c1.inanu.net]$ cd ~[git@c1.inanu.net]$ gitosis-init < .ssh/authorized_keys.bakInitialized empty Git repository in /var/lib/git/repositories/gitosis-admin.git/Reinitialized existing Git repository in /var/lib/git/repositories/gitosis-admin.git/

注意:不要再將 git 使用者的預設 Shell 改回 git-shell,否則接下來 gitosis-serve 執行時會報錯!

這樣該公開金鑰的擁有者就能修改用於配置 Gitosis 的那個特殊 Git 倉庫了。接下來,需要手工對該倉庫中的 post-update 指令碼加上可執行許可權:

[git@c1.inanu.net]$ chmod 755 /var/lib/git/repositories/gitosis-admin.git/hooks/post-update

這樣基本上就算是好了。如果設定過程沒出什麼差錯,現在可以試一下用初始化 Gitosis 的公開金鑰的擁有者身份 SSH 登入伺服器,應該會看到類似下面這樣:

[root@c2.inanu.net]# ssh git@c1.inanu.netPTY allocation request failed on channel 0fatal: unrecognized command 'gitosis-serve Nanu'Connection to gitserver closed.

說明 Gitosis 認出了該使用者的身份,但由於沒有運行任何 Git 命令,所以它切斷了串連。那麼,現在運行一個實際的 Git 命令 — 複製 Gitosis 的控制倉庫:

[root@c2.inanu.net]# git clone git@c1.inanu.net:gitosis-admin.git

這會得到一個名為 gitosis-admin 的工作目錄,主要由兩部分組成:

[root@c2.inanu.net]# cd gitosis-admin[root@c2.inanu.net]# find ../gitosis.conf./keydir./keydir/scott.pub

gitosis.conf
這是用來設定使用者、倉庫和許可權的控制檔案。

keydir
這是儲存所有具有存取權限使用者公開金鑰的地方,每人一個。在 keydir 裡的檔案名稱(比如上面的 scott.pub)應該跟你的不一樣。Gitosis 會自動從使用 gitosis-init 指令碼匯入的公開金鑰尾部的描述中擷取該名字。

看一下 gitosis.conf 檔案的內容,它應該只包含與剛剛複製的 gitosis-admin 相關的資訊:

12345
[gitosis] [group gitosis-admin]writable = gitosis-adminmembers = Nanu

它顯示使用者 Nanu(初始化 Gitosis 公開金鑰的擁有者)是唯一能管理 gitosis-admin 項目的人。

現在我們來管理之前的 puppet 倉庫,為此我們要建立一個名為 puppet 的新段落,在其中羅列營運團隊的人員,以及他們擁有寫入權限的項目。由於 Nanu 是系統中的唯一使用者,我們把他設為唯一使用者,並允許他讀寫名為 puppet 項目:

123
[group puppet]writable = puppetmembers = Nanu

修改完之後,提交 gitosis-admin 裡的改動,並推送到伺服器使其生效:

[root@c2.inanu.net]# git commit -am 'Modify puppet'[root@c2.inanu.net]# git push

接下來,由於安裝 Gitosis 後,預設的 Git 倉庫位置已經變為 /var/lib/git/repositories,所以必須先將之前位於 /var/lib/git/puppet.git 的倉庫移動至 /var/lib/git/repositories/ 中,否則,在第一次檢出或推送的操作時,Gitosis 會自動在 /var/lib/git/repositories 中建立一個新的 puppet.git 倉庫。

[git@c1.inanu.net]$ mv /var/lib/git/puppet.git /var/lib/git/repositories/
(4) 添加使用者公開金鑰

要和朋友們在一個項目上協同工作,就得重新添加他們的公開金鑰。不過這次不用在伺服器上一個一個手工添加到 ~/.ssh/authorized_keys 檔案末端,而只需管理 keydir 目錄中的公開金鑰檔案。檔案的命名將決定在 gitosis.conf 中對使用者的標識。現在我們為 Tyra 添加公開金鑰:

[root@c2.inanu.net]# cp /tmp/id_rsa.tyra.pub keydir/tyra.pub

然後把他們都加進 'puppet' 團隊,讓他們對 puppet 倉庫具有讀寫權限:

123
[group puppet]writable = puppetmembers = Nanu tyra

最後重新提交 gitosis-admin 倉庫。

(5) 許可權控制

Gitosis 也具有簡單的存取控制功能。如果想讓 Tyra 只有讀許可權,可以這樣做:

1234567
[group puppet]writable = puppetmembers = Nanu [group puppet_ro]readonly = puppetmembers = tyra

現在 Tyra 可以複製和擷取更新,但 Gitosis 不會允許她向項目推送任何內容。像這樣的組可以隨意建立,多少不限,每個都可以包含若干不同的使用者和項目。甚至還可以指定某個組為成員之一(在組名前加上 @ 首碼),自動繼承該組的成員:

12345678910
[group puppet_committers]members = Nanu tyra [group puppet_1]writable  = puppetmembers   = @puppet_committers [group puppet_2]writable  = another_puppetmembers   = @Nanu_committers vv
(6) 其他

安裝 Gitosis 之後,如果啟用了 Gitweb,那麼還需要修改一下 Gitweb 的 CGI 程式,因為安裝 Gitosis 後,預設 Git 倉庫存放位置已經改變。

[root@c1.inanu.net]# vi /etc/httpd/conf.d/git.conf

搜尋 '/var/lib/git',將其改為 '/var/lib/git/repositories'。

如果遇到意外問題,試試看把 loglevel=DEBUG 加到 [gitosis] 的段落。
如果一不小心搞錯了配置,失去了推送許可權,也可以手工修改伺服器上的 /var/lib/git/.gitosis.conf 檔案。Gitosis 實際是從該檔案讀取資訊的。它在得到推送資料時,會把新的 gitosis.conf 存到該路徑上。所以如果你手工編輯該檔案的話,它會一直保持到下次向 gitosis-admin 推送新版本的配置內容為止。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.