本文主要是介绍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 > serialopenssl 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=$1openssl 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 trustlocal 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.crtSSLVerifyClient require
SSLVerifyDepth 10
同时: /etc/httpd/conf.d/kojihub.conf
# uncomment this to enable authentication via SSL client certificates
<Location /kojihub/ssllogin>SSLVerifyClient requireSSLVerifyDepth 10SSLOptions +StdEnvVars
</Location>
然后我们需要在kojihub的配置文件修改,/etc/koji-hub/hub.conf,按照我们之前配置如下填写:
DBName = koji
DBUser = koji
DBHost = 127.0.0.1DBPass = 12345678
KojiDir = /mnt/kojiLoginCreatesUser = 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 requireSSLVerifyDepth 10SSLOptions +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/kojifilesuser = 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/
这篇关于koji架构及环境搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!