yum에 대해서

개념

  • Yellowdog Update Modified의 약자
  • 레드햇 계열의 리눅스에서 사용하는 패키지 설치 관리 도구
  • rpm이 해결하지 못했던 패키지 의존성 문제를 해결한 스마트한 패키지 관리 툴
  • 패키지 의존성 문제를 자동으로 처리하면서 설치, 업데이트, 삭제를 진행 → Spring(=rpm)에서 안되던 dependency 주입을 Springboot(=yum)에서 해주는 느낌
  • 발음은 대부분 염이라고 한다..!

💡 패키지 의존성 이란?

더보기

A라는 패키지를 설치하려면 B 패키지를 먼저 설치해야 하는 것이다.

A라는 패키지를 B 패키지의 기능을 사용하도록 제작되었기 때문이다.

서로 여러 패키지들이 의존성을 갖게 되어 패키지 간의 의존 관계가 점점 복잡해지게 되고, 관리가 어려워지는 문제가 있다.

 

사용법

  • 필요한 패키지는 인터넷에 있는 패키지 저장소 서버로부터 다운로드 받기 때문에 인터넷에 연결된 상태여야 함
  • 패키지 저장소 서버는 /etc/yum.conf/etc/yum.repos.d/ 디렉토리의 저장소 파일을 통해 관리됨
# 사용 형식
yum [옵션] [명령] [패키지명]

# 설치
yum install 패키지명
yum -y install 패키지명  # y옵션을 사용하면 사용자에게 yes/no 여부를 묻지 않고 넘어감

# 업데이트 가능한 패키지 목록 확인
yum check-update

# 업데이트
yum update 패키지명

# 삭제
yum remove 패키지명

# 정보 확인
yum info 패키지명

# 패키지 list ghkrdls
yum list
yum list | grep 패키지명 # 원하는 패키지 목록만 확인

# 설치된 패키지 중 업데이트된 패키지 목록을 보고싶은 경우
yum list updates

# 설치 가능한 패키지 리스트
yum list available                                                                        

# 설치된 패키지 리스트
yum list installed

 

동작방식

  1. yum install로 패키지 설치 명령을 실행합니다.
  2. /etc/yum.repos.d/ 디렉토리의 여러 설정파일 및 CentOS-Base.repo 파일을 참고하여 인터넷 상의 패키지 저장소 서버 주소를 얻습니다.
  3. 패키지 목록을 저장소 서버로부터 얻습니다. 실제 패키지를 받는 것은 아니고 목록만 가져옵니다.
  4. 3번과 동일
  5. 가져온 패키지 목록을 터미널에 출력하고 설치할 것인지(y/n) 묻습니다.
  6. y를 입력하면 패키지를 다운로드하여 자동으로 설치합니다.

 

CentOS-Base.repo 설정 파일

패키지를 다운받는 패키지 저장소 서버는 /etc/yum.repos.d/CentOS-Base.repo 파일에 주소가 명시되어 있습니다.

 

아래 명령어로 파일을 열어봅니다.

vi /etc/yum.repos.d/CentOS-Base.repo

 

파일은 다음과 같은 구조입니다.

 

패키지 저장소

각 항목은 패키지 저장소의 위치를 나타냅니다.

[base], [updates], [extras]는 동작방식에 있는 원본 패키지, 업데이트 패키지, 추가 패키지입니다.

 

[base]

  • CentOS가 릴리즈 되는 시점에 제작된 버전의 패키지
  • 배포판을 처음 설치할때 같이 설치되는 패키지, DVD 이미지에 담겨있습니다.
 
[updates]
  • 이후 버그 수정이나 기능 수정 등으로 인해 업데이트 된 패키지
  • [updates] 항목에 URL을 설정할 수 있습니다.
  • yum은 패키지를 설치할 때 기본적으로 [base] 저장소가 아닌 [updates] 저장소를 이용하며, 이 항목을 주석처리하게 되면 yum 명령어로 패키지를 설치할때 업데이트 버전을 설치하는 것이 아닌 원본패키지 저장소의 패키지를 설치하게 됩니다.
 
[extras], [centosplus]
  • 추가로 배포된 패키지인 추가패키지 저장소 설정은 [extras] 항목에서 관리
  • [centosplus] 항목이 있지만 기본적으로 enabled=0 으로 설정이 꺼져있고 사용되지 않습니다.

 

CentOS-Base.repo 설정 구성

  • name : 저장소의 이름을 명시한 것이며, 아무렇게나 지정해도 상관없습니다.
  • mirrorlist : baseurl 속성의 값이 생략된 경우 이곳에 명시된 URL을 사용합니다. 기본적으로 CentOS 프로젝트에서 운영하는 공식 서버 URL이 지정 되어 있습니다.
  • baseurl : 패키지 저장소의 url이며, http://, ftp://, file:// 프로토콜 스킴을 사용할 수 있습니다.
  • gpgcheck : GPG(GNU Privacy Guard) 키가 들어있는 저장소의 URL을 적습니다. GPG 키는 rpm 패키지를 인증하는데 사용하는 암호화 서명입니다.
  • enabled : 이 저장소 설정 여부를 사용할것인지 여부를 지정합니다. 기본값은 1이며 1 = 사용, 0 = 미사용 입니다.
 

🔜 더 알아볼 내용

  • RPM
  • epel
 
 

참고

https://dololak.tistory.com/331

https://dololak.tistory.com/332

분명 설치 잘 돼서 데이터 입출력까지 하고, 다시 켰는데

mysql --version 도 안되고 그냥 mysql 커맨드가 다 안 됐다.

 

에러는 Error - bash: mysql: command not found 라고 났다.

 

뭐지 싶어서 구글링 엄청 했는데

검색했을 때 보통 PATH에 추가하라고 나오는 경로가 있는데

나는 mysql이 설치된 경로가 달라서 맞지 않았다.

 

이런 경우 본인의 mysql이 어느 경로에 설치되어 있는지 확인해보는걸 추천한다.

 

참고) PATH에 넣을 경로는 my.cnf 에 basedir 경로에 bin만 추가한 것과 같다.

 

🧐 압축파일로 설치했을 때만 문제가 있었고, yum으로 설치한거는 따로 설정없이도 잘 동작했다. 왜일까?


⭐️ 이 과정을 거쳐야 mysql 커맨드를 사용할 수 있습니다. ⭐️

예) mysql --version , mysql -u [사용자이름] -p

 

1. /etc/profile 수정하기

#pwd 했을 때 / 인 상태에서
sudo vi /etc/profile

2. GG 이용해서 파일 맨 끝으로 가서 추가하고 저장하기(:wp)

export PATH="$PATH:/home/centos/mysql/bin"

3. 변경된 파일 적용하기

source /etc/profile

4. 결과

잘 되는 것을 확인할 수 있다!

 

 

Ansible과 Vagrant는 둘 다 구성 관리 및 자동화에 사용할 수 있는 도구이지만 사용 사례 및 작동 방식 측면에서 몇 가지 주요 차이점이 있습니다.

 

Ansible

서버 및 기타 네트워크 장치를 관리하고 구성하는 데 사용할 수 있는 Python 기반의 구성 관리 및 자동화 도구

간단하게 말하면 네트워크 자동화 시스템

코드로 인프라를 구축하기 때문에 IaC(Infrastructure as Code)라고 불리기도 함

특징

  • yaml 형식의 playbook를 사용해서 이해하기 쉽고 러닝 커브가 낮음
  • 어 시스템이 구성 변경 사항을 대상 시스템으로 푸시하는 푸시 기반 아키텍처를 사용
  • 소프트웨어 설치, 사용자 및 그룹 관리, 서비스 설정 및 구성과 같은 작업을 자동화하는 데 사용
  • 비슷한 도구 : Chef, Puppet

장점

  • 에이전트가 없음. 즉, 대상 머신에 소프트웨어를 설치할 필요가 없으며 대상 머신에서 작동하려면 SSH 및 Python만 필요
  • 오픈 소스 및 벤더 지원을 제공하는 대규모 커뮤니티 있음

단점

  • 많은 양의 정보를 수집할 때 속도가 느려질 수 있다. (이때문에 Nornir가 개발됨)

 

✅  공식문서

https://www.redhat.com/ko/technologies/management/ansible/what-is-ansible

 

Ansible이란? 개념, 작동 방식, 앤서블 설치, 앤서블 플레이북

Ansible은 오픈소스 IT 자동화 툴입니다. 프로비저닝, 구성 관리, 애플리케이션 배포, 오케스트레이션, 기타 여러 가지 수동 IT 업무 프로세스를 자동화하여 공유합니다.

www.redhat.com

 

Vagrant

가상 개발 환경을 구축하고 관리하기 위한 Ruby 기반 도구

소규모 VM 세트를 일관된 생성을 자동화하는데 자주 사용되는 도구

프로비저닝(Provisioning) 도구라고 하기도 함

특징

  • 생성하려는 가상 환경을 설명하는 구성 파일인 Vagrantfile을 사용
  • 가상 머신이 제어 머신에서 구성을 가져오는 풀 기반 아키텍처를 사용
  • 개발 및 테스트 목적으로 사용할 수 있는 가상 머신을 만들고 구성하는 데 사용
  • Virtualbox, VMware 또는 Hyper-V와 같은 다양한 가상화 소프트웨어와 함께 작동
  • 재현 가능하고 이식 가능한 개발 환경을 만드는 데 사용

장점

  • 개발 및 테스트를 위한 표준 환경을 쉽게 만들 수 있다.
  • 프로덕션 환경과 일치하는 가상 환경을 생성하여 코드를 더 쉽게 테스트하고 디버그할 수 있다.
  • 개발 환경을 다른 사람과 쉽게 공유할 수 있어서 프로젝트에서 더 쉽게 협업할 수 있다.

단점

  • 인프라 변경에는 적합하지 않다.

Vagrant를 왜 사용할까?

Vagrant를 사용하지 않는다면

버추얼박스에서 각각의 개별 가상머신을 생성하고 한대씩 설정을 해줘야 합니다.

 

Vagrant를 사용하면

Vagrantfile에서 가상머신에 대한 설정과 세팅을 미리 해놓을 수 있어

Provisioning 할 수 있습니다.

 

💡 Provisioning 이란?

더보기

사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해두는 것

 

예) CentOS를 설치할 때, 설치가 완료된 후에 ip 등 설정을 하게 되는데, 베이그런트를 사용하면 설치할 때 자동으로 정보 다 가져가서 한번에 세팅까지 해줌. 즉, 쉽게 프로비져닝이 됨.

 

✅  공식문서

https://developer.hashicorp.com/vagrant/downloads

 

Install | Vagrant | HashiCorp Developer

Explore Vagrant product documentation, tutorials, and examples.

developer.hashicorp.com

 

정리

분류를 해보자면 Ansible은 "서버 구성 및 자동화", Vagrant는 "가상 머신 관리" 입니다.

 

Ansible은 서버 및 기타 네트워크 장치의 구성 및 관리를 자동화하는 데 사용할 수 있는 도구인 반면 Vagrant는 가상 개발 환경을 구축하고 관리하는 도구입니다. 또한 서로를 보완할 수 있으며 Ansible을 사용하여 기본 이미지를 프로비저닝할 수 있고 Vagrant를 사용하여 해당 이미지 위에서 테스트 및 개발할 수 있습니다.

 

Ansible과 Vagrant는 다른 분류여서 두개를 왜 비교를 하지? 할수도 있지만, 인프라 공부를 하면서 두 개념이 어떤 특징이 있고 어느 상황에서 쓰는건지 확실히 알고 싶어서 정리를 해보았습니다 😊

 

 

🔜 더 알아볼 내용

  • Terraform

 

 

참고

https://junior-developer.tistory.com/73

https://ganbarujoy.tistory.com/27

https://www.daddyprogrammer.org/post/7369/ansible-vagrant/

https://www.techtarget.com/searchnetworking/tip/Ansible-vs-Terraform-vs-Vagrant-Whats-the-difference

시나리오

client1 인스턴스에서 공개키(id_rsa.pub)를 생성하고, host 인스턴스로 보낸다.

받은 공개키 내용을 host 인스턴스에 등록한다.

 

왜?

기존에 비밀번호를 네트워크를 통해 보내는 비밀번호 인증은 네트워크 상에서 ID/비밀번호가 그대로 노출되는 문제가 있고, 접속할 때마다 입력해야 하는 번거로움이 있다.
SSH 키는 이와 달리 공개키 암호 방식을 사용하여 서버에서 인증받을 수 있으며, 암호를 생략하고 원격 호스트로 접속할 수 있다.

 

실습 환경

  • client1 인스턴스 : CentOS 7.9
  • host 인스턴스 : CentOS 7.9

 

준비할 항목

1. client1에서 실행

sudo vi /etc/ssh/sshd_config
  • PubkeyAuthentication yes
  • PasswordAuthentication yes

 

2. 보안그룹 설정

  • client1의 플로팅 IP를 수신으로 등록한다.

 

과정

1. client1에서 실행해서 Key Pair 생성

ssh-keygen

# default 설정
# ssh-keygen -t rsa 3072

# 공개키 암호화 알고리즘을 명시하고자 하는 경우
# ssh-keygen -t rsa

# 키 크기(bit)를 명시하고자 하는 경우
# ssh-keygen -t rsa -b 2048

 

2. Key Pair 생성됐는지 확인

파일명 설명 저장 위치 비고
id_rsa 개인키 client1(Local) 철저한 보안 관리 필요
id_rsa.pub 공개키 host(Remote) 외부에 공개해도 상관 없음

 

 

3. client1에 있는 파일 권한 변경

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub  
chmod 644 ~/.ssh/known_hosts

 

4. client1에서 실행

scp ~/.ssh/id_rsa.pub [host id]@[host fixed ip]:id_rsa.pub

 

5. host에서 client1로부터 받은 id_rsa.pub 내용 복사

 

6. 5번에서 복사한 내용을 host의 ~/.ssh/authorized_keys에 복사 (여러 공개키는 줄바꿈으로 구분)

 

결과

client1에서 host로 SSH 접속을 시도한다.

ssh [host id]@[host fixed ip]

더 이상 비밀번호를 묻지 않아 편리한 서버 작업이 가능하다!

 

 

 

 

참고

https://blog.radia.me/%EA%B3%B5%EA%B0%9C%ED%82%A4-%EA%B8%B0%EB%B0%98-ssh-%EC%A0%91%EC%86%8D-%EB%B0%A9%EB%B2%95/

https://opentutorials.org/module/432/3742

https://www.cubrid.com/blog/3825015

Ansible은 서버 및 기타 네트워크 장치를 관리하고 구성하는 데 사용할 수 있는 구성 관리 및 자동화 도구입니다.

 

특징

  1. 소프트웨어 설치,사용자 및 그룹 관리, 서비스 설정 및 구성과 같은 작업을 자동화하는 데 사용할 수 있습니다.
  2. 일관되고 자동화된 방식으로 많은 수의 서버 및 기타 리소스를 관리하고 구성하는 데 사용할 수 있는 클라우드 환경에서 사용하기에 특히 적합합니다.
  3. YAML이라는 간단하고 읽기 쉬운 언어를 사용하며 제어 시스템이 구성 변경 사항을 대상 시스템으로 푸시하는 푸시 기반 아키텍처를 사용합니다.
  4. 에이전트가 없습니다. 즉, 대상 머신에 소프트웨어를 설치할 필요가 없으며 대상 머신에서 작동하려면 SSH 및 Python만 필요합니다.

 

사용 예시

Ansible은 다음과 같은 작업에 사용할 수 있습니다.

  • 다수의 서버에 소프트웨어 설치
  • Nginx, MySQL 및 Apache와 같은 서비스 구성
  • 관리 사용자 및 그룹 생성
  • 관리 방화벽 규칙 생성
  • 관리 클라우드 리소스(예: Amazon EC2 인스턴스) 관리
  • 프로비저닝 지속적인 배포 파이프라인

 

정리

Ansible 서버 기타 네트워크 장치 관리와 관련된 많은 작업을 자동화하는 사용할 있는 도구입니다특히 클라우드 환경에서 사용하기에 적합하며 단순하고 사람이 읽을 있는 언어 덕분에 사용하기 쉽습니다.

#!

sharp(#) + bang(!)의 합성어, shebang이라 한다.

  • 2byte의 매직 넘버(magic number)로 이 자체가 하나의 기호
  • 스크립트를 실행시킬 프로그램의 경로를 지정하는 역할
  • 이 뒤에 나오는 것은 경로명, 명령어들을 해석할 프로그램의 위치를 나타냄
  • 경로가 정확하지 않다면 bad interpreter 발생
  • 다른 인터프리터를 지정하면 문법 오류 발생

문법

#!<interpreter> [optional-arg]

#! 뒤에 공백이 하나 있어도 동작
<interpreter>에는 프로그램의 절대경로 입력

예시

#!/bin/sh
#!/bin/bash
#!/usr/bin/php
#!/usr/bin/python -O
#!/usr/bin/env bash

#!/usr/bin/env

  • interpreter에 들어갈 프로그램의 절대 경로는 시스템에 따라 달라질 수 있다.
    ex) 파이썬을 예로 들면 /bin/local/python 또는 /usr/bin/python에 위치할 수도 있고
    버전도 python2와 python3이 둘다 설치되어 있을수 있다.
  • 이럴 때 #!/usr/bin/env로 설정하면 절대경로에 상관없이 인터프리터의 위치를 찾아서 살행
    • env는 사용자의 $PATH(환경변수)에서 첫번째로 찾은 명령를 찾아서 실행됨
    • 다양한 환경에서 실행되는 스크립트라면 env 사용하기

예시

# 환경 변수 정보 출력
env

# 환경 변수 정보 변경
env -i HOSTNAME=test.com

# 환경 변수 정보 변경
env -u HOSTNAME

# env 이용한 bash 실행하기
/usr/bin/env bash --version

테스트

1. vi test 파일 작성

#!/usr/bin/env bash

echo "Hello, This is Bash"

2. 실행 권한 추가하고 실행

# 권한 추가
$ chmod +x test

# 실행
$ ./test
Hello This is Bash

3. 다시 파일을 열고 인터프리터를 파이썬으로 지정

#! /usr/bin/env python

echo "Hello This is Bash"

4. 파이썬 문법에 맞지 않아 오류 발생

$ ./test
File "./test", line 3
echo "Hello This is Bash"
^
SyntaxError: invalid syntax

5. 파일 열고 파이썬 문법으로 수정

#! /usr/bin/env python

print "Hello This is Python"

6. 파일 실행하면 정상적으로 작동함

$ ./test
Hello This is Python

 

참고

https://blog.gaerae.com/2015/10/what-is-the-preferred-bash-shebang.html

https://bcp0109.tistory.com/343

https://ingorae.tistory.com/365

✅ 공식문서

인스턴스 생성 과정

  1. 조직 생성 (그룹의 개념, 프로젝트를 여러개 소유할 수 있음)
  2. 프로젝트 생성
  3. 서비스 추가
  4. Compute > Instance > + 인스턴스 생성
  5. 이미지 설정
    1. 이미지 종류(CentOS, Ubuntu, Windows 등), 최소 블록 스토리지(저장공간 크기), 비트
  6. 인스턴스 정보 설정
    • 인스턴스 이름, 타입(리소스 사양) 수, 키 페어(ssh -i [키페어파일] [OS]@[IP])
  7. 네트워크
  8. 플로팅 IP (외부에서 접근 가능할 수 있게 만든 IP, 해당 설정을 해야 외부에서 접근 가능)
  9. 보안 그룹 (인스턴스에 port를 오픈해주는 역할, ssh는 22번 포트이므로 외부에서 접근 시 22번 포트를 오픈해야 접근 가능)

테스트용 인스턴스 정보

  • 이미지 : CentOS 7.9
  • 인스턴스 정보
    • 이름 : mj-test
    • 타입 : m2, 4core, 8gb
    • 수 : 1개
    • 키페어 이름 : mj-keypair3
  • 블록 스토리지
    • 타입 : HDD
    • 크기 : 40gb
  • 네트워크 : 플로팅 IP 설정
  • 보안그룹 : JMJ

인스턴스 접속 방법

  • 외부에서 인스턴스에 접속할 수 있게 플로팅 IP 설정 필요
    • '플로팅 IP 관리' 메뉴에서 설정
  • 터미널에서 ssh로 접속하는 방법
$ ssh -i [키페어파일] [OS]@[플로팅 IP]
  • 접속 정보에 있는 커맨드를 복사할 수도 있음
  • 보안그룹 설정
    • 해당 인스턴스의 '네트워크' 메뉴 or Network > Security Groups 에서 보안 규칙 생성
    • TCP, 포트 22(SSH), 자신의 IP 주소/22를 입력 후 저장
    • 주의) 수신 0.0.0.0 허용 은 추가하면 안됨 -> 보안 상 문제
    • IP 주소 확인 : https://www.whatsmyip.org/more-info-about-you/
  • 포트 열려있는지 확인할 때
    • 특정 포트로 접근 시도해서 타임아웃 유무 확인
telnet xxx.xxx.xxx.xxx 22

nc -v -z host.docker.internal 4505
nc -v -z host.docker.internal 4506

nmap -sS -q -p 4505-4506 host.docker.internal

- telnet 말고도 nc나 nmap로도 포트 열려있는지 체크 가능

 

 

참고

https://base-on.tistory.com/449?category=939974

+ Recent posts