본문 바로가기
Development(Web, Server, Cloud)/22) LINUX - Cloud

클라우드 74일차(정리중, gitlab)

by tonyhan18 2022. 5. 10.
728x90

구성은 위와같이 ansible-server에 전체 노드들을 연결해서 관리할 예정이다.

 

그럼 ansible을 통해 설치할 것들을 전달하게 될 것이다.

이 부분들은 관리영역(ops, 엔지니어)이다.

 

개발자 입장에서는 바깥쪽에서 ansible-server에 code를 던지게 된다. 개발자는 기존에 github에 코드를 던지어 업데이트를 진행했는데 github는 설치형이 아닌 서비스(호스팅)이다. 그래서 서비스가 이미 준비된 상태에서 서비스를 제공받는 상태이다.

 

그런데 우리는 사설 공간에다가 github와 비슷한 얘를 두고 개발을 하려면 어떻게 해야 할까? 이때 gitlab을 쓸 수 있게 된다. gitlab은 설치형/호스팅 형이 존재한다. 그래서 gitlab을 설치해놓으면 개발자는 여기에 코드를 던지기만 하면 ansible에서 자동으로 알아서 배포가 되도록 해주자.

결국 ansible과 gitlab을 이용해서 배포를 하는 과정까지를 테스트 해보자

 

확인사항

1. virsh list --all 했을 때 아무것도 없어야 함

  vagrant destroy --force 해서 지울 것

2. kvm 자체 주소가 211.183.3.77이 맞는지 여부

```

yum -y install net-tools ; ifconfig

```

 

3. ifconfig 를 했을 때, ens32, eth0, br0가 있는지 여부

  1) br0 : 211.183.3.77, eth0: none

  2) eth0 : 211.183.3.77

  3) ens32 : 211.183.3.77

나는 첫번째의 경우인데

우리는 이렇게 만들려고 하는 것이다.

 

eth0가 있고 sw를 통해서 211.183.3.1로 할당된 개발자 pc와 eth0가 연결되어 내부의 br0의 211.183.3.77이 vlan1(관리용 lan)로 연결되어 있는 것이다. 또 이 내부에서 생성되는 포트들은 vlan1에 연결되어 가상머신들이 연결되게 된다.

결국 개발자 pc까지도 vlan1에 연결된걸로 취급된다.

그래서 각 가상머신들을 211.183.3. 대역을 사용해주면 된다.

실재로 우리도 .200(ansible-server, gitlab), .201-.203(ansible-node1 ~ 3)

 

이제 개발자는 gitlab이 설치된 ansible-server로 업로드만 해주면 된다.

 

이제 gitlab에서는 자동으로 테스트하고 빌딩해서 배포까지 수행한다.

 

 

이렇게 넣어주면 된다.

 

```

grub2-mkconfig -o /boot/grub2/grub.cfg

```

다 했으면 이걸 부팅시에 적용해달라는 명령을 넣어주어야 한다.

 

마지막으로

방화벽, 로드밸런서, 서버 어디에서든 트래픽을 보통 3가지로 구분한다.

1. transit(forward)

2. terminated

3. originated

 

중간에 멈추는건 존재하지 않는다.

암튼 이 상황에서 kvm이 있고 위에 vm이 올라가게 된다. 외부에서 내부로 들어오기 위해서는 forward 기능이 반드시 활성화 되어 있어야 한다.

 

5. forwarding 트래픽을 활성화 하는 방법

1) 임시 (휘발성)

```

  echo "1" > /proc/sys/net/ipv4/ip_forward

```

2) 영구적 (비휘발성)

```

  vi /etc/sysctl.conf

  net.ipv4.ip_forward=1

```

이 내용을 추가해놓기

 

????

이제 vm은 qemu-kvm을 통과해서 kvm과 통신을 하는 구조가 된다.

????

 

인프라 환경을 오케스트레이션 할 수 있는 도구들

1. vagrant <- ruby

2. cloudformation @ aws <- yaml

3. heat @ openstack <- yaml

 

이제 우리만의 폴더에 가서 vagrant init 해주자

 

만들어진 Vagrantfile 안으로 들어가서 내용을 작성해주자.

Vagrant 는 vagrant ssh를 통해 가상머신과의 ssh 연결을 위한 기본 인터페이스가 제공된다. 이 인터페이스는 삭제하지 않는 것이 좋다.

인터넷 연결을 위한 인터페이스 이름은 public_network 이고

가상머신들간의 연결을 위한 사설 네트워크는 이름이 private_network이다.

이는 변수명이므로 임의대로 할당해서는 안된다.

(* 선언 방식을 다양하게 보여주기 위해서 public과 private을 다르게 표현해서 나타내었다)

 

# -*- mode: ruby -*-
# vi: set ft=ruby :

##### ANSIBLE NODE #####
Vagrant.configure("2") do |config|
  config.vm.define "node1" do |cfg|
    cfg.vm.box = "centos/7"
    cfg.vm.host_name = "node1"
    cfg.vm.network :public_network, type: "bridge", dev: "br0", mode: "bridge", network_name: "public", ip: "211.183.3.201"
    cfg.vm.network "private_network", ip: "172.16.1.201"
    cfg.vm.network "forwarded_port", guest: 22, host: 60001, auto_correct: true, id: "ssh"
  end
  config.vm.define "node2" do |cfg|
    cfg.vm.box = "centos/7"
    cfg.vm.host_name = "node2"
    cfg.vm.network :public_network, type: "bridge", dev: "br0", mode: "bridge", network_name: "public", ip: "211.183.3.202"
    cfg.vm.network "private_network", ip: "172.16.1.202"
    cfg.vm.network "forwarded_port", guest: 22, host: 60002, auto_correct: true, id: "ssh"
  end
  config.vm.define "node3" do |cfg|
    cfg.vm.box = "centos/7"
    cfg.vm.host_name = "node3"
    cfg.vm.network :public_network, type: "bridge", dev: "br0", mode: "bridge", network_name: "public", ip: "211.183.3.203"
    cfg.vm.network "private_network", ip: "172.16.1.203"
    cfg.vm.network "forwarded_port", guest: 22, host: 60003, auto_correct: true, id: "ssh"
  end
  config.vm.define "server" do |cfg|
    cfg.vm.box = "centos/7"
    cfg.vm.host_name = "server"
    cfg.vm.network :public_network, type: "bridge", dev: "br0", mode: "bridge", network_name: "public", ip: "211.183.3.200"
    cfg.vm.network "private_network", ip: "172.16.1.200"
    cfg.vm.network "forwarded_port", guest: 22, host: 60000, auto_correct: true, id: "ssh"
    cfg.vm.provider :libvirt do |resource|
      resource.memory = 2048
      resource.cpus = 2
    end
  end
end

최종적으로 이렇게 만들어주었다.

```

vagrant up

```

 

autostart까지 해놓자

 

8. server 에서 public 키를 확인하고 별도의 파일로 저장한 뒤 이를 각 노드에 전달한다. server에서는 key-scan을 진행하고 각 노드로 접속시에는 자신의 개인키로 접속한다.

```

ssh-keygen -q -f ~/.ssh/id_rsa -N ""

```

이제 id_rsa.pub 내용을 복사만 해놓자

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzLaQwMirhC5HJhvRZs1Ff3+fJ32lfu/u4iC6GnJOdzQWifKzPpMrm59fj85/31rr3qxlR7f/zN+g17muBZvaBgSJdPCNkW3rdPviumH4DDaYR4OQBHlKdSsx8Y1oMjdoOXn6N56HKI6Xldc5vi27ARzXnYegvymEXyVEqdk8pBRNRos8aSnN5zHCtHOBSXctODjWdSZRL+45zEy1QhOR85+VNvGYDpcp4vpXVAJDINPiyfd7eugKlIVqXxdhopP77foI2WCeW9aGg9+1zevBkTrmnsADIWEJaN866tBpMuACeBoDFGjSxxvTA9hKjiMzllhANnvA5lt9aRwaORaLp vagrant@server

 

잠시 뒤, .ssh 아래에 있는 id_rsa.pub는 퍼블릭 키이므로 이를 각 노드의 .ssh/authorized_keys로 저장시키고 server에서는 id_rsa (개인키)로 접속할 수 있도록 ssh 연결시마다 -i 로 개인키 위치를 지정할 필요 없도록 /etc/ssh/ssh_config 에 다음과 같은 설정을 입력한다. 바로 키를 매번 입력하지 않도록 하기 위한 설정이다.

 

 

```

sudo vi /etc/ssh/ssh_config

 

# 이 부분을 맨 아래에 추가해주자

Host *
        User vagrant
        IdentityFile ~/.ssh/id_rsa

```

 

이제 가상머신에서 나와서 파일을 만들고 pub 키 값을 복붙해주자

```

exit

vi pkey.txt

```

이 키값을 프로비전을 통해 전체에 배포해주어야 한다.

 

# -*- mode: ruby -*-
# vi: set ft=ruby :

##### ANSIBLE NODE #####
Vagrant.configure("2") do |config|
  config.vm.define "node1" do |cfg|
    cfg.vm.box = "centos/7"
    cfg.vm.host_name = "node1"
    cfg.vm.network :public_network, type: "bridge", dev: "br0", mode: "bridge", network_name: "public", ip: "211.183.3.201"
    cfg.vm.network "private_network", ip: "172.16.1.201"
    cfg.vm.network "forwarded_port", guest: 22, host: 60001, auto_correct: true, id: "ssh"
    cfg.vm.provision "file", source: "pkey.txt", destination: "pkey.txt"
    cfg.vm.provision "shell", inline: "cat pkey.txt >> /home/vagrant/.ssh/authorized_keys"
    cfg.vm.provision "shell", inline: "systemctl restart sshd"
  end
  config.vm.define "node2" do |cfg|
    cfg.vm.box = "centos/7"
    cfg.vm.host_name = "node2"
    cfg.vm.network :public_network, type: "bridge", dev: "br0", mode: "bridge", network_name: "public", ip: "211.183.3.202"
    cfg.vm.network "private_network", ip: "172.16.1.202"
    cfg.vm.network "forwarded_port", guest: 22, host: 60002, auto_correct: true, id: "ssh"
    cfg.vm.provision "file", source: "pkey.txt", destination: "pkey.txt"
    cfg.vm.provision "shell", inline: "cat pkey.txt >> /home/vagrant/.ssh/authorized_keys"
    cfg.vm.provision "shell", inline: "systemctl restart sshd"
  end
  config.vm.define "node3" do |cfg|
    cfg.vm.box = "centos/7"
    cfg.vm.host_name = "node3"
    cfg.vm.network :public_network, type: "bridge", dev: "br0", mode: "bridge", network_name: "public", ip: "211.183.3.203"
    cfg.vm.network "private_network", ip: "172.16.1.203"
    cfg.vm.network "forwarded_port", guest: 22, host: 60003, auto_correct: true, id: "ssh"
    cfg.vm.provision "file", source: "pkey.txt", destination: "pkey.txt"
    cfg.vm.provision "shell", inline: "cat pkey.txt >> /home/vagrant/.ssh/authorized_keys"
    cfg.vm.provision "shell", inline: "systemctl restart sshd"
  end
  config.vm.define "server" do |cfg|
    cfg.vm.box = "centos/7"
    cfg.vm.host_name = "server"
    cfg.vm.network :public_network, type: "bridge", dev: "br0", mode: "bridge", network_name: "public", ip: "211.183.3.200"
    cfg.vm.network "private_network", ip: "172.16.1.200"
    cfg.vm.network "forwarded_port", guest: 22, host: 60000, auto_correct: true, id: "ssh"
    cfg.vm.provider :libvirt do |resource|
      resource.memory = 2048
      resource.cpus = 2
    end
    cfg.vm.provision "shell", inline: "yum -y install epel-release && yum -y install ansible vim curl wget"
  end
end

 

```

vagrant provision

vagrant ssh server

vi /etc/ansible/hosts

```

가서 노드들을 넣어주자 그리고

```

sudo ssh-keyscan 172.16.1.201 >> ~/.ssh/known_hosts

sudo ssh-keyscan 172.16.1.202 >> ~/.ssh/known_hosts

sudo ssh-keyscan 172.16.1.203 >> ~/.ssh/known_hosts

```

ansible 통신이 되는것까지 확인이 되었다.

 

gitlab 서버에 설치하기

sudo yum install -y curl policycoreutils-python openssh-server openssh-clients
sudo systemctl restart sshd
sudo systemctl enable sshd
# 방화벽 부분이 안되어도 괜찮다.
sudo firewall-cmd --permanent --add-service=http 
sudo firewall-cmd --permanent --add-service=https 
sudo firewall-cmd --permanent --add-port=8888/tcp
sudo systemctl reload firewalld

curl -sS \
https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh \
| sudo bash
sudo EXTERNAL_URL="211.183.3.200:8888" yum install -y gitlab-ce
#(ansible-server에서 IP 주소 확인한 뒤 입력)

sudo gitlab-rails console -e production
user = User.where(id: 1).first
user.password='test123'
user.password_confirmation='test123'
user.save
user.password='test1234'
user.password_confirmation='test1234'
user.save
exit
sudo gitlab-rails console -e production
# 위에 것을 치면 작성할 수 있는 무언가가 나온다. 바로 초기화를 담당하는 부분이다.

user = User.where(id: 1).first
user.password='test123'
user.password_confirmation='test123'
user.save
user.password='test1234'
user.password_confirmation='test1234'
user.save
exit

브라우저에서 211.183.3.200:8888 로 들어가면 위와같이 GitLab이 나온다.

아까전에 입력했던

`root`

`test1234`

입력해서 들어간다.

 

혹시나 제대로 설치되었는지가 궁금하면

```

cat /etc/passwd

```

안에서 위의 항목들이 있는지를 보면 된다.

 

저장소를 만들고 코드를 올리는 것까지 해보자

먼저 대시보드에서 groups 의 create group으로 들어와 필요한 그룹을 생성해주자

 

이름은 dev인 public 저장소가 생긴다.

 

여기에서 저장소를 만들면되는데 여기에서는 project라고 부른다. 여기에서 New project를 눌러서 생성하자

Create blank project를 눌러서 프로젝트를 생성하자

 

test1이라는 프로젝트를 public으로 생성해주자

위와같이 repository가 생기었다.

 

이제 바탕화면에 gitlabtest1을 만들어주자 이걸 gitlab과 동기화시키어보자

 

이제 이걸 가상머신에 넣어주자

 

```

git init

echo "Hello World" > test.html

git remote add origin http://211.183.3.200:8888/dev/test1.git

git add .

git commit -m "first commit"

git push -u origin master

```

 

 

여기에 root, test1234로 파일을 올려주자

 

그러면 위와같이 master 브랜치에 파일이 올라간것을 볼 수 있다.

 

dev ops의 핵심가치는 개발자들이 따로따로 개발하고 따로따로 테스트해서 배포하자는 것이다.

 

CI 는 개발자를 위한 자동화 프로세스를 통해 새로운 코드 개발과, 코드의 변경 사항이 정기적으로 빌드 및 테스트되고 공유 저장소에 병합되어 여러 명의 개발자가 동시에 애플리케이션 개발과 관련 된 코드를 작업할 경우에도 서로 충돌없이 원하는 개발 작업을 수행하고 문제를 해결할 수 있다.

 

개발자가 짠 코드를 저장소에 올리면 CI 서버에서 코드의 변화를 감지하고 이를 불러오게 된다. 그리고 코드를 compute해서 컴퓨터가 이해할 수 있도록 해준다. 즉 테스트를 해서 결과를 만들고 개발자에게 보고해준다. 만약 이게 정상이면 CD로 넘기어 준다. 이 전체 과정은 모니터링된다.

기존에는 순차적으로 개발하고 넘겨주는 형태로 진행되었다. 하지만 이제는 각자의 것을 개발하고 결과를 넘기어 줄 수 있다. 문제가 있으면 수정해서 넘겨주기만 하면 된다.

 

CD 는 개발자가 지속적인 서비스 전달과 배포를 통해 최소한의 노력으로 새로운 코드에 대한 배포 를 자동화할 수 있으며, 이로써 신속한 애플리케이션 제공의 속도 저하를 유발하는 수동 프로세스로 인한 운영팀의 프로세스에 대한 과부하 문제를 해결할 수 있도록 도움을 주는 역할을 한다.

 

????

 

13. gitlab-runner가 필요하다.

개발자가 코드를 저장소에 등록했을 경우 이를 감지하고 어떠한 작업을 진행할 것인지 주체가 되는 사용자를 생성하는 것

 

```

sudo curl -L \ https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm. sh | sudo bash

sudo yum -y install gitlab-runner && yum update -y

```

settings의 CI/CD로 들어가보자

그럼 Runners가 있는 것을 볼 수 있다.

그러면 Specific runners가 있는 것을 볼 수 있는게 이걸 이용하자

 

```

sudo gitlab-runner register

```

build-server가 일종의 사용자가 되어서 작업을 받아 우리가 처리하라고 요청한 방식대로 처리하게된다.

도구는 shell을 선택했다.

 

build-server에 작업이 들어가면 shell로 작업이 들어가게 된다.

 

다시 gitlab으로 가면 위와같이 등록된것을 볼 수 있다.

 

이렇게 되면 이제 jenkinsfile 처럼 gitlab에서 작업할 수 있는 파일이 존재한다.

 

다시 gitlab으로 돌아와서 New file을 클릭해주자

 

????

그리고 위와같이 파일을 만들어주자

 

CI/CD > jobs로 가자 그럼 testjob 나온것을 볼 수 있다. passed라고 적힌것도 볼 수 있다.

passed가 보이면 testjob을 클릭해보자

일련의 과정을 거친것을 볼 수 있다.

 

이제 다시 로컬 저장소로 가보자. 현재 로컬 저장소는 한 커밋 뒤에 있는 상태이다.

```

git pull

```

파일이 추가된것을 볼 수 있다.

 

파일을 추가해서 push까지 해보자

그럼 gitlab에서 이걸 가지고 테스트하고 있는것을 볼 수 있다.

 

settings의 cicd에 들어와서 variables를 클릭해서 새로운 변수를 추가해보자

변수를 위의 방식으로 추가해보자

 

.gitlab-ci.yaml을 수정해보자

위와같이 ${person}을 추가해주고

push올려버리자

 

패스된 부분에 가서 보니 HONGGILDONG이라고 출력되는 것을 볼 수 있다.

 

이번에는 위와같이 touch로 파일을 만들고 올려보자

그러면 위와같이 되어 있는데 welcome.txt가 어디에 생기었는지 찾아보면

 

서버의 gitlab-runner 폴더 안에 생긴것을 볼 수 있다. 즉 지금까지의 작업은 모두 이 폴더 안에서 이루어지고 있었던 것이다.

 

14. server에서 루트 패스워드 생성

```

sudo yum install -y httpd

sudo systemctl restart httpd

sudo systemctl enable httpd

sudo passwd root

# 패스워드 입력

su

sudo echo "hello" > /var/www/html/index.html

```

 

그러면 잘 보인다.

 

이제 Quiz.

개발자가 index.html 파일을 변경하고 이를 push 하면 해당 파일을 /var/www/html/index.html 로 업데이트 하도록 해 보세요.

 

gitlab-runner에게 sudo 권한을 부여해준다.

 

그다음 vagrant 키를 복사해서 관리자 권한으로 바뀌어 준다.

```

sudo cp ~/.ssh/id_rsa ../gitlab-runner/.ssh/id_rsa

sudo cp ~/.ssh/known_hosts ../gitlab-runner/.ssh/known_hosts

su passwd gitlab-runner #test123 으로 변경

cd ~

sudo chown gitlab-runner ~/.ssh/id_rsa

ansible all -m ping

```

 

index.html파일을 httpd 위치에 복붙해준다.

.gitlab-ci.yml 파일을 위와같이 만들어주자

그리고 deply.yaml 파일을 만들어 주자

그러면 정상 변경된다.

728x90

'Development(Web, Server, Cloud) > 22) LINUX - Cloud' 카테고리의 다른 글

클라우드 76일차  (0) 2022.05.17
클라우드 75일차  (0) 2022.05.16
클라우드 73일차  (0) 2022.05.10
클라우드 72일차  (0) 2022.05.09
클라우드 71일차  (0) 2022.05.09