Ansible

David Kim·2025년 1월 29일

RE)인프라 구성

목록 보기
1/7
post-thumbnail

Ansible은 서버 설정을 자동화하고, 인프라를 구성하는데 사용하는 오픈소스.
운영환경에서 서버를 안정적으로 배포할 수 있을만큼 활용성이 높다.

Why?

클라우드 환경에서 서버를 설정할 때 Ansible를 활용한다.
스케일 아웃 구조로 운영해야 할 서버의 수가 변하는 경우 설치된 OS에 서비스를 운용하기 위한 패키지들을 설치해 줘야 한다.
이때, Cloud Init의 오픈소스를 사용해서 OS가 구동된 후 프로그램 사용자가 등록한 스크립트에 따라서 필요한 패키지를 설치해 준다. 그렇지만 사용하는 서비스의 종류가 달라질 것이고 달라질 때마다 추가해줘야 하는 스크립트를 사용자가 관리하기가 어려워진다.
이 문제를 해결하는 방법 중 하나가 Ansible이다

Ansible이란?

Ansible은 서버의 설정과 인프랑 프로비저닝 등을 자동화할 수 있는 오픈소스 도구이다.

  • 별도의 Agent 없이 SSH를 통한 스크립트 실행을 지원
  • 선언적으로 서버 설정을 정의
  • 서비스 및 서버의 환경에 따라 변수를 동적으로 정의 가능
  • 로컬/원격 서버 설정 방식 지원
  • 그룹별로 host 정보를 관리

Ansible:playbook

  • playbook.yml 파일을 통해 작업을 정의
- name: Install and Configure Nginx
  # webserver 그룹에 속한 원격서버에서 작업을 수행
  hosts: webserver
  # 관리자 권한으로 실행되도록 설정
  become: true
  
  #apt 모듈을 사용하여 nginx를 설치 
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present
    - name: Copy Nginx configuration file
      # 템플릿 파일을 dest 경로에 복사
      template:
        src: nginx.conf.j2
        dest: etc/nginx/nginx.conf
      # Restart Nginx 핸들러를 호출
      notify:
        - Restart Nginx
  handlers:
    - name: Restart Nginx
      # nginx 모듈을 재시작
      service:
        name: nginx
        state: restarted

Ansible:Inventory

  • 서버를 그룹별로 분리하기 위한 파일
  • 동일한 설정이 필요한 서버를 그룹별로 묶어 관리 가능
  • 부모/자식 구조를 설계

group_vars를 통한 변수 관리

  • Inventory에 정의된 그룹별로의 폴더를 포함
  • 그룹별 폴더에는 해당 그룹에서 사용할 변수가 정의되있는 yml 파일이 존재
  • 자식 그룹에 중복된 변수가 있으면 자식 그룹의 값이 우선 적용(오버라이딩)

실행과정

  1. playbook을 실행할 때, Inventory 파일을 지정
  2. Inventory 파일에 적힌 부모/자식 구조에 따라 group_vars 폴더 확인 후 변수 값 적용
  3. 최종적으로 모아진 변수들을 가지고 스크립트를 실행

Ansible Role이란?

  • Ansible Role은 하나의 역할을 가진 작업을 모아놓은 패키지
  • playbook은 이미 정의해 놓은 Role을 조합해서 서비스를 사용

Ansible Role 디렉터리 구조

roles/
  commons/ # hierarchy represents a 'role'
    tasks/ # include role tasks defined through yml
      main.yml
    handlers/ # include handler file that execute when event arise
    files/ # inlcude static file that be copied to remote system
      foo.txt
      bar.sh
    templates/ # template file that used as dynamically create file
      ntp.conf.j2
    vars/ #include varialbe file
      main.yml
    defaults/ #include file that used default variable
      main.yml
    meta/ # include metadata file (Author, dependencies, lisense)
      main.yml
    library/ # inlcude custom module
    module_utils/ inlcude custom module_utils
  webtier/ # same kind of common structure
  monitoring/ # ``

Ansible Role을 활용한 실전 Ansible

  1. 서비스 실행에 필요한 Role 제작
  2. 필요한 Role을 선택하여 playbook.yml 제작
name: hello
hosts: {{target | default('all')}}
roles:
  - {
    role: roles-remote/devops.common,
    hs_service_name: "hello",
    become: yes
  }
  ...
  - {
    role: rols-remote/devops.ds,
    become: yes,
    when: df_enabled|default(false)
  1. requirements.yml 파일 작성
- src: git+https://github.com/dev...
  name: devops.common
  ...
  1. ansible-galaxy install 명령어를 통해서 local에 필요한 파일 다운로드
  • 이때 Github Token값이 사용되어야 하는 경우 토큰값을 스크립트에 입력하지 말고 명령 실행시 주입후 토큰 값을 서버에 남겨두지 않고 제거한다.
  1. 동적으로 Inventory를 지정하여 playbook 실행
profile
Learner until Ending

0개의 댓글