Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Mac

Triển khai Nexus 3 OSS trên Orange Pi 5 bằng Ansible:Hướng dẫn từng bước

Triển khai Nexus 3 OSS trên Orange Pi 5 bằng Ansible:Hướng dẫn từng bước

Nexus 3 OSS là trình quản lý kho lưu trữ cấu phần nguồn mở có thể xử lý nhiều định dạng như hình ảnh vùng chứa, Python PIP, Java jar và nhiều định dạng khác.

Tại sao phải có người quản lý hiện vật tại chỗ? Có rất nhiều lý do cho việc đó:

  • Sử dụng cơ sở hạ tầng riêng tư của bạn:Bạn có thể có mã độc quyền cần được bảo vệ.

  • Tốc độ tải xuống cấu phần phần mềm nhanh hơn:Nếu bạn liên tục tải xuống cùng một cấu phần phần mềm qua Internet, bạn có thể lưu chúng vào bộ nhớ đệm ở một vị trí trung tâm, vì lợi ích của nhiều người dùng trên nhiều máy chủ bằng cách lưu chúng vào bộ nhớ đệm.

  • Kiểm soát những thành phần lạ nào được đưa vào chuỗi xây dựng của bạn:Tập trung vị trí của các thành phần lạ, đảm bảo chúng được phê duyệt để sử dụng và cũng xác nhận rằng chúng không chứa mã độc.

  • Tách biệt những người có thể có quyền truy cập vào các tạo phẩm của bạn:Bạn có thể có những yêu cầu nghiêm ngặt hơn về những người có thể truy cập vào một số tạo phẩm trong tổ chức của bạn.

Trong bài viết này, tôi sẽ chỉ cho bạn cách tải xuống, cài đặt và định cấu hình phiên bản OSS của Nexus 3 bằng Playbook Ansible.

Nexus 3 sẽ chạy trên máy tính Orange PI 5 có 8 GB hoặc RAM, nhưng việc cung cấp này có thể được thực hiện trên bất kỳ máy nào có yêu cầu tối thiểu. Một phần của quá trình thiết lập sẽ bao gồm việc đặt proxy cho PyPI.org cho các máy được liệt kê trong tệp kho của tôi.

Bạn cần những gì để chạy mã từ hướng dẫn này

  1. Kết nối Internet để tải xuống mã nguồn cho Playbook Ansible, Nexus và mô-đun PIP

  2. Hai hoặc nhiều máy Linux (tôi đã sử dụng Debian, Armbian và Fedora IOT), có ít nhất 8 GB RAM. Cụm của tôi có sự kết hợp giữa Raspberry PI 4 và OrangePI 5.

  3. Bộ điều khiển Ansible sẽ chạy trên máy Fedora, nhưng bất kỳ máy chủ nào cũng có thể là bộ điều khiển. Hướng dẫn cài đặt Ansible rất dễ thực hiện.

Tổ chức Playbook

Tôi chia nhiệm vụ theo nhóm và kết quả là playbook trông như thế này:

[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

Bây giờ giải thích một chút nhé:

  • Có hai vai trò:'nexus' và 'khách hàng'. Vai trò Nexus được sử dụng để thiết lập phần mềm quản lý thành phần, trong khi vai trò khách hàng thiết lập cài đặt pip trên mọi máy.

  • Vars chứa các biến được sử dụng trên mỗi vai trò, được phân tách bằng các tệp để cách sử dụng chúng rõ ràng hơn

  • Chúng tôi có mật khẩu và quản lý chúng bằng tính năng Ansible vault.

  • Tệp ‘site.yaml’ Điều phối việc thực thi vai trò:

- 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

Bây giờ chúng ta hãy chuyển sang xem vũ trụ nơi playbook sẽ được thực thi.

Kho lưu trữ máy chủ

Trong trường hợp của tôi, nó khá đơn giản – tôi có hai nhóm chính:‘khách hàng’ và máy nơi máy chủ Nexus 3 sẽ chạy:

all:
 children:
 nexus_server:
 hosts:
 orangepi5.home:
 home_lab:
 hosts:
 dmaf5.home:
 raspberrypi.home:
 orangepi5.home:

Nhiệm vụ quan trọng tiếp theo là tải xuống và định cấu hình Nexus 3.

Cách cài đặt Nexus 3

Tệp main.yaml mô tả thứ tự và mục đích của từng tác vụ cài đặt cho Nexus role:

# 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

Trước tiên hãy xem tôi gọi “nhiệm vụ cốt lõi” là gì:

  1. Third_party.yaml:Tại đây, chúng tôi cài đặt OpenJDK8 (Nexus 3 được viết bằng Java) và logrotate để xử lý các nhật ký cũ.

  2. pre_install.yaml:Rất nhiều điều xảy ra ở đây, chẳng hạn như tạo các thư mục cần thiết cho Nexus, người dùng không có đặc quyền chuyên dụng sẽ chạy quy trình.

  3. download.yaml:Đúng như tên gọi, chúng tôi nhận được phiên bản mới của phần mềm Nexus 3 OSS và đảm bảo rằng nó có tổng kiểm tra phù hợp. Chúng tôi không muốn cài đặt phần mềm độc hại từ Internet.

Sau đó đến các nhiệm vụ thuộc “nhóm cài đặt tùy chỉnh”:

  1. install.yaml:Giải nén phần mềm, chuẩn bị đơn vị systemd để tự động khởi động phần mềm, thiết lập cài đặt JVM cho Nexus và triển khai cấu hình logrotate.

  2. post_install.yaml:Điều thú vị xảy ra ở đây – phần mềm đã được cài đặt và chúng tôi chạy nó lần đầu tiên. Chúng tôi cũng thay đổi mật khẩu mặc định bằng API REST để có thể chuyển sang giai đoạn tùy chỉnh.

  3. user.yaml:Tại đây, chúng tôi chuẩn bị cung cấp cho người dùng cuối quyền truy cập thích hợp vào các dịch vụ do Nexus cung cấp. Chúng tôi thực hiện việc này bằng cách sử dụng kết hợp mã máy khách REST-API và 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

Logic rất dễ thực hiện bằng cách sử dụng phương thức http 'PUT' mà bạn có thể biết đó là một thao tác sửa đổi (có nghĩa là các vai trò và người dùng hiện tại đã tồn tại). Việc phát hiện lỗi được thực hiện bằng cách lấy mã HTTP được Nexus trả về.

Bước tiếp theo là chuẩn bị proxy PyPi cục bộ của chúng tôi. Đây là một nhiệm vụ gồm nhiều bước và sẽ được mô tả chi tiết ở phần tiếp theo.

Cách thiết lập Proxy PyPI trên Nexus 3

Tệp cuối cùng về vai trò của Nexus 3 là ‘repositories.yaml’. Ở đây chúng ta thực hiện các bước sau:

  1. Kiểm tra xem proxy đã được thiết lập chưa (thao tác GET hoặc chỉ đọc)

  2. Nếu nó không tồn tại, hãy tạo một kho lưu trữ mới (phương thức POST với tải trọng JSON kèm theo các chi tiết để tạo toàn bộ kho lưu trữ mới)

Lưu ý rằng playbook này không cung cấp tùy chọn cập nhật cài đặt kho lưu trữ. Có thể thực hiện được với API REST, nhưng tôi sẽ để nó như một bài tập cho người đọc.

Các tác vụ chuẩn bị proxy PyPi được hiển thị bên dưới:

# 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

Chúng tôi gần như ở đó. Bây giờ, chúng tôi cần nói với khách hàng PyPi rằng chúng tôi nên sử dụng Nexus cục bộ chứ không phải trang PyPi trực tiếp để tải thư viện Python.

Cách thiết lập khách hàng

Vai trò của khách hàng đơn giản hơn nhiều và chỉ yêu cầu triển khai một mẫu cho pip.conf với đủ thông tin để buộc tìm kiếm trên kho lưu trữ mới của chúng tôi:

# 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

Tệp kết quả được triển khai trên ‘~/.config/pip/pip.conf ’ của mọi máy:

# 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

Tệp ở trên hiển thị ví dụ về phiên bản cuối cùng của tệp sẽ trông như thế nào sau khi được triển khai trên cụm của tôi (phiên bản của bạn sẽ khác với URL đã được giải quyết).

Bây giờ là lúc chạy toàn bộ cẩm nang và xem nó trông như thế nào.

Cách chạy Playbook

Để chạy playbook, chúng tôi chuyển một vài đối số:

  1. Vị trí kho lưu trữ máy chủ của chúng tôi

  2. Vị trí của tệp mật khẩu được mã hóa và tệp chính chứa mật khẩu chính để mở khóa nội dung của tệp được bảo vệ

  3. Và cuối cùng là vị trí của tệp playbook chính của chúng tôi

cd ansible
ansible-playbook --inventory inventories --extra-vars @vault/nexus_password.enc --vault-password-file $HOME/vault/ansible_vault_pass site.yaml

Triển khai Nexus 3 OSS trên Orange Pi 5 bằng Ansible:Hướng dẫn từng bước

Cách kiểm tra proxy PyPI mới

Để kiểm tra proxy mới, chúng tôi sẽ cài đặt Python Rich bằng pip và môi trường ảo.

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

Và sau đó chúng tôi có thể xác nhận rằng bộ đệm thực sự đã được sử dụng bằng cách xem các tạo phẩm mới trên kho lưu trữ mới:

Triển khai Nexus 3 OSS trên Orange Pi 5 bằng Ansible:Hướng dẫn từng bước

Xem các tạo phẩm PyPi

Hãy xem bản demo hoạt động của ứng dụng khách, cài đặt thứ khác:

Triển khai Nexus 3 OSS trên Orange Pi 5 bằng Ansible:Hướng dẫn từng bước

Tùy chỉnh thêm bằng cách sử dụng REST-API

Mỗi lần cài đặt Nexus đều cho phép bạn tải xuống tệp JSON mô tả API được máy chủ hỗ trợ. Ví dụ:trong máy chủ của tôi, bạn có thể lấy một bản sao như thế này từ máy chủ orangepi5.home của tôi:

curl --fail --remote-name http://orangepi5.home:8081/service/rest/swagger.json

Ngoài ra, giao diện người dùng cho phép bạn thử các điểm cuối API REST khác để tùy chỉnh cài đặt của bạn.

Triển khai Nexus 3 OSS trên Orange Pi 5 bằng Ansible:Hướng dẫn từng bước

Thử nghiệm API REST

Kết luận

Tôi khuyên bạn nên dành chút thời gian đọc sách Nexus 3 để làm quen với các tính năng mà công cụ này có thể cung cấp.

Cộng đồng đã chuẩn bị sẵn các trình cài đặt Debian và RPM nếu bạn cần loại thiết lập này thay vì sử dụng Ansible.

Nexus 3 có rất nhiều của các cài đặt có thể cấu hình. Chúng tôi chỉ bao gồm bề mặt ở đây. Trong khi chuẩn bị bài viết này, tôi đã tìm thấy 'kho lưu trữ ThoTeam Nexus3-oss' với một cẩm nang rất đầy đủ và cập nhật, nhưng nó phức tạp hơn nhiều so với bất kỳ thứ gì tôi yêu cầu cho phòng thí nghiệm tại nhà của mình.

Archiva là một trình quản lý tạo phẩm Nguồn mở khác, nó bị hạn chế hơn về chức năng nhưng cũng dễ thiết lập hơn.

Có một danh sách kiểm tra sau khi cài đặt với một số nhiệm vụ mà tôi không cần phải hoàn thành cho phòng thí nghiệm tại nhà của mình. Vui lòng kiểm tra để đảm bảo quá trình thiết lập của bạn đã hoàn tất.

Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu