koji架构及环境搭建

1. 序

本文和大家讨论下koji的搭建过程,顺便其中的一些概念我会做一些讲解,也是作为我koji环境搭建的一次记录。

2. 什么是koji

koji是一套构建rpm包的软件系统,自身也是基于mock来做rpm包的build操作。一条指令,koji也是可以在多台电脑上进行编译。同时koji也是能作为针对编译的包的一些管理,能够一目了然。话不多说,我们就开始搞起。

3. koji架构

3.1 koji组件结构

在这里插入图片描述如上图,我大概画出来了相关的组件及相关的关系。

  • koji-hub: 这个其实是整个koji架构的中心,负责着整个系统的维护和各个组件之间的数据交换。是一个xml-rpc的server,通过mod_wsgi模块挂载在apache上提供服务。接受client和web到来的请求,然后驱使其他组件完成构建工作,同时将数据存放到数据库中。
  • kojid:部署在要完成构建工作的相应机器上,可以部署到多个机器。主要负责从Koji-hub请求到任务进行处理,一般来讲就是构建任务
  • koji-web:主要提供给使用浏览器的一些接口,然后从上游(hub)获取数据传给浏览器
  • koji(client):命令行的客户端,输入指令与hub交互
  • kojira: 主要负责和仓库建立,仓库更新等相关事宜。这里仓库不是指数据库,是指rpm repo
  • Postgresql DB: 数据库,只有hub和他建立连接,并存取一些关系的数据,比如说账号信息,构建信息,repo的信息等等。

3.2 专业术语

  • Build: 对一个软件包的构建,指所有的不同体系架构(eg.x86)下的构建产物,比如: kernel-2.6.9-34.EL, glibc-2.3.4-2.19
  • Package: 其实就是包,并不是指某一次的build,因为我们build的产物是n(name)v(version)r(release),比如说ssh-client-5.x86_64.rpm,那么在koji里边Package就是ssh-client.
  • channel: 指builder获取构建人物的渠道
  • Host : 指运行kojid的构建机器
  • Tag和Target: tag是组织包的形式,每个tag拥有一系列可用的包,而且tag可以继承,target是在构建时使用,类似与mock里边指定的配置文件,target和tag的关系是,target关联一个build的tag和最终的tag,build的tag其实就是我们所说指定配置,而最终的tag是用来组织包(不同tag位于不同repo等)

4. 安装相关软件

  • Server端依赖的软件
httpd
mod_ssl
postgresql-server
mod_wsgi
  • build端依赖的软件
mock
rpm-build
createrepo
  • koji的相关组件
koji
koji-hub
koji-web
koji-builder
koji-utils

安装过程中可能会有一些问题,我们需要使用epel,因为koji的相关组件是epel源提供的,我们使用下边指令,或者自己配置相关yum源,然后再使用yum安装以上软件

yum install -y epel-release

我们将builder和server放在同一台主机,使用yum进行安装,安装细节这里不讲

5. 环境搭建

5.1 鉴权方式

koji中主要支持Kerberos和SSL两种方式进行身份验证,我们这里例子使用SSL

5.1.1 建立几个ssl凭证

建立/etc/pki/koji目录,我们把相关的凭证放到这里。

创建ssl.cnf,这个文件用来使用openssl生成key时的配置,拷贝以下内容到ssl.cnf

HOME                    = .
RANDFILE                = .rand

[ca]
default_ca              = ca_default

[ca_default]
dir                     = .
certs                   = $dir/certs
crl_dir                 = $dir/crl
database                = $dir/index.txt
new_certs_dir           = $dir/newcerts
certificate             = $dir/%s_ca_cert.pem
private_key             = $dir/private/%s_ca_key.pem
serial                  = $dir/serial
crl                     = $dir/crl.pem
x509_extensions         = usr_cert
name_opt                = ca_default
cert_opt                = ca_default
default_days            = 3650
default_crl_days        = 30
default_md              = sha256
preserve                = no
policy                  = policy_match

[policy_match]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[req]
default_bits            = 2048
default_keyfile         = privkey.pem
default_md              = sha256
distinguished_name      = req_distinguished_name
attributes              = req_attributes
x509_extensions         = v3_ca # The extensions to add to the self signed cert
string_mask             = MASK:0x2002

[req_distinguished_name]
countryName                     = Country Name (2 letter code)
countryName_default             = AT
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Vienna
localityName                    = Locality Name (eg, city)
localityName_default            = Vienna
0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = My company
organizationalUnitName          = Organizational Unit Name (eg, section)
commonName                      = Common Name (eg, your name or your server\'s hostname)
commonName_max                  = 64
emailAddress                    = Email Address
emailAddress_max                = 64

[req_attributes]
challengePassword               = A challenge password
challengePassword_min           = 4
challengePassword_max           = 20
unstructuredName                = An optional company name

[usr_cert]
basicConstraints                = CA:FALSE
nsComment                       = "OpenSSL Generated Certificate"
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid,issuer:always

[v3_ca]
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid:always,issuer:always
basicConstraints                = CA:true

[req_distinguished_name] 这个下边做下修改,改成和你相对应的,我这里简单举个例子:

[req_distinguished_name]
countryName                     = Country Name (2 letter code)
countryName_default             = CN
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Beijing
localityName                    = Locality Name (eg, city)
localityName_default            = Beijing
0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Leap
organizationalUnitName          = Organizational Unit Name (eg, section)
commonName                      = Common Name (eg, your name or your server\'s hostname)
commonName_max                  = 64
emailAddress                    = Email Address
emailAddress_max                = 64

我这里只改了下countryName_default,stateOrProvinceName_default,localityName_default,organizationName_default

然后就是生成ca的操作了,执行以下指令

cd /etc/pki/koji/
mkdir {certs,private,confs}
touch index.txt
echo 01 > serial
	openssl genrsa -out private/koji_ca_cert.key 2048
openssl req -config ssl.cnf -new -x509 -days 3650 -key private/koji_ca_cert.key \
-out koji_ca_cert.crt -extensions v3_ca

执行最后一条指令的时候,会有一些询问,需要更改的是Organization Unit Name(OU)和Common
Name(CN)。对于CA本身,这些字段没有严格的要求,对此证书的一个建议是使用server端的FQDN,我们这里使用leap.host(CN)和kojiCA(OU),其他地方enter键即可
在这里插入图片描述
有了 koji CA 后,我们就要给各个组件(kojihub / kojiweb / kojira / …)签发凭证
由于组件有点多,我们使用脚本来完成,创建koji-key-gen.sh,拷贝以下内容

#!/bin/bash
# if you change your certificate authority name to something else you will
# need to change the caname value to reflect the change.
caname=koji

# user is equal to parameter one or the first argument when you actually
# run the script
user=$1

openssl genrsa -out private/${user}.key 2048
openssl req -config ssl.cnf -new -nodes -out certs/${user}.csr -key private/${user}.key
openssl ca -config ssl.cnf -keyfile private/${caname}_ca_cert.key -cert ${caname}_ca_cert.crt \
    -out certs/${user}.crt -outdir certs -infiles certs/${user}.csr
cat certs/${user}.crt private/${user}.key > ${user}.pem

# for web browser
openssl pkcs12 -export -inkey private/${user}.key -in certs/${user}.crt \
    -CAfile ${caname}_ca_cert.crt -out certs/${user}_browser_cert.p12

执行以下指令,提示输入OU和CN,其他的enter即可

# OU:kojihub   CN:leap.host
./koji-key-gen.sh kojihub

# OU:kojiweb   CN:leap.host
./koji-key-gen.sh kojiweb

# OU:kojira   CN:kojira
./koji-key-gen.sh kojira

# OU:kojid1   CN:leap.host
./koji-key-gen.sh kojid1

# OU:user   CN:kojiadmin
./koji-key-gen.sh kojiadmin

# OU:user   CN:kojiuser
./koji-key-gen.sh kojiuser

简单做下解释,我们这里创建了kojid1的凭证,便于kojibuilder的使用。同时创建了kojiadmin和kojiuser的凭证,这些都是我们自己命名的,大家可以修改,我们使用kojiadmin和kojiuser作为使用koji(client)的两个用户

5.1.3 创建kojiadmin账号

我们使用kojiadmin通过命令行和hub交互,需要先创建kojiadmin账号,然后拷贝凭证

useradd kojiadmin
su kojiadmin
mkdir ~/.koji
cp /etc/pki/koji/kojiadmin.pem ~/.koji/client.crt
cp /etc/pki/koji/koji_ca_cert.crt ~/.koji/clientca.crt
cp /etc/pki/koji/koji_ca_cert.crt ~/.koji/serverca.crt

5.2 设置Postgresql Server

PostgreSQL是整个系统的数据库,存放着所有的数据。我们来做下配置。

5.2.1 初始化数据库

输入指令init数据库

// root下
su - postgres -c "PGDATA=/var/lib/pgsql/data initdb"

enable并启动服务,centos8下指令

systemctl enable postgresql
systemctl start postgresql

5.2.2 创建使用数据库及用户

useradd koji
passwd koji

切换到postgres用户,建立数据库,及建立使用数据库的用户

su - postgres
createuser --no-superuser --no-createrole --no-createdb koji
createdb -O koji koji
psql -c "alter user koji with encrypted password '12345678';"
exit

切换到koji用户,利用koji本身提供的sql来建立数据库的表

su koji
psql koji koji < /usr/share/doc/koji*/docs/schema.sql

创建完成后,我们来查询下我们建的表

psql
koji=> \d

在这里插入图片描述psql进入数据库模式,\d表示查看所有表,\q表示退出

5.2.3 配置设置koji-hub和koji-web可以访问

修改 /var/lib/pgsql/data/pg_hba.conf,添加如下内容并reload服务

# koji settings
host        koji     koji         127.0.0.1/32      trust
host        koji     koji         ::1/128           trust

local       koji    apache                          trust
local       koji     koj                            trust

接听任何地址发来的请求,修改/var/lib/pgsql/data/postgresql.conf文件

listen_addresses = '*'

重启服务

systemctl reload postgresql

插入数据库kojiadmin的相关信息,便于访问,切换到koji用户下操作数据库

su koji
psql  // 进入数据库模式
koji=> insert into users (name, status, usertype) values ('kojiadmin', 0, 0);
koji=> insert into user_perms (user_id, perm_id, creator_id) values (1, 1, 1);

我们查询看下:
在这里插入图片描述
再次重启服务

5.3 配置kojihub

5.3.1 依赖配置

编辑/etc/httpd/conf/httpd.conf
在这里插入图片描述
由于我们使用ssl凭证,所以也需要修改ssl相关配置,/etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/pki/koji/certs/kojihub.crt
SSLCertificateKeyFile /etc/pki/koji/private/kojihub.key
SSLCertificateChainFile /etc/pki/koji/koji_ca_cert.crt
SSLCACertificateFile /etc/pki/koji/koji_ca_cert.crt

SSLVerifyClient require
SSLVerifyDepth  10

同时: /etc/httpd/conf.d/kojihub.conf

# uncomment this to enable authentication via SSL client certificates
<Location /kojihub/ssllogin>
         SSLVerifyClient require
         SSLVerifyDepth  10
         SSLOptions +StdEnvVars
</Location>

然后我们需要在kojihub的配置文件修改,/etc/koji-hub/hub.conf,按照我们之前配置如下填写:

DBName = koji
DBUser = koji
DBHost = 127.0.0.1

DBPass = 12345678
KojiDir = /mnt/koji

LoginCreatesUser = Off
KojiWebURL = http://leap.host/koji

这里我们选择不在登陆的时候创建用户。允许连接数据库设定执行命令

setsebool -P httpd_can_network_connect_db=1

5.3.2 授权的配置

我们为了web的ssl凭证也可以访问hub,我们要设定ProxyDNs,在/etc/koji-hub/hub.conf,填充的内容也是我们上边的设定

DNUsernameComponent = CN
ProxyDNs = C=CN,ST=Beijing,O=Leap,OU=kojiweb,CN=leap.host 

ProxyDNs在mod_ssl >= 2.3.11使用逗号分隔,2.3.11的话使用/分隔

然后我们来设置文件系统:

cd /mnt
mkdir koji
cd koji
mkdir {packages,repos,work,scratch,repos-dist}
chown apache.apache *

配置SELinux使得Apache有权限写入到/mnt/koji

setsebool -P allow_httpd_anon_write=1
chcon -R -t public_content_rw_t /mnt/koji/*

如果文件系统使用NFS分享的话,还需要添加配置:

setsebool -P httpd_use_nfs=1

5.4 配置koji(client)

我们在命令行中输入“koji”等相关命令就是在使用cli与hub进行交互了,相关配置在/etc/koji.conf,或者用户可以在home目录下新建~/.koji/config用来配置也是一样,我们使用/etc/koji.conf,我这里修改了server,weburl,topdir,topurl,authtype,krb_rdns,cert,ca,serverca

[koji]

;configuration for koji cli tool

;url of XMLRPC server
;server = http://hub.example.com/kojihub
server = http://leap.host/kojihub

;url of web interface
;weburl = http://www.example.com/koji
weburl = http://leap.host/koji

;url of package download site
;pkgurl = http://www.example.com/packages

;path to the koji top directory
topdir = /mnt/koji
topurl = http://leap.host/kojifiles

;configuration for Kerberos authentication
;authtype = kerberos
;krb_rdns = false

;the principal to auth as for automated clients
;principal = client@EXAMPLE.COM

;the keytab to auth as for automated clients
;keytab = /etc/krb5.keytab


;configuration for SSL authentication

;client certificate
cert = ~/.koji/client.crt

;certificate of the CA that issued the client certificate
ca = ~/.koji/clientca.crt

;certificate of the CA that issued the HTTP server certificate
serverca = ~/.koji/serverca.crt

;plugin paths, separated by ':' as the same as the shell's PATH
;koji_cli_plugins module and ~/.koji/plugins are always loaded in advance,
;and then be overridden by this option
;plugin_paths = ~/.koji/plugins

;[not_implemented_yet]
;enabled plugins for CLI, runroot and save_failed_tree are available
;plugins =
; runroot plugin is enabled by default in fedora
plugins = runroot

还记得我们在5.1.3节拷贝到~/.koji下的文件,这里正好可以用到

到这里我们配置cli完成,我们来测试一下。

我们要配置host下,leap.host配置成127.0.0.1
然后重启下httpd和postgresql:

systemctl enable httpd
systemctl restart httpd
systemctl restart postgresql

切换到kojiadmin用户,输入koji hello:

su kojiadmin
koji hello

在这里插入图片描述

5.5 配置kojiweb

我们可以用命令行来使用koji了,我们还是希望能从web上做下观察,我们先修改/etc/httpd/conf.d/kojiweb.conf
再切换回来root用户
先来配置可以使用ssl的凭证,打开前边的注释即可:

# uncomment this to enable authentication via SSL client certificates
<Location /koji/login>
     SSLVerifyClient require
     SSLVerifyDepth  10
     SSLOptions +StdEnvVars
</Location>

再来配置kojiweb自己的配置/etc/kojiweb/web.conf,修改了KojiHubURL,KojiFilesURL,WebCert,ClientCA,KojiHubCA

web]
SiteName = koji
# KojiTheme = mytheme

# Key urls
KojiHubURL = http://leap.host/kojihub
KojiFilesURL = http://leap.host/kojifiles

# Kerberos authentication options
# WebPrincipal = koji/web@EXAMPLE.COM
# WebKeytab = /etc/httpd.keytab
# WebCCache = /var/tmp/kojiweb.ccache
# The service name of the principal being used by the hub
# KrbService = host
## The realm of server principal. Using client's realm if not set
# KrbServerRealm = EXAMPLE.COM

# SSL authentication options
WebCert = /etc/pki/koji/kojiweb.pem
ClientCA = /etc/pki/koji/koji_ca_cert.crt
KojiHubCA = /etc/pki/koji/koji_ca_cert.crt

kojiweb搭建完成,重启下服务,然后使用浏览器(http://leap.host/koji/)访问看下

systemctl restart httpd

在这里插入图片描述可以显示界面了,完美!!!

5.6 配置kojid

5.6.1 依赖配置

kojid是一个后台运行的进程,和hub通行,并且可以构建rpm包。我们需要在在koji的系统里增加一个host,host这个概念可以理解成一个构建的机器,即运行kojid服务的机器。因为我们builder和hub是同一台机器。所以host也使用leap.host,arch是我本机电脑的(x86_64)

su kojiadmin
koji add-host leap.host x86_64

然后kojid本身的配置:/etc/kojid/kojid.conf

; The URL for the xmlrpc server
server=http://leap.host/kojihub

; The URL for the file access
topurl=http://leap.host/kojifiles

user = leap.host

; The directory root where work data can be found from the koji hub
topdir=/mnt/koji

; The directory root for temporary storage
workdir=/tmp/koji

5.6.2 授权的配置

使用ssl我们要配置访问hub的凭证,同样是在/etc/kojid/kojid.conf文件添加,首先我们将kojid相关的凭证拷贝一下:

cp /etc/pki/koji/kojid1.pem /etc/kojid/
cp /etc/pki/koji/koji_ca_cert.crt /etc/kojid/

然后再来修改配置文件:

;client certificate
cert = /etc/kojid/kojid1.pem

;certificate of the CA that issued the HTTP server certificate
serverca = /etc/kojid/koji_ca_cert.crt
5.6.3 添加到channel

builder运行的时候需要知道从那个channel里边去获取task并运行。默认的channel是default,但需要一些builder添加到createrepo的channel,即会有builder处理来自kojira发起的创建仓库的task。可以选择再增加以下他的处理能力。capacity是指builder可以接受的最大数量的task。

su kojiadmin
koji add-host-to-channel leap.host createrepo
koji edit-host --capacity=16 leap.host

然后我们启动kojid的服务:

// root下
systemctl enable kojid
systemctl start kojid

我这里会有一个问题,运行systemctl status kojid查看运行状态:
在这里插入图片描述“by”无法识别,我们看下/etc/kojid/kojid.conf文件,我这里140行多了一个“by”,我们删掉他
在这里插入图片描述
再次重启,显示正常。

systemctl restart kojid
systemctl status kojid

在浏览器上点击host那一栏,可以看到我们新加的host:
在这里插入图片描述

5.7 配置kojira

kojira用来进行Yum存储库创建和维护
我们首先要添加用户,授予他控制文件系统的权限。

su kojiadmin
koji add-user kojira
koji grant-permission repo kojira

同样我们也修改配置/etc/kojira/kojira.conf,可以访问hub,同时也要修改ssl相关的配置

; The URL for the koji hub server
server=http://leap.host/kojihub

;client certificate
cert = /etc/pki/koji/kojira.pem

;certificate of the CA that issued the HTTP server certificate
serverca = /etc/pki/koji/koji_ca_cert.crt

然后我们启动kojira的服务:

systemctl start kojira

到这里我们环境搭建就算完成了,有些概念可能理解不是很到位,也算是自己完成搭建的一次记录,下一篇文章我们再来聊聊怎样build我们的包及打tag等等。有问题欢迎留言

ref

  • https://docs.pagure.org/koji/server_howto/
  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 40
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值