Ansible이란?
IT 자동화를 위한 오픈소스 도구로, 서버 구성 관리 (Configuration Management), 애플리케이션 배포 (Application Deployment), 프로비저닝 등을 쉽게 수행할 수 있도록 도와준다.
특징과 장점
Agentless: 별도의 클라이언트 설치 없이 SSH 또는 WinRM을 통해 실행
YAML 기반: 사용하기 쉬운 선언형 Playbook 제공
멀티플랫폼 지원: Linux, Windows, macOS 등 다양한 환경에서 사용 가능
모듈 기반 구조: 다양한 모듈을 활용하여 확장 가능
Idempotent(멱등성): 동일한 작업을 여러 번 실행해도 같은 결과를 보장한다.
Ansible 설치 및 환경 설정
나는 Ubuntu 22.0.4, VMware 환경에서 설치했다.
Control Node용 가상머신 1대,
Managed Node용 가상머신 N대 세팅해 주자.
ssh 설정
Control Node에서 Managed Node에 비밀번호 없이 접속 가능하게 ssh 설정해줘야 한다.
1. 먼저 ssh 키를 생성하자.
ssh-keygen
엔터 3번
2. 그리고 아래 명령어로 Managed Node에 등록
ssh-copy-id 사용자계정이름@Managed-Node-IP
yes 입력하고 비밀번호 입력
3. 아래 명령어로 비밀번호 없이 접속 잘 되면 정상등록된 것
ssh 사용자계정이름@Managed-Node-IP
Control Node에 Ansible 설치
아래 명령어로 설치한다
apt update & apt install ansible-core
이렇게 하면 기본적인 설정은 끝났다.
이제 간단한 실습을 하기에 앞서 Ansible의 주요 구성 요소를 살펴보자.
Ansible 주요 구성 요소
1. ansible.cfg
Ansible의 기본 설정 파일로, 실행 환경을 정의한다.
/etc/ansible/ansible.cfg 위치에 만들어주자.
기본 인벤토리 경로, 기본 사용자 지정, 관리자 권한 관리 등 다양한 설정을 할 수 있다.
기본 양식
[defaults]
inventory = ./hosts
remote_user = seo
become = true
become_user = root
- inventory =./hosts : 인벤토리 파일의 위치를 ./hosts로 지정
- remote_user = seo : 원격 서버에 접속할 기본 사용자 계정으로 seo 사용
- become = true : sudo 또는 su 명령어를 사용하여 관리자 권한 상승 활성화
- become_user = root : 관리자 권한 상승 시 사용할 기본 계정을 root로 지정
2. Inventory 파일
관리할 서버 목록을 정의하는 파일이다.
yaml파일이나 ini파일로 만들 수 있다.
/etc/ansible/hosts로 기본 경로에 생성하면 나중에 ansible-playbook 명령어 사용할 때 -i 로 인벤토리 지정 안 해줘도 된다.
yaml파일과 ini는 문법이 약간 다르니 주의하자.
난 ini로 만들었다.
역할
- 호스트 그룹 관리
- 호스트별 변수 설정
기본 양식
[webservers]
192.0.56.11
[db]
192.0.56.13
[all:children]
webservers
db
이런 식으로 그룹별로 Managed Node의 IP를 적고 children에 넣어준다.
아니면 Control Node에서 /etc/hosts 파일을 수정해
Managed Node IP에 이름을 할당하고 이름으로 사용할 수도 있다.
3. Playbook 파일
YAML형식으로 작성되며, 여러 개의 Task로 서버에서 명령어를 실행한다.
Control Node에서 Managed Node에 원격으로 명령어를 실행한다 생각하면 편할 것 같다.
기본 양식
- hosts: webservers // inventory에서 설정한 이름과 맞춰줘야함
tasks:
- name: Test (user permission)
file:
path: 파일만들경로
state: touch
owner: userID // 일반 사용자 이름
group: userID
mode: 0600
- name: Test (root permission)
become: yes // root 권한 활성화
file:
path: /root/efg
state: touch
owner: root
group: root
mode: 0600
이렇게 playbook.yaml을 작성하고 명령어를 통해 특정 host에 특정 명령어를 실행시킬 수 있다.
playbook.yaml 파일을 실행하는 명령어는 아래처럼 할 수도 있고
ansible-playbook -i 인벤토리파일경로 플레이북파일경로
ansible.cfg에 인벤토리파일경로를 등록해 놨다면 아래처럼 해도 된다.
ansible-playbook 플레이북파일경로
추가 명령어
ansible-playbook 플레이북파일경로 -u test // test 계정으로 접속
// ansible.cfg 에서 기본유저 설정 안해주면 root로 접속할려고 하니까 root 권한 없다고 오류나면 해당 명령어 사용
// playbook에서 root 권한이 필요할때 비밀번호 입력받게 함
ansible-playbook 플레이북파일경로 -u test --ask-become-pass
실행 예제
/etc/ansible/hosts
[webservers]
Managed Node의 IP
[all:children]
webservers
localhost에서 환경변수 출력해 보기
play.yaml
- name: Print Environment Variable
hosts: localhost
gather_facts: no
tasks:
- name: Set Environment Variable
shell: >
echo "My Variable: $MY_CUSTOM_VAR"
environment:
MY_CUSTOM_VAR: "Hello, Ansible!"
register: result
- name: Print the Environment Variable
debug:
msg: "{{ result.stdout }}"
실행 명령어
ansible-playbook play.yaml
실행화면
Managed Node에 파일 만들어보기
play.yaml
- name: 파일 생성
hosts: webservers
tasks:
- name: Test
file:
path: /home/seo/abcd
state: touch
owner: seo
group: seo
mode: '0644'
실행 명령어
ansible-playbook play.yaml
실행화면
Managed Node에 Nginx 설치 및 실행해 보기
play.yaml
- name: 웹 서버 설치
hosts: webservers
become: yes
tasks:
- name: 패키지 목록 업데이트
apt:
update_cache: yes
- name: Nginx 설치
apt:
name: nginx
state: present
- name: Nginx 서비스 시작 및 활성화
service:
name: nginx
state: started
enabled: yes
실행 명령어
ansible-playbook play.yaml --ask-become-pass
실행화면
Managed Node에 Nginx가 실행된 모습
Managed Node에 프런트엔드 배포
play.yaml
- name: 웹 사이트 배포
hosts: webservers
become: yes
tasks:
- name: 웹 페이지 파일 복사
copy:
src: ./index.html
dest: /var/www/html/index.html
mode: '0644'
- name: Nginx 서비스 재시작
service:
name: nginx
state: restarted
실행 명령어
ansible-playbook play.yaml --ask-become-pass
실행화면
Managed Node의 IP로 nginx에 접속해 보면 바뀌어있는 걸 확인할 수 있다.
추가
매번 비밀번호 치기가 귀찮으면 해당 host의 /etc/sudoers 파일에 아래 라인을 추가한다.
사용자계정 ALL=(ALL) NOPASSWD: ALL
그럼 해당 사용자계정은 sudo 명령어를 사용할 때 따로 비밀번호가 필요 없어진다.
근데 보안에 취약하므로 주의!
'DevOps' 카테고리의 다른 글
CircleCI로 간편하게 CI/CD 파이프라인 구축하기 (0) | 2025.03.21 |
---|