设为首页 收藏本站
查看: 953|回复: 0

[经验分享] 搭建GIT服务器(CentOS)

[复制链接]

尚未签到

发表于 2018-1-15 23:04:49 | 显示全部楼层 |阅读模式
  @http://www.inanu.net/post/742.html
  这几天研究 Puppet,刚好需要搭建一个 Git Repository。把过程及遇到的问题简答记录一下。
  环境:CentOS 6.2 x86_64

1. 安装 RPM
  

[iyunv@c1.inanu.net]# yum install httpd  
[iyunv@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 配置文件:
  

1  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  

  

  

# 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 服务:
  

[iyunv@c1.inanu.net]# service xinetd start  

3. 建立 Puppet 服务器端 Git 仓库
  

[iyunv@c1.inanu.net]# useradd -d /var/lib/git -s /usr/bin/git-shell git #创建 git 用户  
[iyunv@c1.inanu.net]# passwd git #设置 git 用户密码
  
[iyunv@c1.inanu.net]# chown -R git:git /var/lib/git
  
[iyunv@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 本地仓库
  

[iyunv@c2.inanu.net]# ssh-keygen -t rsa #生成用户使用的 SSH-Key 密钥对  
[iyunv@c2.inanu.net]# ssh-copy-id git@c1.inanu.net #将上一步生成的 SSH-Key 公钥复制到服务器 git 用户中
  
[iyunv@c2.inanu.net]# mkdir -p /data/git/repo/puppet
  
[iyunv@c2.inanu.net]# cd /data/git/repo/puppet
  
[iyunv@c2.inanu.net]# git init #初始化 Git 仓库
  
[iyunv@c2.inanu.net]# git clone git@c1.inanu.net:puppet
  
[iyunv@c2.inanu.net]# git config --global user.name 'Nanu'
  
[iyunv@c2.inanu.net]# git config --global user.email 'nanu@inanu.net'
  
[iyunv@c2.inanu.net]# rsync -avz --progress --rsh=ssh root@c1.inanu.net:/etc/puppet/ ./ #将现有的 Puppet Master 配置文件同步到 Git 仓库中
  
[iyunv@c2.inanu.net]# git add . #添加所有文件、目录到 Git 版本控制中
  
[iyunv@c2.inanu.net]# git status #查看操作结果,确认所有文件都已添加
  
[iyunv@c2.inanu.net]# git commit -m 'Init' #提交至本地 Git 仓库
  
[iyunv@c2.inanu.net]# git push -u origin master #提交至远程 Git 仓库
  

  

5. 更新检出 Puppet 配置文件
  在 Puppet Master 端 (c1.inanu.net) 上执行:
  

[iyunv@c1.inanu.net]# cd /etc/puppet  
[iyunv@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 仓库为例:
  

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

  打开 puppet Git 仓库配置文件 config 进行编辑,默认的 config 文件应该是这样的:
  

1  
2
  
3
  
4
  

  

  

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

  增加针对 Gitweb 的配置段,变成如下内容:
  

1  
2
  
3
  
4
  
5
  
6
  
7
  
8
  

  

  

[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
  

[iyunv@c1.inanu.net]# yum install python-setuptools  

(2) 从 Gitosis 官方克隆代码
  

[iyunv@c1.inanu.net]# cd /usr/local/src  
[iyunv@c1.inanu.net]# git clone git://eagain.net/gitosis.git
  
[iyunv@c1.inanu.net]# cd gitosis
  
[iyunv@c1.inanu.net]# python setup.py install
  

  

(2) 准备管理用户公钥
  建立 Gitosis 的主目录:
  

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

  Gitosis 将会帮我们管理用户公钥,所以先把当前控制文件改名备份,以便稍后重新添加,准备好让 Gitosis 自动管理 authorized_keys 文件:
  

[iyunv@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
  

[iyunv@c1.inanu.net]# su git  
[git@c1.inanu.net]$ cd ~
  
[git@c1.inanu.net]$ gitosis-init < .ssh/authorized_keys.bak
  
Initialized 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 登录服务器,应该会看到类似下面这样:
  

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

  

  说明 Gitosis 认出了该用户的身份,但由于没有运行任何 Git 命令,所以它切断了连接。那么,现在运行一个实际的 Git 命令 — 克隆 Gitosis 的控制仓库:
  

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

  这会得到一个名为 gitosis-admin 的工作目录,主要由两部分组成:
  

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

  

  gitosis.conf
  这是用来设置用户、仓库和权限的控制文件。
  keydir
  这是保存所有具有访问权限用户公钥的地方,每人一个。在 keydir 里的文件名(比如上面的 scott.pub)应该跟你的不一样。Gitosis 会自动从使用 gitosis-init 脚本导入的公钥尾部的描述中获取该名字。
  看一下 gitosis.conf 文件的内容,它应该只包含与刚刚克隆的 gitosis-admin 相关的信息:
  

1  
2
  
3
  
4
  
5
  

  

  

[gitosis]  

  
[group gitosis-admin]
  
writable = gitosis-admin
  
members = Nanu
  

  它显示用户 Nanu(初始化 Gitosis 公钥的拥有者)是唯一能管理 gitosis-admin 项目的人。
  现在我们来管理之前的 puppet 仓库,为此我们要建立一个名为 puppet 的新段落,在其中罗列运维团队的人员,以及他们拥有写权限的项目。由于 Nanu 是系统中的唯一用户,我们把他设为唯一用户,并允许他读写名为 puppet 项目:
  

1  
2
  
3
  

  

  

[group puppet]  
writable = puppet
  
members = Nanu
  

  修改完之后,提交 gitosis-admin 里的改动,并推送到服务器使其生效:
  

[iyunv@c2.inanu.net]# git commit -am 'Modify puppet'  
[iyunv@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 添加公钥:
  

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

  然后把他们都加进 'puppet' 团队,让他们对 puppet 仓库具有读写权限:
  

1  
2
  
3
  

  

  

[group puppet]  
writable = puppet
  
members = Nanu tyra
  

  最后重新提交 gitosis-admin 仓库。

(5) 权限控制
  Gitosis 也具有简单的访问控制功能。如果想让 Tyra 只有读权限,可以这样做:
  

1  
2
  
3
  
4
  
5
  
6
  
7
  

  

  

[group puppet]  
writable = puppet
  
members = Nanu
  

  
[group puppet_ro]
  
readonly = puppet
  
members = tyra
  

  现在 Tyra 可以克隆和获取更新,但 Gitosis 不会允许她向项目推送任何内容。像这样的组可以随意创建,多少不限,每个都可以包含若干不同的用户和项目。甚至还可以指定某个组为成员之一(在组名前加上 @ 前缀),自动继承该组的成员:
  

1  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  

  

  

[group puppet_committers]  
members = Nanu tyra
  

  
[group puppet_1]
  
writable  = puppet
  
members   = @puppet_committers
  

  
[group puppet_2]
  
writable  = another_puppet
  
members   = @Nanu_committers vv
  


(6) 其他
  安装 Gitosis 之后,如果启用了 Gitweb,那么还需要修改一下 Gitweb 的 CGI 程序,因为安装 Gitosis 后,默认 Git 仓库存放位置已经改变。
  

[iyunv@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 推送新版本的配置内容为止。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-435516-1-1.html 上篇帖子: [Linux] Git: 基本使用 下篇帖子: Git:代码冲突常见解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表