Ansible(앤서블)

Ansible은 오픈 소스 자동화 도구로써 2012년 경에 개발되어 현재는 RedHat사에 인수되었다고 한다.
해당 도구의 쓰임새로는 기존 수동으로 진행하던 시스템 준비절차(Provisioning),
서비스 배포(Service Deployment), 작업 자동화 ... 등

작업의 단순화, 관리 및 편의성을 위하여 사용되는 도구이며
SSH(Secure SHell)을 통하여 작동되고 대부분의 플랫폼에서 동작한다.
ex) Onpremise, Cloud, Virtual ...

이와 비슷한 도구로 Puppet 이라는 도구가 존재하는데,
Puppet과 Ansible의 가장 큰 차이점으로는

 

1. Master, Agent Node의 구분여부

2. 각 도구의 동작방식

Ansible = 서버 → 클라언트(Push)
• Puppet = 클라이언트 → 서버(Pull)

 

3. 사용되는 명세파일(Manifest)의 형식

• Ansible = *.yml
• Puppet = *.pp
. . .

원리를 이해하기 위해 가장 간단한 설정 방식으로 실습을 진행
* 실습환경 : M1 Based Mac(ARM64)
** 네트워크 대역 : 10.211.55.0/24
*** 해당 실습에서 사용된 가상 머신 : Fedora(.20) = Client, Ubunser(.60) = Server

● Ansible 실습

# Ubunser(.60)에서 Ansible 패키지를 다운로드
sudo apt install -y ansible

# Ansible 클라이언트에 대한 정보를 등록
sudo vim /etc/ansible/hosts

 18 # Ex 2: A collection of hosts belonging to the 'webservers' group
 19 [ansible_client]
 20 10.211.55.20 ansible_ssh_user=root ansible_ssh_pass=rootoor

# PublicKey를 이용한 인증방식이 가장 안전하지만 실습 편의를 위해서
# PasswordAuthentication를 통한 인증을 활성화 시켜주었다.

 

/etc/ansible/hosts

* 키가 아닌 일반 패스워드 사용 시 위 그림처럼 설정파일에 평문장으로 저장된다

(위험성 증가로 인해 대부분 사용 x)

 

 

다음으로 호스트에게 전달되어 수행할 작업이 정의되어 있는
명세파일(Manifest File)을 yaml 형식으로 생성한다.

 

# 'sample.yml' 이름의 yml 파일 생성
[centos@localhost ~]$ sudo vim sample.yml

(sample.yml 파일내용)
---
- name: sample book
  hosts: ansible_client
  remote_user: root
  become: true
  tasks:
    - name: install httpd
      dnf:
        name: httpd
        state: latest
    - name: run httpd
      service:
        name: httpd
        state: started
    - name: create content
      copy:
        content: "This is Ansible Test Web Server"
        dest: /var/www/html/index.html
        
# 원격 호스트에 ssh로 접속하여 자동으로 수행될 작업들이 json 형식으로 정의 되어있는 것을 확인할 수 있다.
# yaml 파일의 경우 문법에 굉장히 민감한 형식으로, 현재 코드블럭과 동일한 공백과 문자를 갖을 수 있도록 주의

''' 
작업내용 :
Ansible 클라이언트인 Fedora(.20)의 관리자의 권한으로 'httpd(Latest Ver.)' 패키지를 다운로드,
'/var/www/html/index.html' 파일에 임의의 웹 문서 생성
'httpd' 서비스를 시작
'''

 

sudo ansible-playbook sample.yml --syntax-check

(좌) : 정상표시 / (우) : 오류표시

 

해당 명령어로 작성된 명세파일의 구문오류 혹은 Ansible의 종속 파일과
연결성에 대한 코멘트를 확인할 수 있다. 오류의 내용은 해석하기 어렵지 않으니
조금만 신경써서 읽으면 대부분 간단하게 해결 가능하다.

여기까지 특별한 오류없이 명세파일 작성까지 완료되었다면,
Anisble Server 에서의 설정은 완료됐다.

 

● Ferdora(.20) 원격 접속을 위한 설정

/etc/ssh/sshd_config

키를 이용한 작업 수행 시에는 해당되지 않지만 지금처럼
'root'의 패스워드를 이용하여 직접 'root'의 권한으로 작업 진행 시
근본적으로 root의 패스워드가 설정되어져 있어야 한다.

그리고

SSH 설정 파일에서 미리 RootLogin, PasswordAuthentication 항목을 활성화 해준 뒤,
SSH 서비스를 재시작하여 변경 내용을 저장해준다.

▼ 해당 사항 미설정 시 발생되는 오류의 내용

 

sudo systemctl status httpd

설정파일 수정을 마친 뒤,
현재는 존재하지 않는 httpd 서비스의 상태를 확인

다시 Ansible 서버로 돌아와서

# Ansible-playbook으로 작업 자동화를 시작
sudo ansible-playbook [Manifest File]


실행 시 아래 그림과 같은 에러 메시지가 출력되는 것을 확인할 수도,
없을 수도 있지만 시스템에 아무런 및 패키지 설치없이 실습을 진행 시
다음에 해당하는 에러 메시지를 확인할 수 있다.

▼ 에러 메시지 (1)

" ~ you must install the sshpass program ~ "

메시지의 핵심 구문이다. key가 아닌 password 인증 방식의 ssh 연결을 원한다면
'sshpass' 라는 프로그램이 필요하니 설치하라는 의미

현재처럼 '원격 자동화 작업' 시 SSH의 기존 대화형 인증방식이 아닌
비대화형 인증 방식으로 미리 지정된 파일에 정의 되어있는 원격지의 패스워드를
프로그램 자체에서 읽어들여 사용자의 입력 없이 자동으로 접속을 하게끔 해주는 도구이다.
* 이 부분은 운영체제의 버전 및 레포지토리 별로 약간씩은 차이가 있는 듯 하다


▼ 에러 메시지 (2)

" ~ Please add this host's fingerprint to your known_hosts file ~ "

연결하려는 클라이언트와의 접속 내역(신뢰성)이 없는 경우 발생하는 에러 메시지이다.
이 부분은 현재 실습에서 키가 아닌 패스워드를 이용한 인증으로 인한 부분이라고 생각된다.

ssh [User]@[Client IP]

없다면 만들어주면 된다. 패스워드를 이용하여 SSH 접속을 최초로 요청하면
빨간 상자 안에 표기되어 있는 내용과 같은 알림 문구를 확인할 수 있다.

이렇게 원격 자동화 작업을 하고자는 클라이언트의 SSH 정보를
~/.ssh/known_hosts 파일에 저장하여 추후 연결시에는
해당 질문은 생략된다.

* 간혹 다른 실습을 동시에 진행하며 ssh 관련 파일 및 네트워크가 변경되어
known_hosts에 저장 되어있는 정보와 다를 경우에도 위의 그림과 같은 에러가 발생하니
그럴 때에는 과감히 삭제해주고 새롭게 세션을 형성하여 known_hosts 파일을 갱신해주자

이렇다할 이슈들을 모조리 잡아낸 뒤,

명령어 실행 시 특이사항 없이 정상적으로
작업이 수행되는 모습을 태스크 별로 확인할 수도 있다.

fedora에서 httpd 서비스를 다시 확인

ansible로 작업 수행 전 확인했을 때와 달리
설치와 서비스 시작까지 정상적으로 진행된 모습을 확인

 

firefox http://10.211.55.20

명세파일에 정의된 대로 html 내용이 fedora 웹 서버에 적용된 것을 확인

실습만 봤을 때에는 효율에 대해 의문을 가질 수 있지만,
클라이언트가 수십 ~ 백 개 정도 된다고 가정 해본다면
해당 관리 시스템의 매력을 알아볼 수 있을 것이다.

추후에는 이보다 조금 더 발전시킨 버전의 ansible 실습을 진행해보겠다.
사실 Ansible은 온 프레미스 환경도 좋지만,
클라우드 환경에서 그 진가를 발휘한다고 한다.

'Linux_System' 카테고리의 다른 글

[Linux]DHCP  (0) 2023.02.10
[Linux]Squid(Proxy_Server)  (0) 2023.02.09
[Linux]YUM_Priority  (0) 2023.01.18
[Linux]ZFS  (0) 2023.01.16
[Linux]PAM  (0) 2023.01.12

+ Recent posts