Computer >> 컴퓨터 >  >> 시스템 >> Mac

Ansible을 사용하여 Orange Pi 5에 Nexus 3 OSS 배포:단계별 가이드

Ansible을 사용하여 Orange Pi 5에 Nexus 3 OSS 배포:단계별 가이드

Nexus 3 OSS는 컨테이너 이미지, Python PIP, Java jar 등과 같은 다양한 형식을 처리할 수 있는 오픈 소스 아티팩트 저장소 관리자입니다.

온프레미스 아티팩트 관리자가 있는 이유는 무엇입니까? 그 이유는 다양합니다:

  • 개인 인프라를 사용하세요. 보호해야 할 독점 코드가 있을 수 있습니다.

  • 더욱 빨라진 아티팩트 다운로드 속도:인터넷을 통해 동일한 아티팩트를 지속적으로 다운로드하는 경우 이를 중앙 위치에 캐시하여 여러 서버에 있는 여러 사용자가 캐시할 수 있도록 할 수 있습니다.

  • 빌드 체인에 포함되는 아티팩트를 제어하세요. 아티팩트의 위치를 중앙 집중화하고, 사용이 승인되었는지 확인하고, 악성 코드가 포함되어 있지 않은지 확인하세요.

  • 아티팩트에 액세스할 수 있는 사람을 분리하세요. 조직 내에서 일부 아티팩트에 액세스할 수 있는 사람에 대해 더 엄격한 요구 사항이 있을 수 있습니다.

이 기사에서는 Ansible 플레이북을 사용하여 Nexus 3의 OSS 버전을 다운로드, 설치 및 구성하는 방법을 보여 드리겠습니다.

Nexus 3는 8GB 또는 RAM이 있는 Orange PI 5 컴퓨터에서 실행되지만 이 프로비저닝은 최소 요구 사항이 있는 모든 컴퓨터에서 수행할 수 있습니다. 설정의 일부는 내 인벤토리 파일에 나열된 컴퓨터에 대해 PyPI.org에 대한 프록시를 설정하는 것으로 구성됩니다.

이 튜토리얼의 코드를 실행하는 데 필요한 것

  1. Ansible 플레이북, Nexus 및 PIP 모듈의 소스 코드를 다운로드하기 위한 인터넷 연결

  2. 최소 8GB RAM을 갖춘 두 대 이상의 Linux 시스템(저는 Debian, Armbian 및 Fedora IOT를 사용했습니다). 내 클러스터에는 Raspberry PI 4와 OrangePI 5가 혼합되어 있습니다.

  3. Ansible 컨트롤러는 Fedora 시스템에서 실행되지만 모든 서버가 컨트롤러가 될 수 있습니다. Ansible 설치 지침은 따라하기 쉽습니다.

플레이북 구성

작업을 그룹으로 나누었고 결과 플레이북은 다음과 같습니다:

[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

이제 조금 설명하겠습니다:

  • '넥서스'와 '클라이언트'라는 두 가지 역할이 있습니다. 넥서스 역할은 아티팩트 관리 소프트웨어를 설정하는 데 사용되는 반면, 클라이언트 역할은 모든 시스템의 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

이제 플레이북이 실행될 세계관을 살펴보겠습니다.

호스트 인벤토리

내 경우에는 매우 간단합니다. '클라이언트'라는 두 개의 주요 그룹과 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

먼저 제가 "핵심 작업"이라고 부르는 것이 무엇인지 살펴보겠습니다.

  1. third_party.yaml:여기에 OpenJDK8(Nexus 3은 Java로 작성됨)을 설치하고 오래된 로그를 처리하기 위해 logrotate를 설치합니다.

  2. pre_install.yaml:여기서는 프로세스를 실행할 권한이 없는 전용 사용자인 nexus에 필요한 디렉토리를 생성하는 등 많은 일이 발생합니다.

  3. download.yaml:이름에서 알 수 있듯이 Nexus 3 OSS 소프트웨어의 최신 버전을 받고 올바른 체크섬이 있는지 확인합니다. 우리는 인터넷에서 악성 코드를 설치하고 싶지 않습니다.

그런 다음 "맞춤형 설치 그룹"에 속하는 작업을 수행하십시오:

  1. install.yaml:소프트웨어 압축을 풀고, 시스템 장치가 자동으로 시작되도록 준비하고, Nexus용 JVM 설정을 설정하고, logrotate 구성을 배포합니다.

  2. post_install.yaml:여기에서 흥미로운 일이 발생합니다. 소프트웨어가 설치되고 처음으로 실행됩니다. REST API를 이용하여 기본 비밀번호도 변경하므로 맞춤화 단계로 넘어갈 수 있습니다.

  3. 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

로직은 따르기 쉽습니다. 'PUT' http 메소드를 사용하면 수정 작업임을 알 수 있습니다(기존 역할과 사용자가 이미 존재함을 의미). 오류 감지는 Nexus에서 반환된 HTTP 코드를 가져와 수행됩니다.

다음 단계는 로컬 PyPi 프록시를 준비하는 것입니다. 이는 다단계 작업이므로 다음에 자세히 설명하겠습니다.

Nexus 3에서 PyPI 프록시를 설정하는 방법

Nexus 3 역할의 마지막 파일은 'repositories.yaml'입니다. 여기서는 다음 단계를 수행합니다:

  1. 프록시가 이미 설정되어 있는지 확인하세요(GET 또는 읽기 전용 작업)

  2. 존재하지 않는 경우 새로 만듭니다(완전히 새로운 저장소를 만드는 세부 정보가 포함된 JSON 페이로드가 포함된 POST 메서드)

이 플레이북은 저장소 설정을 업데이트하는 옵션을 제공하지 않습니다. 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

우리는 거의 다 왔습니다. 이제 우리는 Python 라이브러리를 얻기 위해 직접 PyPi 사이트가 아닌 로컬 Nexus를 사용해야 한다고 PyPi 클라이언트에게 알려야 합니다.

클라이언트 설정 방법

클라이언트 역할은 훨씬 간단하며 새 저장소에서 검색을 수행할 수 있는 충분한 정보가 포함된 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에 따라 사용자 버전이 달라짐).

이제 전체 플레이북을 실행하고 그 모양을 확인할 차례입니다.

플레이북 실행 방법

플레이북을 실행하기 위해 몇 가지 인수를 전달합니다:

  1. 호스트 인벤토리의 위치

  2. 암호화된 비밀번호 파일의 위치와 보호된 파일의 콘텐츠를 잠금 해제하기 위한 마스터 비밀번호가 포함된 마스터 파일

  3. 마지막으로 메인 플레이북 파일의 위치입니다

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

Ansible을 사용하여 Orange Pi 5에 Nexus 3 OSS 배포:단계별 가이드

새로운 PyPI 프록시를 테스트하는 방법

새로운 프록시를 테스트하기 위해 pip와 가상 환경을 사용하여 Python Rich를 설치하겠습니다.

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

그런 다음 새 저장소에서 새 아티팩트를 확인하여 캐시가 실제로 사용되었는지 확인할 수 있습니다.

Ansible을 사용하여 Orange Pi 5에 Nexus 3 OSS 배포:단계별 가이드

PyPi 아티팩트 보기

다른 것을 설치하여 클라이언트가 작동하는 데모를 살펴보겠습니다.

Ansible을 사용하여 Orange Pi 5에 Nexus 3 OSS 배포:단계별 가이드

REST-API를 사용한 추가 사용자 정의

모든 Nexus 설치를 통해 서버에서 지원하는 API를 설명하는 JSON 파일을 다운로드할 수 있습니다. 예를 들어 내 서버에서는 orangepi5.home 서버에서 다음과 같은 복사본을 얻을 수 있습니다.

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

또한 UI를 통해 다른 REST API 엔드포인트를 사용해 설치를 맞춤 설정할 수 있습니다.

Ansible을 사용하여 Orange Pi 5에 Nexus 3 OSS 배포:단계별 가이드

REST API 테스트

결론

이 도구가 제공할 수 있는 기능을 익히려면 시간을 내어 Nexus 3 책을 읽어 보시기 바랍니다.

Ansible을 사용하는 대신 이러한 종류의 설정이 필요한 경우 커뮤니티에서는 Debian 및 RPM 설치 프로그램을 준비했습니다.

Nexus 3에는 많은 기능이 있습니다 구성 가능한 설정 중 여기서는 표면만 다루었습니다. 이 기사를 준비하는 동안 나는 매우 완벽하고 최신의 플레이북이 포함된 'ThoTeam Nexus3-oss 저장소'를 발견했지만 그것은 내 홈 랩에 필요한 것보다 훨씬 더 복잡했습니다.

Archiva는 또 다른 오픈 소스 아티팩트 관리자로, 기능이 더 제한되어 있지만 설정도 더 간단합니다.

홈 랩에서 완료할 필요가 없는 일부 작업이 포함된 설치 후 체크리스트가 있습니다. 설정이 완료되었는지 확인하시기 바랍니다.

무료로 코딩을 배우세요. freeCodeCamp의 오픈 소스 커리큘럼은 40,000명 이상의 사람들이 개발자로 취업하는 데 도움을 주었습니다. 시작하세요