Ansible 설치와 사용법

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로 만들었다.

 

역할

  1. 호스트 그룹 관리
  2. 호스트별 변수 설정

 

기본 양식

[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