Programming/CICD 도구

[DevOps/CICD] Ansible 이란?

MOONCO 2023. 3. 10. 00:34

 

Ansible 이란?

원격 컴퓨터 자동 관리 툴

( RedHat에서 만들었다 ) 

 

필요성

원클릭 서버(Front, Back 등등) 배포 가능

 

구조

제어 컴퓨터 ( Control node )
- 다른 컴퓨터를 관리하는, 관리자 컴퓨터
- 내부에 관리할 내용( inventory )이 들어있다.

관리(당하는) 컴퓨터 ( Manage node ) - 호스트, 노드 라고 부른다.

 

설치

python3 -m pip install --user ansible

# centos
sudo yum install ansible

# ec2
sudo amazon-linux-extras install ansible2

 

사용법

 

1. 기본 파일 사용하기

ansible 폴더 구조

inventory 구조 및 설명

[hosts] - 관리용 컴퓨터 등록 파일을 넣는 곳
[roles] - 처리할 작업을, 분리 해놓는 곳 ( playbook )
[vars] - 변수를 지정하는 곳 ( playbook )

admin - 관리용 컴퓨터 등록
ansible.cfg - 기본 설정 적는 곳

 

원격으로 관리할 컴퓨터들의 리스트 (inventory) 작성 (EC2)

# /etc/ansible/hosts - 기본 파일 위치 ( 개인마다 다를 수 있음 )
# ./hosts/hosts - 사용자 지정 위치

[app] # 호스트 그룹 이름 지정
192.0.2.50 # 호스트 작성
192.0.2.51

[app:vars] # 호스트 그룹 변수 지정
ansible_ssh_private_key_file=키 파일 지정 #( .ssh/my-ec2-keypair.pem )
ansible_user=접속할 유저 명 #( ec2-user )

[app:children] # 호스트 자식 그룹 지정
192.0.2.52

 

invertory 에서 호스트 확인

ansible all --list-hosts

Ansible - 호스트 연결

authorized_keys 에, 공개 SSH key 등록 ( 초기 ssh 연결시 등록가능 )

* 이때, 원격호스트의 계정(Managed User)와, 접속하는 계정(Control User)이름이 같아야한다.
( 만약 다르면 -u username으로 지정 )
# 등록한 host ssh 접속
ssh -i "my-ec2-keypair.pem" ec2-user@192.0.2.50

# host 접속 종료
exit

# ansible 로, host 연결(ping) 테스트
ansible all -i hosts/hosts -m ping -u ec2-user -f 30

# -i : invertory 파일 지정
# -u : 접속 유저 지정
# -f : 병렬 처리 가능 수 지정
# -l : 특정 호스트 or 그룹 지정가능 ( -l "192.0.2.51" )
# -e : 추가 변수 사용

 

기본 설정 지정하기

# ansible.cfg - ansible 폴더에 저장
[defaults]
# default is 30 - 병렬 수행할 수 있는 최대 개수
forks = 50
# remote_user = ec2-user # 기본 사용자 지정 가능
# default port
remote_port = 22 
# host_key_checking = False # - key 파일 검사 여부
# role_path = ./roles # - roles 위치 지정 (playbook)

 

설정 등록 확인

ansible all -i hosts/admin -m ping

 

2. Inventory + Ansible Playbook

yaml( or yml ) 파일을  작성해서,

작업하는 컴퓨터와,  여러 작업들을 분리한다!

 

yaml 방식으로 inventory 작성

# ./hosts/inventory.yaml
app:
  hosts:
    ec2: 
      ansible_host: 43.201.81.66
  vars:
    ansible_ssh_private_key_file: .ssh/my-ec2-keypair.pem
    ansible_user: ec2-user

 

play 파일 작성

# ./playbook.yaml

- name: My first play
  hosts: app # 인벤토리의 호스트 or 호스트 그룹 선택
  tasks: # 작업 리스트 작성
   - name: Ping my hosts # 작업 이름 지정
     ansible.builtin.ping: # ping 테스트
   - name: Print message
     ansible.builtin.debug:
       msg: Hello world # 콘솔창에 메시지 찍기

 

파일 실행하기

ansible-playbook -i inventory.yaml playbook.yaml

# -i : inventory 를 사용한다.

실행한 작업, 메시지 출력!

 


심화 버전

 

Inventory 에서, 호스트 그룹짓기 & 연결하기

# ./hosts/inventory.yaml
datacenter:
  children:
    network:
    webservers:

network:
  children:
    app:

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
      http_port: 80
    webserver02:
      ansible_host: 192.0.2.141
      http_port: 443

app:
  hosts:
    ec2: 
      ansible_host: 43.201.81.66

 

Playbook 파일 분리하기

[Play]
- 하나의 호스트 관리 파일
- roles, vars, tasks 구조

[roles]
- Play의 담당 역할
- 여러 작업(tasks)을 하나로 묶어서 관리

[tasks]
- 호스트가 실제로 수행할 작업

[handler]
- 작업이 변경될때마다 알려줌
- name: test ping
  vars_files: # 변수파일 지정
    - ../group_vars/common.yml
  hosts: all
  vars:
    touch_files_path: /home/deploy/touch_files
    id: jacob
  tasks:
    - name: make directory
      file:
        path: "{{touch_files_path}}"
        state: directory
        
    - name: touch file
      file:
        path: "{{touch_files_path}}/{{id}}.txt"
        state: touch
반응형