본문 바로가기
클라우드/AWS

Ansible) 앤서블이란? 앤서블에 대해(Control 노드 구성, 모듈 구성)

by 빈스터디 2023. 3. 28.

Ansible이란?

> 스토리지, 서버 및 네트워킹을 자동화하는 구성 관리 플랫폼이다.

> 수동 반복 작업을 자동화 할 수 있다.

> 멱등성을 가지고 있다.

*멱등성 : 연산을 여러 번 적용해도 결과가 달라지지 않는 것

 

 

Ansible 구성요소

  • Control Node : 앤서블 실행 노드 (managed node에 접속할 ssh 키 생성)
    • Inventory (host file) : managed node 목록, 각 managed node에 대한 IP 주소, 호스트 정보, 변수와 같은 정보 지정
    • Module : 앤서블이 실행하는 코드 단위
    • Playbook : 순서가 지정된 작업 목록이 저장되어 지정된 작업을 순서대로 반복적 작업 실행
  • Managed Node : 앤서블로 관리되는 서버, 앤서블이 설치되지 않는다. 그냥 구성될 노드들..

 

 

Control Node 구성

1. ansible 설치

yum install -y epel-release  # 추가 패키지 저장소
yum install -y ansible-2.8.8-1.el8.noarch.rpm  # ansible 설치, 설치 파일 없으면 먼저 다운받고 설치

 

2. managed 노드에 접속할 ssh 키 생성

ssh-keygen
# 엔터키 3번

 

3. ssh, 패스워드 없이 접속하기 위한 작업

ssh-copy-id root@[managed node-IP]
# 패스워드 입력

 

 

Control Node -  Inventory

> Ansible의 기본 Inventory 경로는 '/etc/ansible/hosts'이다.

> yaml 파일 형식이다.

 

아래와 같이 managed node들의 IP를 정리해서 적는다.

all:
  hosts:
    xxx.xxx.xxx.xxx:
  children:
    webservers:
      hosts:
        xxx.xxx.xxx.xxx:
    dbservers:
      hosts:
        xxx.xxx.xxx.xxx:

 

 

 

Control Node -  Playbook

> playbook의 실행 명령어는 아래와 같다.

아래의 명령어는 inventory의 yaml 파일에 적혀있는 호스트로 playbook의 yaml 파일에 적혀있는 명령어들을 실행한다는 의미이다.

ansible-playbook -i [inventory파일경로] [playbook파일경로]

 

> playbook에 입력되는 내용이 앤서블이 실행하는 코드 단위인 모듈이다.

 

  • 모듈 구성
- name: [이름]	# 앤서블 명령어를 실행할 때 출력되는 내용
  unarchive: 	# 모듈 이름
  become: yes	# 옵션

 

 

  • 명령어) 리눅스 명령어 실행
- name: [이름]	# 앤서블 명령어를 실행할 때 출력되는 내용
  shell: |  
    [명령어]      # 실행할 리눅스 명령어
  become: yes    # 옵션

   or

- name: [이름]
  command: [명령어]
  become: yes

 

 

  • 명령어) yum 명령어로 '아파치 프로그램' 설치
- name: Install the latest version of Apache
  yum:
    name: httpd
    state: latest

 

 

  • 파일) url 통해서 다운로드
- name: [이름]
  get_url:
    url: [다운로드 받을 url]
    dest: [저장할 경로]

 

 

  • 파일) 압축 해제
- name: [이름]
  unarchive:
    src: "[압축 파일 경로]"
    dest: "[해제할 경로]"
    remote_src: yes		# 타겟 서버에 압축 파일이 존재하는지 여부를 세팅. 디폴트 값은 no.
              		   # no인 경우 타겟 서버에 컨트롤 노드에 존재하는 압축 파일을 복사
  become: yes

 

 

  • 파일) 파일 '여러 개' 복사
- name: "copy file"
  copy:
    src: {{ item }}   # 밑에 적은 with_items 로부터 복사
    dest: [사본]
  with_items:  
    - file1
    - file2
    - file3
    remote_src: yes

 

 

  • 파일) 권한 설정
- name: [이름]
  file:
    path: "[경로]"
    mode: 0755   # 권한옵션
  become: yes

 

 

  • DB) 사용자 생성
- name: Create mysql user
    mysql_user:
      login_user: []
      login_password: []
      name: [사용자 이름]
      password: [비밀번호]
      host: '%'
      priv: '*.*:ALL'

 

 

  • DB) 데이터베이스 생성
- name: [이름]
  mysql_db:
    login_user: []
    login_password: []   
    name: [DB 이름]
    state: present

 

 

Control Node - Role 생성

> 노드의 역할을 role로 구분할 수 있다.

 

아래의 코드를 입력하면 role이 생성된다.

ansible-galaxy init [롤 이름]

 

 

Control Node - Role 구성

> role의 tree구조를 봤을 때, 각 디렉토리당 yaml 파일이 생성된다.

 

> 'tasks' 디렉토리: playbook이 들어가게 된다. (필수)

> 'templates' 디렉토리: 복사가 되는 템플릿 파일들이 들어간다.

> 'files' 디렉토리: 여러 파일들이 저장된다.

>  'vars' 디렉토리: 변수가 들어가게 된다.

 

정리해보면 다음과 같다.

  • defaults : 각 task에서 사용할 기본값을 설정
  • files : 정적파일을 두는 폴더
  • handlers : task에서 사용할 handler들을 두는 폴더
  • meta : role의 메타정보 저장
  • tasks : role의 핵심 폴더, role이 실제로 동작할 내용(playbook)
  • templates : Jinja2템플릿 엔진에 기반한 템플릿 파일을 두는 폴더
  • vars : 변수 설정 파일을 모아두는 곳