728x90
#1 Terraform과 Ansible의 차이
1. Terraform
- 오픈 소스 프로젝트
- 안전하고 반복 가능한 방식으로 인프라를 구축, 변경 및 관리하기 위한 도구
- 주로 CLI 전용이지만 널리 사용되는 퍼블릭 클라우드 집합과 잘 통합
- 고정된 클라우드 인프라 세트를 프로비저닝하고 나중에 해체하는데 탁월
2. Ansible
- IT 자동화 도구
- 시스템을 구성하고, 소프트웨어를 지속적으로 배포 및 다운타임 없는 롤링 업데이트와 같은 고급 IT 작업을 오케스트레이션 가능
- 단순성과 사용 편의성에 중점
3. 비교
- 공통점
- 오픈 소스 CLI 전용버전이 있다
- 웹 UI 또는 SSO와 같은 엔터프라이즈 기능과 함께 사용 가능
- 차이점
- Ansible : 다목적 자동화도구
- Terraform : 코드 도구로서의 인프라
#2 Ansible 개념
1. 정의
- DevOps(개발과 운영) 환경에서 다수의 서버를 효율적으로 관리하기 위한 환경 구성 자동화 도구
- 사용성 또는 확장성에서 두각
2. CI & CD
- 애플리케이션 개발 단계를 자동화하여 보다 짧은 주기로 고객에게 제공
- 지속적인 자동화와 모니터링
- 사례 : CI/CD 파이프라인
- CI ( Continuous Integration )
- 자동화 프로세스인 지속적인 통합을 의미
- 성공적인 구현 시 새로운 변경 사항이 정기적으로 빌드 및 테스트되어 공유 및 통합
- CD ( Continuous Delivery )
- 최소한의 노력으로 새로운 코드를 배포하는 것
- 자동으로 업로드, 실시간 프로덕션 환경 배포
3. IaC
- Infrastructure as Code
- 인프라 운영 코드로 개발하여 관리하는 도구 -> 프로그래밍형 인프라
- 자체적으로 VM생성하고 오케스트레이션하는 스크립트 포함
#3 Ansible 구조
1. 기본 구조
- Control Node : 중앙 제어 노드로 Ansible이 설치되는 Node
- Managed Node : Control Node에 의해 관리가 되는 대상 서버로 hosts에 등록된 대상
- Modules
- 미리 정의된 실행 단위, 수백 개의 유용한 모듈 제공
- yum 모듈을 통해 패키지를 설지할지 삭제할지 등을 명시
- Inventory
- IaC 대상이 될 서버 목록 정의 파일
- 대상에 대한 이름 지정 시 Hosts 파일에 저장
- Playbook
- yaml포맷으로 되어 있는 파일, Inventory에서 정의된 서버들에 무엇을 해야 할 지 정의
- 일반적으로 Ansible을 사용한다면 Playbook을 사용한다는 의미
- 단독이 아닌 Inventory와 함께 사용
- 멱등(idempotent) 되도록 설계 -> 연산을 여러번 적용해도 결과는 달라지지 않는 성질
#4 Ansible 환경 구성
1. Amazon Linux 2 기반으로 4대의 인스턴스 생성
- 보안 그룹 : ssh, http, https
- 각 인스턴스로 접속하여 /etc/hosts 파일에 각 노드 IP 등록
<< 4개의 Node에 접속후 기본설정>>
// control을 각 hostname에 맞게 변경
sudo -i // root 계정으로 변환
hostnamectl set-hostname control.example.com
hostname // 변경사항 확인
bash
ifconfig // 해당 노드의 IP 확인
vim /etc/hosts
>[각 노드의 IP] control.example.com control
passwd //root 계정의 비밀번호 생성
2. 각 노드의 연동
- ssh-key 생성만 control에서 실행, 나머지는 4대의 인스턴스에서 동일 실행
- 비밀번호 접근에 대한 허용은 각 server만 실행
<< 사용자 nana 생성 및 비밀번호 설정>>
useradd nana
passwd nana
su - nana
<< SSH Key 생성 >>
mkdir .ssh
ssh-keygen -t rsa // 암호없이 생성
ls -l .ssh
// 생성된 두개의 키 확인 ( ex> id_rsa, id_rsa.pub)
<< 비밀번호 접근에 대한 허용 >>
vim /etc/ssh/sshd_config <그림1 참조>
systemctl restart sshd
<< nana 사용자에게 root 권한 부여>>
exit // nana 계정에서 다시 root 계정으로
usermod -aG wheel nana
-> 결과값 : wheel:x:10:ec2-user,nana
vim /etc/sudoers // passwd를 묻지 않게 설정 <그림2 참조>
<< 권한 확인 >>
su - nana
sudo yum install vsftpd -y
// 정상적인 권한 부여 시 설치 양호
그림 1 |
그림 2 |
3. 연동 확인
<< control 계정 >>
su - nana
ssh-copy-id nana@servera // control 서버의 nana 계정에 생성된 key를 각 서버에 복사
ssh-copy-id nana@serverb
ssh-copy-id nana@serverc
ssh nana@servera // 각 서버에 접속 확인
4. Ansible 설치 및 동작 확인
- ansible.cfg
-
더보기[defaults]
inventory = ./inventory
remote_user = nana # 어떠한 계정으로 접속할 것인지
ask_pass = false # passwd 를 물을지 말지
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false # root의 passwd를 물을지 말지
sudo amazon-linux-extras install -y epel
sudo yum install -y ansible
<< inventory 파일 작성, 관리 대상 목록 >>
vim inventory
> servera
> serverb
> serverc
vim ansible.cfg <더보기 참조>
ansible --version
ansible servera -m ping <그림 참조>
// ansible [inventory에서의 대상이름] [module] [play] 순서
// 해당 결과가 pong 인것을 확인
계속해서 생기는 경고는 ansible.cfg 파일의 default에 아래의 명령어 추가 -> warning일 뿐 오류는 아님
> interpreter_python=/usr/bin/python 또는 python3
#5 Ansible Inventory 파일
1. 변수
- 전역 변수 : /etc/ansible/hosts
- 지역변수인 inventory보다 우선순위가 낮음
- 전체 사용자에게 적용되는 inventory 파일
- 지역 변수 : inventory
- 변수 파일 안에 아래의 그림처럼 그룹을 지정 가능
2. 실습
- Inventory 생성 및 확인
<< nana@control에서 실행 >>
sudo vim /etc/ansible/hosts
> servera.example.com
> [webservers]
> serverb.example.com
> [dbservers]
> serverc.example.com
ansible --list-hosts <그림 참조>
andible ungrouped --list-hosts
andible webservers --list-hosts
- 사용자 정의 Inventory 생성 및 확인
mkdir deploy-inventory
cd deploy-inventory
vim inventory <더보기 참조>
ansible all -i inventory --list-hosts
ansible ungrouped -i inventory --list-hosts
ansible production -i inventory --list-hosts
ansible busan -i inventory --list-hosts
ansible korea -i inventory --list-hosts
- ansible.cfg 생성 및 확인
- inventory
-
더보기[myself]
localhost
[intraweb]
servera.example.com
[externalweb]
serverb.example.com
[webservice]
serverc.example.com
[web:children]
intraweb
externalweb
webservice - ansible.cfg
-
더보기[defaults]
inventory = ./inventory
remote_user = nana
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = true // false로 바꿀 시 비밀번호 묻지 않음
mkdir deploy-config
cd deploy-config
vim ansible.cfg
> [defaults]
> inventory = ./inventory
> interpreter_python=/usr/bin/python3
vim inventory <더보기 참조>
ansible intraweb -m ping <그림 참조>
ansible intraweb --list-hosts
-> ansible.cfg 의 내용을 바꿀 시 비밀번호를 물어보고 해당 내용을 보여준다
-> <더보기 참조>
- ad-hoc 명령어 사용
- ansible.cfg
-
더보기[defaults]
inventory = ./inventory
remote_user = nana
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false - inventory
-
더보기[webservers]
server[a:c].example.com
[seoul]
servera.example.com
[busan]
serverb.example.com
serverc.example.com
[development]
serverc.example.com
[production]
servera.example.com
serverb.example.com
[korea:children]
seoul
busan
mkdir ansible
cd ansible
vim ansible.cfg
vim inventory
<< command와 shell 모듈의 차이 >>
ansible seoul -m command -a 'echo "hello world" > index.html'
// redirection을 지원하지 않기 때문에 ls -l을 통하여 확인 불가
ansible seoul -m shell -a 'echo "hello world" > index2.html'
ansible seoul -m command -a 'ls -l'
// index2.html만 확인
ansible seoul -m command -a 'cat /etc/passwd | grep nana'
> failed pipeline 또한 지원하지 않음
ansible seoul -m shell -a 'cat /etc/passwd | grep nana'
> changed
-> ansible의 명령어를 통해 지속적인 경고 시 아래 명령어 추가
> ansible.cfg
[default]
> command_warnings=false 추가
- ad-hoc 명령어 사용 - httpd
ansible busan -m shell -a 'yum install httpd -y'
ansibel busan -m shell -a 'echo "apache web server" > /var/www/html/index.html
ansible busan -m shell -a 'cat /var/www/html/index.html' <그림 참조>
- ad-hoc 명령어 사용 - file / 파일, 디렉토리 생성
ansible seoul -m file -a 'path=module state=directory mode=0755'
ansible seoul -m command -a 'ls -l'
ansible seoul -m file -a 'path=module/test.txt state=touch mode=0755 owner=nana'
<그림1 참조>
<< 삭제 >>
ansible seoul -m file -a 'dest=module/test.txt state=absent'
ansible seoul -m file -a 'dest=module state=absent'
<그림2 참조>
그림 1 |
그림 2 |
'Ansible' 카테고리의 다른 글
Ansible 반복문과 조건문 (0) | 2023.08.21 |
---|---|
Ansible 복습문제 2 (1) | 2023.08.18 |
Ansible-playbook & multiple (0) | 2023.08.17 |
Ansible 복습문제 (0) | 2023.08.17 |