DM Log

[CI/CD #3] Infrastructure as Code 개요와 Ansible의 이해 본문

개발공부/Infra

[CI/CD #3] Infrastructure as Code 개요와 Ansible의 이해

Dev. Dong 2025. 10. 28. 22:40

Infrastructure as Code란?

  • 코드로서의 인프라라는 뜻으로, 서버, 네트워크, 스토리지, 로드밸런서 등의 인프라 구성을 코드로 관리하고 자동화하는 개념
  • 콘솔에 접속해 서버를 설치하고 네트워크를 구성했지만, IaC를 이용하여 스크립트나 설정 파일로 정의하고 자동화된 배포를 수행

IaC의 중요성

  1. 자동화 - 사람이 직접 설정 필요 없이, 코드를 통해 자동 환경 구성
  2. 일관성 - 모든 환경이 동일하게 설정
  3. 속도 향상 - 서버 추가, 배포, 스케일링 작업이 몇 분 내로 완료
  4. 재현성 - 인프라 문제 발생 시 동일 환경을 빠르게 복원
  5. 협업 강화 - 인프라를 코드로 관리하므로 개발자, 운영자가 동일 기준으로 작업

Ansible 이란?

  • 단순 자동화 도구를 넘어, 설치 - 배포 - 실행 등 시스템 관리 전반을 커버할 수 있는 범용 인프라 자동화 플랫폼

기본 제공 패키지

  • 설치: apt-get / yum / homebrew
  • 파일 및 스크립트 배포 : copy
  • 다운로드 : get_url, git
  • 실행 : shell, task

결과 확인

  • ok / failed / changed / unreachable

Ansible Server 설치 (Linux)

  • yum install ansible
  • ansible -version

환경 설정 파일

  • /etc/ansible/ansible.cfg

Ansible에서 접속하는 호스트 목록

  • /etc/ansible/hosts
  • 그룹이름 (ex_nginx) & IP Address 형식으로 작성
[nginx]
111.111.11.11
111.111.11.12
111.111.11.13
  1.  

Docker 기반 Ansible 환경 구축

  • Docker Hub에 제공된 ansible관련 이미지를 통해 학습한 내용

Ansible Docker 이미지 다운

  • window / macOs (Intel chip) - docker pull edowon0623/ansible
  • macOS (Silicon, M1 chip) - docker pull edwon0623/ansible-server

Ansible 컨테이너 실행

Windows

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
  • ssh를 통해 접속 후, 명령어 입력
    • 컨테이터 내부에 아래 파일이 없는 경우 vi, sed 명령어 생략 (/etc/sysconfig/docker 또는 /etc/sysconfig/docker-storage)
$ vi /etc/sysconfig/docker
$ sed -i -e 's/overlay2/vfs/g' /etc/sysconfig/docker-storage
$ systemctl start docker
$ systemctl status docker

Ansible에서 접속하는 호스트 목록 생성

mkdir /etc/ansible
cd /etc/ansible
vi hosts

[devops]
172.17.0.2
172.17.0.4
    • docker ip 확인 - docker network inspect bridge

SSH 접속 키 생성 및 배포

  • Ansible은 SSH를 통해 통신을 위한 password SSH 키를 생성하고 서버 등록
ssh-keygen
ssh-copy-id root@[ssh key 전달할 IP]

Ansible Modlue

실행 옵션

 

All modules — Ansible Documentation

 

docs.ansible.com

 

  • -i : 적용 될 호스트들에 대한 파일 정보
  • -m : 모듈 선택
  • -k : 관리자 암호 요청
  • -K : 관리자 권한 상승
  • --list-hosts : 적용되는 호스트 목록

멱등성

  • 같은 명령어를 통해 실행 시 여러번 실행 됨
  • Ansible에서는 같은 명령어 실행 시 한번만 실행 됨

실행 TEST

  • ping 모듈
[root@31448245eb61 ~]# ansible all -m ping
172.17.0.4 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
172.17.0.2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
  • 메모리 모듈
[root@31448245eb61 ~]# ansible all -m shell -a 'free -h'
172.17.0.4 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           15Gi       2.0Gi       9.2Gi        23Mi       4.3Gi        13Gi
Swap:         4.0Gi          0B       4.0Gi
172.17.0.2 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           15Gi       2.0Gi       9.2Gi        23Mi       4.3Gi        13Gi
Swap:         4.0Gi          0B       4.0Gi
  • 파일 생성
touch test.txt
echo "TEST TEST" >> test.txt

ansible all -m copy -a "src=./test.txt dest=/tmp"
  • 특정 패키지 설치
ansible devops -m yum -a "name=httpd state=present"

Ansible Playbook

  • 사용자가 원하는 내용을 미리 작성해 놓은 파일
vi first-playbook.yml
ansible-playbook first-playbook.yml

 

파일 생성 예제 #1 - ansible에 host 추가

---
  - name: Add an ansible hosts
    hosts: localhost
    tasks:
      - name: Add a ansible hosts
        blockinfile:
          path: /etc/ansible/hosts
          block: |
            [mygroup]
            172.17.0.5

파일 생성 예제 #2 - 파일 복사

- name: Ansible Copy Example Local to Remtoe 
  hosts: devops
  tasks:
    - name: copying file with playbook
      copy:
        src: ~/sample.txt
        dest: /tmp
        owner: root
        mode: 0644

파일 생성 예제 #3 - 폴더 생성 & url로 파일 다운로드

---
- name: Download Tomcat9 from tomcat.apache.org
  hosts: devops
  tasks:
   - name: Create a Directory /opt/tomcat9
     file:
       path: /opt/tomcat9
       state: directory
       mode: 0755
   - name: Download Tomcat using get_url
     get_url:
       url: https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.75/bin/apache-tomcat-9.0.75.tar.gz
       dest: /opt/tomcat9
       mode: 0755
       checksum: sha512:https://downloads.apache.org/tomcat/tomcat-9/v9.0.75/bin/apache-tomcat-9.0.75.tar.gz.sha512