Nexus 3 OSS เป็นตัวจัดการพื้นที่เก็บข้อมูลอาร์ติแฟกต์โอเพนซอร์สที่สามารถรองรับได้หลายรูปแบบ เช่น อิมเมจคอนเทนเนอร์, Python PIP, Java Jar และอื่นๆ อีกมากมาย
เหตุใดจึงต้องมีผู้จัดการอาร์ติแฟกต์ภายในองค์กร มีเหตุผลหลายประการ:
-
ใช้โครงสร้างพื้นฐานส่วนตัวของคุณ:คุณอาจมีรหัสที่เป็นกรรมสิทธิ์ซึ่งจำเป็นต้องได้รับการปกป้อง
-
ความเร็วในการดาวน์โหลดอาร์ติแฟกต์ที่เร็วขึ้น:หากคุณดาวน์โหลดอาร์ติแฟกต์เดียวกันทางอินเทอร์เน็ตอยู่ตลอดเวลา คุณสามารถแคชสิ่งเหล่านั้นไว้ที่ตำแหน่งศูนย์กลาง เพื่อประโยชน์ของผู้ใช้หลายรายในเซิร์ฟเวอร์หลายเครื่องด้วยการแคชสิ่งเหล่านั้น
-
ควบคุมสิ่งที่สร้างให้กับห่วงโซ่การสร้างของคุณ:รวมตำแหน่งของสิ่งประดิษฐ์ไว้ที่ศูนย์กลาง ตรวจสอบให้แน่ใจว่าได้รับการอนุมัติสำหรับการใช้งาน และยืนยันด้วยว่าไม่มีโค้ดที่เป็นอันตราย
-
แยกผู้ที่สามารถเข้าถึงอาร์ติแฟกต์ของคุณได้:คุณอาจมีข้อกำหนดที่เข้มงวดมากขึ้นว่าใครสามารถเข้าถึงอาร์ติแฟกต์บางอย่างภายในองค์กรของคุณได้
ในบทความนี้ ฉันจะแสดงให้คุณเห็นว่าคุณสามารถดาวน์โหลด ติดตั้ง และกำหนดค่า Nexus 3 เวอร์ชัน OSS โดยใช้ Playbook Ansible ได้อย่างไร
Nexus 3 จะทำงานบนคอมพิวเตอร์ Orange PI 5 ที่มี 8 GB หรือ RAM แต่การจัดเตรียมนี้สามารถทำได้ในเครื่องทุกเครื่องที่มีข้อกำหนดขั้นต่ำ ส่วนหนึ่งของการตั้งค่าจะประกอบด้วยการตั้งค่าพร็อกซีสำหรับ PyPI.org สำหรับเครื่องที่อยู่ในรายการไฟล์สินค้าคงคลังของฉัน
สิ่งที่คุณต้องมีเพื่อเรียกใช้โค้ดจากบทช่วยสอนนี้
-
การเชื่อมต่ออินเทอร์เน็ตเพื่อดาวน์โหลดซอร์สโค้ดสำหรับ Ansible Playbook, Nexus และโมดูล PIP
-
เครื่อง Linux สองเครื่องขึ้นไป (ฉันใช้ Debian, Armbian และ Fedora IOT) พร้อม RAM อย่างน้อย 8 GB คลัสเตอร์ของฉันมีส่วนผสมของ Raspberry PI 4 และ OrangePI 5
-
คอนโทรลเลอร์ Ansible จะทำงานบนเครื่อง Fedora แต่เซิร์ฟเวอร์ใด ๆ ก็สามารถเป็นคอนโทรลเลอร์ได้ คำแนะนำในการติดตั้งสำหรับ Ansible นั้นง่ายต่อการปฏิบัติตาม
องค์กรเพลย์บุ๊ก
ฉันแบ่งงานออกเป็นกลุ่มและ Playbook ที่ได้จะมีลักษณะดังนี้:
[josevnz@dmaf5 Nexus3OnOrangePI]$ tree -N ansible/
ansible/
├── inventories
│ └── home
│ └── hosts.yaml
├── roles
│ ├── clients
│ │ ├── tasks
│ │ │ └── main.yaml
│ │ └── templates
│ │ └── pip.conf.j2
│ └── nexus
│ ├── files
│ │ └── swagger.json
│ ├── tasks
│ │ ├── download.yaml
│ │ ├── install.yaml
│ │ ├── main.yaml
│ │ ├── post_install.yaml
│ │ ├── pre_install.yaml
│ │ ├── repositories.yaml
│ │ ├── third_party.yaml
│ │ └── user.yaml
│ └── templates
│ ├── logrotate.nexus3.j2
│ ├── nexus3.service.j2
│ ├── nexus.rc.j2
│ └── nexus.vmoptions.j2
├── site.yaml
├── vars
│ ├── clients.yaml
│ └── nexus.yaml
└── vault
├── nexus_password.enc
└── README.md
13 directories, 21 files
ตอนนี้ขออธิบายเล็กน้อย:
-
มีสองบทบาท:'Nexus' และ 'ลูกค้า' บทบาท Nexus ใช้เพื่อตั้งค่าซอฟต์แวร์การจัดการสิ่งประดิษฐ์ ในขณะที่บทบาทไคลเอ็นต์จะตั้งค่าการตั้งค่า pip บนทุกเครื่อง
-
Vars มีตัวแปรที่ใช้ในแต่ละบทบาท โดยคั่นด้วยไฟล์เพื่อให้การใช้งานชัดเจนยิ่งขึ้น
-
เรามีรหัสผ่านและเราจัดการมันโดยใช้ฟีเจอร์ Ansible vault
-
ไฟล์ 'site.yaml' จัดการดำเนินการตามบทบาท:
- hosts: all
tags: clients
vars_files:
- vars/clients.yaml
roles:
- clients
- hosts: nexus_server
tags: nexus
become_user: root
become: true
vars_files:
- vars/nexus.yaml
roles:
- nexus
ตอนนี้เรามาดูจักรวาลที่ Playbook จะถูกดำเนินการกัน
สินค้าคงคลังของโฮสต์
ในกรณีของฉัน มันค่อนข้างง่าย – ฉันมีสองกลุ่มหลัก:'ไคลเอนต์' และเครื่องที่เซิร์ฟเวอร์ Nexus 3 จะทำงาน:
all:
children:
nexus_server:
hosts:
orangepi5.home:
home_lab:
hosts:
dmaf5.home:
raspberrypi.home:
orangepi5.home:
งานสำคัญถัดไปคือการดาวน์โหลดและกำหนดค่า Nexus 3
วิธีการติดตั้ง Nexus 3
ไฟล์ main.yaml อธิบายลำดับและวัตถุประสงค์ของงานการติดตั้งแต่ละงานสำหรับบทบาท Nexus:
# Tasks listed here are related to the remote Nexus 3 server
# Included tasks are called in order
---
- include_tasks: third_party.yaml
- include_tasks: pre_install.yaml
- include_tasks: download.yaml
- include_tasks: install.yaml
- include_tasks: post_install.yaml
- include_tasks: user.yaml
- include_tasks: repositories.yaml
มาดูกันก่อนว่าฉันชอบเรียกว่า "งานหลัก" อะไร:
-
Third_party.yaml:ในที่นี่ เราติดตั้ง OpenJDK8 (Nexus 3 เขียนด้วยภาษา Java) และล็อกการหมุนเพื่อดูแลบันทึกเก่า
-
pre_install.yaml:มีสิ่งต่างๆ มากมายเกิดขึ้นที่นี่ เช่น การสร้างไดเร็กทอรีที่จำเป็นสำหรับ Nexus ซึ่งเป็นผู้ใช้เฉพาะที่ไม่มีสิทธิพิเศษที่จะเรียกใช้กระบวนการ
-
download.yaml:ตามชื่อเลย เราได้รับซอฟต์แวร์ Nexus 3 OSS เวอร์ชันใหม่และตรวจสอบให้แน่ใจว่ามีการตรวจสอบความถูกต้อง เราไม่ต้องการติดตั้งมัลแวร์จากอินเทอร์เน็ต
จากนั้นงานที่จัดอยู่ใน “กลุ่มการติดตั้งแบบกำหนดเอง”:
-
install.yaml:แกะซอฟต์แวร์ เตรียมหน่วย systemd เพื่อเริ่มทำงานโดยอัตโนมัติ ตั้งค่าการตั้งค่า JVM สำหรับ Nexus และปรับใช้การกำหนดค่า logrotate
-
post_install.yaml:สิ่งที่น่าตื่นเต้นเกิดขึ้นที่นี่ – ซอฟต์แวร์ได้รับการติดตั้งและเราเปิดใช้งานเป็นครั้งแรก นอกจากนี้เรายังเปลี่ยนรหัสผ่านเริ่มต้นโดยใช้ REST API เพื่อให้เราสามารถย้ายไปยังขั้นตอนการปรับแต่งได้
-
user.yaml:ที่นี่เราจัดเตรียมเพื่อให้ผู้ใช้ปลายทางของเราสามารถเข้าถึงบริการที่ Nexus นำเสนอได้อย่างเหมาะสม เราดำเนินการนี้โดยใช้การผสมผสานระหว่าง REST-API และโค้ดไคลเอ็นต์ Ansible:
# https://help.sonatype.com/repomanager3/installation-and-upgrades/post-install-checklist
# https://help.sonatype.com/repomanager3/integrations/rest-and-integration-api
---
- name: Enable anonymous user
tags: anonymous
ansible.builtin.uri:
user: ""
password: ""
url: "/v1/security/anonymous"
method: PUT
body_format: raw
status_code: [ 200, 202, 204 ]
headers:
Content-Type: application/json
body: |-
{ "enabled" : true, "userId" : "anonymous", "realmName" : "NexusAuthorizingRealm" }
force_basic_auth: true
return_content: true
any_errors_fatal: true
- name: Enable Docker security realm
tags: docker_realm
ansible.builtin.uri:
user: ""
password: ""
url: "/v1/security/realms/active"
method: PUT
body_format: raw
status_code: [ 200, 202, 204 ]
headers:
Content-Type: application/json
body: |-
[ "NexusAuthenticatingRealm", "NexusAuthorizingRealm", "DockerToken" ]
force_basic_auth: true
return_content: true
any_errors_fatal: true
ตรรกะนั้นง่ายต่อการติดตาม โดยใช้วิธี http 'PUT' คุณสามารถบอกได้ว่าเป็นการดำเนินการแก้ไข (หมายถึงบทบาทและผู้ใช้ที่มีอยู่แล้ว) การตรวจจับข้อผิดพลาดทำได้โดยการรับรหัส HTTP ที่ส่งคืนโดย Nexus
ขั้นตอนต่อไปคือการเตรียมพร็อกซี PyPi ในเครื่องของเรา นี่เป็นงานหลายขั้นตอนและจะมีการอธิบายรายละเอียดต่อไป
วิธีการตั้งค่าพร็อกซี PyPI บน Nexus 3
ไฟล์สุดท้ายในบทบาท Nexus 3 คือ 'repositories.yaml' ในที่นี้เราจะทำตามขั้นตอนต่อไปนี้:
-
ตรวจสอบว่าพร็อกซีได้รับการตั้งค่าแล้ว (GET หรือการดำเนินการอ่านอย่างเดียว)
-
หากไม่มี ให้สร้างใหม่ (วิธี POST พร้อมเพย์โหลด JSON พร้อมรายละเอียดเพื่อสร้างพื้นที่เก็บข้อมูลใหม่ทั้งหมด)
ข้อสังเกตกว่า Playbook นี้ไม่มีตัวเลือกในการอัปเดตการตั้งค่าพื้นที่เก็บข้อมูล คุณสามารถใช้ REST API ได้ แต่ฉันจะปล่อยให้ผู้อ่านได้ฝึกหัด
งานในการเตรียมพร็อกซี PyPi แสดงไว้ด้านล่าง:
# Create proxy for repositories
# https://help.sonatype.com/repomanager3/integrations/rest-and-integration-api
# PyPi: https://pip.pypa.io/en/stable/user_guide/
---
- name: Check if the PyPi proxy exists
tags: pypi_proxy_exists
ansible.builtin.uri:
user: ""
password: ""
url: "/v1/repositories/pypi/proxy/python_proxy"
method: GET
body_format: raw
status_code: [ 200, 202, 204, 404 ]
headers:
Content-Type: application/json
force_basic_auth: true
return_content: true
any_errors_fatal: true
register: python_local
- name: Create PyPI proxy
tags: pypi_proxy_create
ansible.builtin.uri:
user: ""
password: ""
url: "/v1/repositories/pypi/proxy"
method: POST
body_format: raw
status_code: [ 201 ]
headers:
Content-Type: application/json
body: |-
{
"name": "python_proxy",
"online": true,
"storage": {
"blobStoreName": "default",
"strictContentTypeValidation": true
},
"proxy": {
"remoteUrl": "https://pypi.org/",
"contentMaxAge": -1,
"metadataMaxAge": 1440
},
"negativeCache": {
"enabled": true,
"timeToLive": 1440
},
"httpClient": {
"blocked": false,
"autoBlock": true,
"connection": {
"retries": 0,
"timeout": 60,
"enableCircularRedirects": false,
"enableCookies": true,
"useTrustStore": false
}
}
}
force_basic_auth: true
return_content: true
any_errors_fatal: true
when: python_local.status == 404
เราเกือบจะถึงแล้ว ตอนนี้เราต้องแจ้งให้ลูกค้า PyPi ทราบว่าควรใช้ Nexus ในพื้นที่ของเรา ไม่ใช่ไซต์ PyPi โดยตรงเพื่อรับไลบรารี Python ของเรา
วิธีการตั้งค่าลูกค้า
บทบาทของลูกค้านั้นง่ายกว่ามากและต้องการเพียงปรับใช้เทมเพลตสำหรับ pip.conf ที่มีข้อมูลที่เพียงพอเพื่อบังคับการค้นหาในที่เก็บใหม่ของเรา:
# Tasks here are meant to be used on our clients user
---
- name: Create installation directory for pip.conf
tags: pip_basedir
ansible.builtin.file:
state: directory
path: ""
owner: ""
group: ""
mode: "u+rwx,go-rwx"
- name: Copy pip.conf file
tags: pip_copy
ansible.builtin.template:
src: pip.conf.j2
dest: "/pip.conf"
owner: ""
group: ""
mode: u=rxw,g=r,o=r
ไฟล์ผลลัพธ์จะถูกปรับใช้บน '~/.config/pip/pip.conf ’ ของทุกเครื่อง:
# https://pip.pypa.io/en/stable/topics/configuration/
[global]
timeout = 60
[install]
index = http://orangepi5.home:8081/repository/python_proxy/pypi
index-url = http://orangepi5.home:8081/repository/python_proxy/simple/
trusted-host = orangepi5.home
ไฟล์ด้านบนแสดงตัวอย่างว่าเวอร์ชันสุดท้ายของไฟล์จะมีลักษณะอย่างไรเมื่อปรับใช้บนคลัสเตอร์ของฉัน (ไฟล์ของคุณจะแตกต่างออกไปตาม URL ที่ได้รับการแก้ไข)
ถึงเวลาแล้วที่จะเรียกใช้ Playbook ทั้งหมดและดูว่าจะมีหน้าตาเป็นอย่างไร
วิธีเรียกใช้ Playbook
ในการเรียกใช้ Playbook เราต้องผ่านข้อโต้แย้งบางประการ:
-
ตำแหน่งของสินค้าคงคลังโฮสต์ของเรา
-
ตำแหน่งของไฟล์รหัสผ่านที่เข้ารหัสและไฟล์หลักที่มีรหัสผ่านหลักเพื่อปลดล็อคเนื้อหาของไฟล์ที่ได้รับการป้องกัน
-
และสุดท้ายคือตำแหน่งของไฟล์ Playbook หลักของเรา
cd ansible
ansible-playbook --inventory inventories --extra-vars @vault/nexus_password.enc --vault-password-file $HOME/vault/ansible_vault_pass site.yaml

วิธีทดสอบพร็อกซี PyPI ใหม่
เพื่อทดสอบพร็อกซีใหม่ของเรา เราจะติดตั้ง Python Rich โดยใช้ pip และสภาพแวดล้อมเสมือน
josevnz@orangepi5:~$ python3 -m venv ~/virtualenv/rich
(rich) josevnz@orangepi5:~$ . ~/virtualenv/rich/bin/activate
(rich) josevnz@orangepi5:~$ pip install rich
Looking in indexes: http://orangepi5.home:8081/repository/python_proxy/simple/
Collecting rich
Downloading http://orangepi5.home:8081/repository/python_proxy/packages/rich/13.3.4/rich-13.3.4-py3-none-any.whl (238 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 238.7/238.7 KB 14.8 MB/s eta 0:00:00
Collecting pygments<3.0.0,>=2.13.0
Downloading http://orangepi5.home:8081/repository/python_proxy/packages/pygments/2.15.0/Pygments-2.15.0-py3-none-any.whl (1.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 23.8 MB/s eta 0:00:00
Collecting markdown-it-py<3.0.0,>=2.2.0
Downloading http://orangepi5.home:8081/repository/python_proxy/packages/markdown-it-py/2.2.0/markdown_it_py-2.2.0-py3-none-any.whl (84 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 84.5/84.5 KB 6.9 MB/s eta 0:00:00
Collecting mdurl~=0.1
Downloading http://orangepi5.home:8081/repository/python_proxy/packages/mdurl/0.1.2/mdurl-0.1.2-py3-none-any.whl (10.0 kB)
Installing collected packages: pygments, mdurl, markdown-it-py, rich
Successfully installed markdown-it-py-2.2.0 mdurl-0.1.2 pygments-2.15.0 rich-13.3.4
จากนั้นเราสามารถยืนยันได้ว่าแคชนั้นถูกใช้จริง ๆ โดยการดูสิ่งประดิษฐ์ใหม่บนที่เก็บใหม่:

ดูสิ่งประดิษฐ์ PyPi ป>
มาดูการสาธิตการทำงานของไคลเอนต์ โดยติดตั้งอย่างอื่น:

การปรับแต่งเพิ่มเติมโดยใช้ REST-API
การติดตั้ง Nexus ทุกครั้งทำให้คุณสามารถดาวน์โหลดไฟล์ JSON ที่อธิบาย API ที่เซิร์ฟเวอร์รองรับได้ ตัวอย่างเช่น ในเซิร์ฟเวอร์ของฉัน คุณสามารถรับสำเนาเช่นนี้จากเซิร์ฟเวอร์ orangepi5.home ของฉัน:
curl --fail --remote-name http://orangepi5.home:8081/service/rest/swagger.json
นอกจากนี้ UI ยังช่วยให้คุณลองใช้ตำแหน่งข้อมูล REST API อื่นๆ เพื่อปรับแต่งการติดตั้งของคุณได้

การทดสอบ REST API ป>
บทสรุป
ฉันขอแนะนำให้ใช้เวลาอ่านหนังสือ Nexus 3 เพื่อทำความคุ้นเคยกับคุณลักษณะที่เครื่องมือนี้มีให้
ชุมชนได้เตรียมตัวติดตั้ง Debian และ RPM หากคุณต้องการการตั้งค่าประเภทนี้แทนที่จะใช้ Ansible
Nexus 3 มีมากมาย ของการตั้งค่าที่กำหนดค่าได้ เราครอบคลุมเฉพาะพื้นผิวที่นี่ ขณะเตรียมบทความนี้ ฉันพบ 'พื้นที่เก็บข้อมูล ThoTeam Nexus3-oss' พร้อมด้วย Playbook ที่สมบูรณ์และทันสมัย แต่มันซับซ้อนกว่าสิ่งอื่นใดที่ฉันต้องการสำหรับห้องปฏิบัติการที่บ้านของฉันมาก
Archiva เป็นอีกหนึ่งผู้จัดการสิ่งประดิษฐ์โอเพ่นซอร์ส ซึ่งมีข้อจำกัดในด้านฟังก์ชันการทำงานมากกว่า แต่ยังตั้งค่าได้ง่ายกว่า
มีรายการตรวจสอบหลังการติดตั้งซึ่งมีงานบางอย่างที่ฉันไม่จำเป็นต้องทำให้เสร็จสำหรับโฮมแล็บของฉัน โปรดตรวจสอบเพื่อให้แน่ใจว่าการตั้งค่าของคุณเสร็จสมบูรณ์
เรียนรู้การเขียนโค้ดฟรี หลักสูตรโอเพ่นซอร์สของ freeCodeCamp ช่วยให้ผู้คนมากกว่า 40,000 คนได้งานในตำแหน่งนักพัฒนา เริ่มต้น