[Jenkins] IaC 와 Ansible의 이해
안녕하세요. 기깔나는 사람들에서 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 기본 명령어
- -i (--inventory-file) : 적용될 호스트들에 대한 파일정보
- -m (--module-name) : 모듈 선택
- -k (--ask-pass) : 관리자 암호요청
- -K(--ask-become-pass) : 관리자 권한 상승
- --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 구축