본문 바로가기
IT/Ansible

Ansible - Baseline, Ansible-Playbook

by 스마일엔지니어 2025. 1. 23.
728x90

Ansible이란?

- 표준 작업을 수행하기 위해 체크리스트를 만들고 관리 가이드 및 임기응변, 축적된 경험을 통해 시스템 관리하는 도구

- 동일하게 configuration 됐다하더라도 서버마다 다른 결과를 가짐!! (눈송이 서버 - snowflake server) 

=> 똑같이 같은 결과를 갖도록 성공할 수있도록

- IT 시스템 구성 및 관리 : it시스템은 데이터를 처리하는 프로세스

- 도커의 컨테이너와 비슷

 

주요 특징

-확장성과 유연성: 모듈(파이썬)로 자동화, 네트워크장비까지 configuration 가능

-에이전트 불필요: 버전마다 업데이트하기 때문에 에이전트를 따로 개발할 필요 X

(로키 6,7,8 다 따로 있었는데 그걸 호환성있게 할 수 있음), OpenSSH 이용해서 작업대상 연결

-간단: 사람이 읽을 수 있는 자동화 제공 // 사람이 알아보기 쉬운 yaml 제공 (이와 반대로 json파일은 힘듦)

=> 특별한 코딩 능력 필요하기보단 yaml 문법 지식 필요함

-멱등성과 예측 가능성

멱등성 매우 중요!!! - 항상 같은 결과를 냄

ex. 파드 10개 생성 후 replicas한 후 배포하는데 kubectl을 몇 백번, 몇 천번 쳐더라도 결과는 10개!

 

리눅스 네트워크 설정 명령어 - nmcli

 

 

플레이북 - 자동화하는 문서인 script 짜기

변수 관리

작업 제어 - for / if 문을 통해 동작 제어

파일 관리 - 리눅스는 윈도우와 달리 파일을 오퍼레이팅하는 OS다!! , 파일 관리 모듈들 소개

역할 - galaxy

 

 

 

Ansible - 제어 노드와 관리 호스트 두 가지 유형으로 구성됨

Inventory(인벤토리) - 관리 대상 호스트들을 목록 만들어줌

Play Book(플레이북) - 하나 이상의 플레이를 포함하는 파일 , 실제 수행해야 하는 작업 목록을 정의, Yaml 형식 

하나의 플레이에는 특정 대상 호스트들을 작업 걸어줌, 작업 내용까지 작성되어있고 모듈 통해 구성됨

 

* yaml 파일: 문법이 비교적 간단하고 용이하여 사람이 읽기 편하게 구성되어있음 하지만 주의해야 할 게 있음

ex. 리스트 데이터형은 -(하이픈) 붙여주기, 띄어쓰기, 들여쓰기 이런 거 신경써서 작성!

딕셔너리 데이터 형  key:value

리스트 데이터 형 index:value

 

Connection Plugins

Host Inventory

Playbooks

이 3가지가 중요!!

 

실습) 컨트롤러와 노드 3개 -> ssh key 생성

-호스트 네트워크 설정 (도구 > 네트워크 관리자)

 

-Controller 및 노드 3개 VM 생성

 

 

가상머신 설치할 때 로키9.5를 선택했으나 여기에서 그대로 다른 이미지가 올라가있었다. 이것도 로키 9.5로 설정해주면 에러를 방지할 수 있다. (+재부팅 해줘야 한다)

 

 

 

minimal은 한글 지원안할 수 있기에 영어버전으로 선택해준다.

 

 

Installation Destination은 그냥 automatic 체크되어있기때문에 그냥 들어가서 Done 눌러주면 된다.

User Creation과 Root Password 진행한다.

 

 

 

다 한다음 설치 진행을 해주면 된다. 그리고 리부팅!

 

그리고 root 계정으로 접속하여 poweroff 해준다. (작동되는 동안 복제안됨)

 

 

controller1 오른쪽버튼 눌러 복제버튼 통해 복제해준다.

 

 

-콘솔프로그램 (불편한 단점이 있음)

-MobaXterm (이걸로!)

=> 가상머신 접속

 

172.16.0.200/24 ip를 넣고 호스트이름은 controller로 지정 (가상머신의 이름인 controller1과 상관X) 그리고 재부팅

F\

조회결과 제대로 됐음을 확인할 수 있다. (nmtui, nmcli, hostnamectl )

 

루프백 주소

emp0s3 10.0.0.0

emp0s8 172.16.0.200

 

 

172.16.0.200 주소로 ssh 접속

 

 

+ 세션 생성 시 Bookmark Settings에서 이름을 Controller로 바꿔주면

 

다음과 같은 화면처럼 접속하는것이 보인다.

 

서버abc 각각 작동시켜서 ip (172.16.0.201 202 203/24) 넣고 호스트이름 설정한 후

mobaXterm ssl 접속하여 ansible-user / ansible (passwd) 설정해준다.

 

 

위 사진처럼 사용자 추가 및 사용자에 대한 패스워드 추가하여 접속할 수 있다. 

 

-SSH 인증방식

1. root 계정의 패스워드

2. 공개키 대칭키 //  퍼블릭 키는 aws가 소유, 프라이빗 키를 가지게 됨

secret key는 aws 통한 것이므로 얘는 아님!!

KMS - Key Management Service



이 경우에서 Ansible Management Node가 퍼블릭 및 프라이빗 키를 소유하고 있고 호스트들에게 퍼블릭 키를 제공한다.

 

 

key-gen 키 생성

-t rsa rsa 타입의 키 (디폴트)

-N '' (암호 공백인 이유 - 자동화를 위해서)

-f 파일 경로

 

키가 생성됨을 확인할 수 있음

 

 

172.16.0.201 (serverA) 호스트에 키 부여 

처음부여하는거기에 YES 입력하여 허가해준다.

 

 

ssh 172.16.0.201 통해 어떤 옵션없이도 서버A에 접속하는 것을 확인할 수 있다.

 

ssh user@HOST  [user 생략할 경우 현재 위치에 있는 사용자 계정이 자동으로 들어감]

 

 

 

 

controller에서 ansible-user 계정접속하고 key-gen하여 키를 생성한다. 

그리고 그 키를 172.16.0.201 202 203에 ssh-copy-id를 통해 부여해준다. (사진은 서버A만 B,C도 같은 방식으로)

키를 부여하고나면 ssh ip주소 통해 접속할 수 있음을 확인할 수 있다.

 

 

각 서버 접속 확인, 그리고 ssh ip주소 hostname 치면

호스트이름을 출력결과로 받을 수 있다.

 

 

호스트이름 바꾸는 방법

hostnamectl set-hostname [호스트이름]

bash 

해주면 호스트이름이 바꿔서 나온다.

 

 

실습 2)  ansible-user에 sudo 권한 부여

 

 

이 부분에 ansible-user를 추가하여 sudo install을 할 수 있게 한다.

그리고 vi 편집기 통해 /etc/sudoers.d/ansible-user(파일 생성하기에 이름상관 X)

 

편집기 들어가서 다음과 같은 내용을 넣어준다.

 

 

그럼 설치가 안되던 계정이었는데 sudo를 이용하여 설치할 수 있음을 확인할 수 있다.

 

*epel-release (Extra Package for Enterprise Linux)

 

설치한 패키지 목록을 조회했을 때 repo형식의 내용물들이 조회될 수 있다.

 

 

ansible 설치  + 서버 A, B, C에도 똑같이 할 수 있게 SUDO 권한 설정한다.

 

제어 노드에 호스트 이름 부여

 

 

/etc/hosts 파일들어가서 다음과 같은 내용을 추가한다.

 

ip주소가 아닌 /etc/hosts에 정의된 이름으로도 접속할 수 있는 것을 확인할 수 있다.

 

 

플레이북 실행

Ansible 사용하기 위핸 작성된 코드를 가진 파일 필요 -> 크게 3가지 유형

1. Configuration File (구성 파일)

2. Playbook File

3. Inventory

 

-Configuration File (구성파일)

: Ansible 사용하기 전 연결 설정이나 권한 설정들을 변경

기본적으로 /etc/ansible/ansible.cfg에 위치

ansible --version 통해 확인 가능 // working directory에 구성 파일이 있다면 읽는 것에 대한 우선순위가 높음

현재 디렉토리에서 .ansible.cfg 파일 생성하여 다시 확인해보면 바껴있다.

 

 

*중요* (시험에 나옴...)

remote_user : 관리 호스트에 ssh 연결할 때 사용할 사용자 이름 지정. 지정하지 않았을 경우 현재 사용자의 이름이 지정ask_pass : 관리호스트에 ssh 연결할 때 암호를 묻는 메세지 표시 여부를 지정.

become: 권한 상승할건지 아닐건지 (sudo / su 이용해서 권한상승, 디폴트는 false)

become_user ( 디폴트는 root )

 

 

실습

 

홈디렉토리인 경우 .ansible.cfg

그냥 디렉토리면 앞에 .삭제

 

 

 

ansible.cfg에 내용추가

 

-Inverntory 파일을 정적 / 동적 구성 가능

 

정적 인벤토리: 하나하나 일일이 리스트 업  (ip, 호스트 이름)

vi inventory 들어가서

대상 호스트들의 이름을 넣어준다.

inventory 파일에서 [] 이용해서 그룹화도 가능하다. // 그룹화하지 않을 호스트들은 위에 다 작성, 그룹화 호스트들은 아래

 

 

-all, ungrouped

all : 모든 호스트들을 포함하는 목록

ungrouped: 인벤토리에서 그룹에 속하지 않는 모든 호스트들을 목록

 

-중첩 그룹 ([ : ] 표시, 개발에서 '상속' 개념과 비슷)

 

-범위 지정: 많은 호스트들을 관리할 때 간단하게

ex. server[a:z]  -> servera ~ serverz

 

-인벤토리 파일 위치 재정의

-i 옵션 사용하거나 defaults 섹션에서 inventory 파일의 위치 정의 가능

 

 

동적 인벤토리: 가상 머신 목록에 있는 ip들을 자동으로 인벤토리에 넣어줌. 클라우드 벤더에서 script 파일 형식을 제공하여 실행   (디렉토리에서 script 파일 넣고 이 디렉토리를 인벤토리로 지정하여 자동으로 실행) 

 

 

 

 

 

 

 

 

728x90