[Jenkins] IaC 와 Ansible의 이해

2023. 8. 18. 22:55초기 과업/DevSecOps

작성자알 수 없는 사용자

728x90
반응형

 

안녕하세요. 기깔나는 사람들에서 DMSO를 맡고있는 정우입니다.

지난번 Jenkins를 이용해서 여러 프로젝트를 만들어 보았습니다.

 

1. [Jenkins] Jenkins 설치 및 새로운 프로젝트 생성

2. [Jenkins] Jenkins를 이용한 CI/CD 자동화 도구의 사용

3. [Jenkins]PollSCM을 통한 지속적인 파일 업데이트

4. [Jenkins] SSH+Docker가 설치되어있는 VM사용하기

 

 

이번 시간엔 IaC와 Ansible의 개요를 살펴보고

도커 환경에서 Ansible을 설치를 해보겠습니다. 


IaC (Infrastructure as a Code)란?

- 시스템과 하드웨어 또는 인터페이스의 구성정보를 파일(script)을 통해 관리하거나 프로비저닝 하는것

=> 코드(script)를 이용을 해서 Infrastructure를 실행한다

 

- 자동화할 수 있는 장점이 있습니다.

- 버전관리를 통한 리소스를 관리할 수 있습니다.

-  스크립트를 통해 관리를 하게되면 스크립트 내부에 변경, 추가, 삭제 등이 쉬워집니다.

 

많이 사용하는 IaC 도구 중에 Ansible, Terraform, AWS CloudFormation, Puppet 등이 있습니다

 

간단하게 Ansible, Terraform에 대해 얘기를 해보겠습니다.

Terraform:

- 클라우드와 상관없이 사용이 가능합니다.

- 별도의 언어 dsl을 알아야 합니다.

- 필요작업을 스크립트로 유지해야합니다. 

 

Ansible :

- 개발사 : Redhat 

- 기존에 있는 서버를 정보 변경이나 설정 등을 원하는 형태로 사용하는데 특화 되어있는 도구입니다.

- 구성관리 도구라고도 불립니다.

- 다양한 모듈들을 사용할 수 있다는 장점이 있습니다. 

- agent가 필요가없다 ( => 새로운 서버에 따로 설치가 필요한 것이 없다)

- Push 기반 서비스

 

 

Terraform은 서버를 구축하는데 사용된다면

Ansible은 이미 구축되어있는 서버에 대한 변경이나 수정이 필요할 때 많이 사용된다고 합니다. 

 

 


IAC도입 전 과 후

도입 전 서버 관리

특정 서버에 문제가 생겼을 때 관리자가 직접 새로운 서버를 구축해서 사용을 했습니다. 

 

도입 후 서버 관리 :

각각의 서버가 어떤 역할을 할 것인지 스크립트로 지정해줍니다. 

특정 서버가 문제가 생겼다고 하면 ansible과 같은 도구가 관리자 대신 새로운 서버를 구축해서 사용할 수 있게 되었습니다.

 

이렇듯, 관리자를 대신해서 여러개의 서버에 대한 관리를 Terraform이나 Ansible과같은 도구가 해주게 되는 것입니다.

 


도커 Container에 Ansible 설치해보기

 

1. ansible을 설치해보겠습니다.

$ docker pull edowon0623/ansible  # Window, MacOS
$ docker pull edowon0623/ansible-server:m1  # Mac M1칩, 실리콘

도커 이미지를 살펴보겠습니다.

 

2. Ansible 서버를 실행해보겠습니다.

포트를 지정할건데 20022번 포트가 사용중인지 확인해볼게요

$ netstat -ano | grep 20022

 

없는게 확인됐다면 실행해보겠습니다.

 

Ansible 컨테이너를 실행시켜주겠습니다.

docker run --privileged -itd --name ansible-server -p 20022:22 -p 8082:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/ansible:latest /usr/sbin/init

로그인해볼게요

 

$ docker exec -it ansible-server

또는

$ ssh root@localhost -p 20022

Password : P@ssw0rd

 

로그인에 성공했습니다.

 

 

Ansible서버 설정 

내부에 설치가 안되어있는 라이브러리들을 설치하겠습니다.

 

clear커맨드가 안되기 때문에 설치해보겠습니다.

yum install -y ncurses

 

 

 

설정을 보기전에

도커 내부에 각각의 컨테이너들이 어떤 IP로 작동하고 있는지 살펴볼게요

$ docker network inspect bridge

docker server와 ansible server의 IP주소를 따로 적어둡니다.

 

 

 

 

서버에 /etc/ansible/hosts라는 파일을 생성해줘야합니다.

$ ls /etc/ansible/hosts   # 파일이 있는지 확인해봅니다

$ mkdir  /etc/ansible     # 디렉토리를 생성합니다. 

$ vi /etc/ansible/hosts

 

vi로 hosts 내부에 [devops] 라는 그룹에

복사해둔 docker-server와 ansible-server 의 IP주소를 작성해줍니다.

 

내부에 설치된 도커를 실행해줄게요

$ systemctl status docker
$ systemctl start docker

 

 


로그인시 비밀번호 없이 로그인 하는방법

 

Ansible 내부에 키값을 생성해보겠습니다.

$ ssh-keygen

 

도커 서버를 등록해주고 복사한 키값으로

비밀번호없이 접근할 수 있도록 해보겠습니다.

$ ssh-copy-id root@172.17.0.5

 

ssh root@<접속할 IP>

바로 비밀번호 없이 접근이 가능합니다.

 

 


Ansible 기본 명령어 

  1. -i (--inventory-file) : 적용될 호스트들에 대한 파일정보
  2. -m (--module-name) : 모듈 선택
  3. -k (--ask-pass) : 관리자 암호요청
  4. -K(--ask-become-pass) : 관리자 권한 상승
  5. --list-hosts : 적용되는 호스트 목록

한가지 주의할 특징: 

멱등성 : 같은 설정을 여러번 적용하더라도 결과가 달라지지 않는 성질

 

 

Ansible 모듈을 사용해서 명령어들을 살펴볼게요.

- ping

ansible all -m ping

 

저는 아직 ansible 서버에 키값을 등록하지 않아 06번 서버는 붙지않습니다. 

키값을 등록해주면 바로 ping이 오네요

 

- free -h : 메모리확인

각서버의 메모리를 확인할 수가 있습니다.

$ ansible all -m shell -a "free -h"

 

- 파일 이동:

touch 로 새로운 파일을 하나 생성해줄게요

 

devops 서버에 이 test.txt 폴더를 복사해보겠습니다.

ansible all -m copy -a "src=[파일위치와 이름] dest=[복사해줄 위치]"

 

 

5번서버에 잘 복사됐는지 확인해보겠습니다.

 

 

- 프로그램 설치 :

 

패키지가 설치되어있는지 확인해볼게요

yum list installed | grep httpd

아직 패키지가 설치되어있지 않습니다.

패키지를 설치해보겠습니다.

해당시킬 그룹을 설정해주겠습니다.

 

$ ansible <해당그룹> -m yum -a "name=httpd state=present"

$ ansible devops -m yum -a "name=httpd state=present"
또는
$ ansible all -m yum -a "name=httpd state=present"

 

 

설치가 잘됐는지 확인해볼게요

 

모두 다 잘 설치되어있는 것을 확인 할 수 있습니다.

 

 


오늘은 IaC와 Ansible에 대해 알아보았습니다. 

또 Ansible을 사용해 등록된 모든 서버에 설치해보고 변경해보았습니다.

정말 편하게 서버를 관리 할 수 있을 것 같네요.

 

다음 시간엔 Ansible Playbook을 사용해보겠습니다.

 

 

 

 

 


참고자료

🔗 - 인프런 - Jenkins를 이용한 CI/CD 구축

 

 

 

 

728x90
반응형