我有一个RPM repository运行JFrog Artifactory。CentOS 和 RHEL 主机正在使用它,我也想将它与我的 openSUSE 主机一起使用。
JFrog 的这份文档没有明确说明只支持 yum 客户端,并且由于他们使用了术语RPM repository,对我来说这表明存储库也应该与zypper客户端一起使用。
这是一个关于源代码的opensuse文档repomd/rpm md/YUM,使用该createrepo命令创建的 openSUSE 主机上的存储库的视觉检查看起来与 JFrog RPM 存储库布局一致。
opensuse:~ # ll /data/internalrepo/
total 1157456
-rw-r--r-- 1 root root 1185231772 Apr 22 08:54 myapp-server-2019.0.x86_64.rpm
drwxr-xr-x 1 root root 494 Apr 22 08:55 repodata
opensuse:~ # ll /data/internalrepo/repodata/
total 324
-rw-r--r-- 1 root root 1901 Apr 22 08:55 6a654dd3c11ae0f51efd9cd3fd09ccfdc3c48e988ab886c370e94f7f5bcdf3d1-primary.xml.gz
-rw-r--r-- 1 root root 315545 …Run Code Online (Sandbox Code Playgroud) 我对 HTTP 协议和一点点 HAProxy 非常熟悉,但我以前从未真正搞过 URL 重写和重定向。现在,我有 2 个“简单”的 HTTP 重定向要求,我一直很难弄清楚。
https://appserver.example.com应重定向到https://appserver.example.com/myapp/webapp/?auth=saml将用户指向saml登录页面。https://appserver.example.com/?auth=standard应该重定向到https://appserver.example.com/myapp/webapp/?auth=standard要求 1 工作正常:
myuser:~ myuser$ curl -I https://appserver.example.com
HTTP/1.1 301 Moved Permanently
Content-length: 0
Location: https://appserver.example.com/myapp/webapp/?auth=saml
Connection: close
myuser:~ myuser$
Run Code Online (Sandbox Code Playgroud)
但我在如何实施#2 上遇到了困难。正如我所想,关键是添加一个acl,然后在匹配http-request redirect prefix时添加另一行。acl
acl is_auth_std path /?auth=standard
http-request redirect prefix /myapp/webapp/?auth=standard code 301 if is_auth_std
Run Code Online (Sandbox Code Playgroud)
但显然这还不够。/?auth=standard仍然重定向到假定的根 URL:
myuser:~ myuser$ curl -I https://appserver.example.com/?auth=standard
HTTP/1.1 301 Moved Permanently
Content-length: 0
Location: https://appserver.example.com/myapp/webapp/?auth=saml
Connection: close …Run Code Online (Sandbox Code Playgroud) 我按照以下指南使用 RPM/Yum 和使用外部 PostgreSQL 数据库安装 JFrog Artifactory OSS。
SELinux 被禁用并jfrog-artifactory-oss从 JFrog 存储库 [ https://jfrog.bintray.com/artifactory-rpms]安装。
检查服务:
[root@jfrog ~]# systemctl status artifactory -l
? artifactory.service - Artifactory service
Loaded: loaded (/usr/lib/systemd/system/artifactory.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2020-08-08 01:56:50 +08; 11min ago
Process: 9714 ExecStop=/opt/jfrog/artifactory/app/bin/artifactoryManage.sh stop (code=exited, status=0/SUCCESS)
Process: 10268 ExecStart=/opt/jfrog/artifactory/app/bin/artifactoryManage.sh start (code=exited, status=0/SUCCESS)
Main PID: 12388 (java)
CGroup: /system.slice/artifactory.service
? 12388 /opt/jfrog/artifactory/app/third-party/java/bin/java -Djava.util.logging.config.file=/opt/jfrog/artifactory/app/artifactory/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -server -Xss256k -XX:+UseG1GC -XX:OnOutOfMemoryError=kill -9 %p …Run Code Online (Sandbox Code Playgroud) 由于一些“身份验证”问题,我很难配置客户端(SLES 和 OpenSUSE)以与我们的JFrogzypper一起使用。起初,我认为这只是opensuse 的问题,所以我首先专注于让 zypper 工作的努力。这是上一个问题。RPM Repositoryzypper
但是,客户端(centOS)也会时不时地出现这些与身份验证相关的错误yum,尽管并不那么频繁。
所以我尝试man-in-the-middle看看幕后发生了什么,这是以下序列zypper:
以下是 a 的序列zypper refresh --repo myrepo:
(1)发送带有-encoded的zypperHTTP请求:HEADbase64username:
HEAD /myapp-release-rpm/stable/myapp/2019/3/repodata/repomd.xml HTTP/1.1
Host: rpm.example.com
Authorization: Basic dXNlcm5hbWU6
User-Agent: ZYpp 17.19.0 (curl 7.60.0) openSUSE-Leap-15.1-x86_64
Accept: */*
Connection: close
Run Code Online (Sandbox Code Playgroud)
(2)jfrog使用 HTTP 进行响应,标头401 Unauthorized为WWW-Authenticate:
HTTP/1.1 401 Unauthorized
Date: Thu, 28 May 2020 08:20:04 GMT
Content-Type: …Run Code Online (Sandbox Code Playgroud) 我有一个分子测试,它启动 2 个 Docker 容器,用于一次测试 2 个应用程序版本。
dependency:
name: galaxy
driver:
name: docker
lint:
name: yamllint
platforms:
- name: molecule1
hostname: molecule1
image: "geerlingguy/docker-${MOLECULE_DISTRO:-centos7}-ansible:latest"
command: ${MOLECULE_DOCKER_COMMAND:-""}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
privileged: true
pre_build_image: true
- name: molecule2
hostname: molecule2
image: "geerlingguy/docker-${MOLECULE_DISTRO:-centos7}-ansible:latest"
command: ${MOLECULE_DOCKER_COMMAND:-""}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
privileged: true
pre_build_image: true
provisioner:
name: ansible
inventory:
host_vars:
molecule1:
app_version: "v1"
molecule2:
app_version: "v2"
lint:
name: ansible-lint
scenario:
name: default
converge_sequence:
- syntax
- lint
- create
- prepare
- converge
- idempotence
- …Run Code Online (Sandbox Code Playgroud) artifactory ×3
ansible ×1
docker ×1
haproxy ×1
http-headers ×1
molecule ×1
opensuse ×1
repository ×1
sles ×1
url ×1
zypper ×1