1. Ansible 이란?
2023.12.25 - [IaC/Configuration Management] - Ansible 활용 - ansible-galaxy에 Role/Collection 업로드
2024.02.29 - [Open Source Software] - Cephadm-ansible이란?
Ansible은 인프라 관리를 코드 기반으로 자동화하는 도구입니다.
Infrastructure as Code (IaC) 로서 IT 인프라를 코드 기반으로 자동 설치 및 구축/관리/프로비저닝 하는 프로세스를 말합니다.
여기서 프로비저닝이란 IT 인프라를 설정하는 프로세스입니다. 사용자와 시스템에서 사용할 수 있도록, 데이터와 리소스에 대한 엑세스를 관리하는데 필요한 단계를 지칭하기도 합니다.
과거에는 관리자들이 다양한 IT 인프라들에 직접 접속하여 필요한 프로그램들을 수동으러 설치하고 셋팅해왔습니다.
그런데 IaC라는 컨셉이 등장하고 관련 도구들이 나오면서 자동화된 인프라 구축이 가능해졌습니다.
코드 스크립트를 실행하기만 하면 코드가 알아서 다 해주게 된거죠.
관리자들은 더 이상 인프라 자원에 접속할 필요도, 설치와 설정을 수동으로 수행할 필요도 없어졌습니다.
Ansible은 이런 IaC를 지향하는 오픈소스 기반의 자동화 관리 도구 입니다.
자동 구축/관리 하려는 원격 인프라에 무언가 명령을 전달하는 방식으로 동작 합니다.
Ansible 의 특징은 아래와 같습니다.
1) Agentless
앤서블(Ansible)은 SSH를 기반으로 원격 서버에 명령을 전달하기 때문에 에이전트가 필요 없습니다.
2) 접근 용이성
앤서블은 이러한 명령 모음집(뒤에서 소개할 playbook)을 YAML형식의 파일로 관리 합니다.
YAML 파일의 훌륭한 가독성 덕분에 사용자들이 느끼는 앤서블의 진입장벽이 낮습니다.
3) 멱등성 (idempotence)
멱등성이란 여러번 수행해도 같은 결과를 뱉는 성질을 말합니다.
앤서블은 YAML로 관리되는 명령집을 여러번 수행하더라도 언제나 같은 결과가 나올 수 있도록 여러가지 관리를 합니다.
2. Ansible 관련 용어
1) Controller 서버
Ansible을 설치되는 서버로!
Ansible 명령을 여러 원격 서버에 전달하는 주체가 되는 서버를 말합니다.
2) 인벤토리(Inventory) (=Ansible hosts 라고도 함)
Controller 서버가 명령을 전달할 원격 서버들의 목록을 말합니다.
/etc/ansible/hosts 파일에 이 원격 서버들 목록이 저장되어 있으며, 이 파일을 인벤토리라고 합니다.
3) 플레이북(Playbook)
원격 서버에 전달할 명령들을 모아둔 명령집 입니다.
스크립트 파일이라고 생각하시면 편할 것 같네요!
3. Ansible 설치와 초기 설정(CentOS 7.9)
1) Ansible 설치 (CentOS 7.9)
ansible 설치는 controller 서버에만 하면 되겠죠?
controller 서버에 접속하시고,
가장 먼저 EPEL yum 레포지토리를 추가합니다.
$ yum install -y epel-release
EPEL 레포지토리가 정상적으로 추가 되었는지 레포 목록을 확인해봅니다.
$ yum repolist
이제 yum을 통해 ansible을 설치한다!
$ yum install -y ansible
Ansible 설치 확인!!
$ ansible --version
2) ssh key 생성
Ansible은 SSH 접속을 기반으로 원격 서버들에게 명령을 전달합니다.
따라서 Controller 서버와 원격 서버간 SSH key가 공유되어야 합니다.
Controller 서버에서 모든 작업을 완료할 수 있습니다.
Controller 서버에서 ssh key를 하나 생성합니다.
$ ssh-keygen
이제 생성된 key를 원격 서버에 복사 합니다.
중간에 원격 서버의 계정 비밀번호를 입력하셔야 합니다.
$ ssh-copy-id [원격서버계정ID]@[원격서버IP]
정상적으로 ssh key가 복사되었다면,
controller 서버에서 원격 서버로 ssh 접속을 시도할 때,
비밀번호 입력없이 바로 접속이 되어야 합니다.
확인해볼까요?
$ ssh [원격서버계정ID]@[원격서버IP]
네, 비번 입력 없이 바로 원격 서버에 접속이 되는것을 확인했습니다.
3) 인벤토리파일 작성
/etc/ansible/hosts 가 인벤토리 파일이라고 말씀드렸습니다.
이 파일을 열고, 원격 서버 IP를 작성해주세요!
인벤토리 작성 문법은 다양합니다.
여러가지 기능을 활용하고 싶으시면 인벤토리 작성법을 검색해서 참고하세요!
이번 글에서는 간다히 ansible을 테스트만 해볼거라, 가장 기초 기능만 활용하겠습니다.
$ vi /etc/ansible/hosts
인벤토리 목록에 있는 서버들로 접속이 정상적으로 이루어지는지를 확인합니다
$ ansible all -m ping
위 사진 처럼, 모든 원격 서버 목록이 SUCCESS여야 합니다~!
자, 그럼 ansible 사용을 위한 설치와 초기 설정이 모두 완료 되었습니다.
4. Ansible 명령
여기서는 간단한 기능을 확인하기 위해 플레이북이 아니라,
한 줄 한 줄 명령줄을 입력해보겠습니다.
Ansible 명령 구조는 아래와 같습니다.
$ ansible [host 또는 host그룹] options
[host 또는 host그룹]에 ansible 명령을 전달할 원격 서버들을 설정합니다.
일반적으로 'all' 을 사용하면 인벤토리에 적혀있는 모든 원격 서버에 명령을 전달합니다.
가장 많이 사용되는 옵션은 '-m' 옵션으로,
ansible에서 실행할 모듈을 불러오는 옵션입니다.
모듈마다 필요한 인자값들이 다르니 그때그때 확인하셔야 합니다.
저희는 Controller 서버에 test.txt라는 파일을 만들어두고,
이 파일을 ansible 을 통해 원격 서버에 복사해보겠습니다.
아래 명령으로 수행할 수 있습니다.
$ ansible all -m copy -a "src=~/test.txt dest=~/test.txt"
host 값에는 all을 넣어 인벤토리에 있는 모든 원격 서버에 명령을 전달하게끔 했고,
copy라는 모듈을 불러와서 파일 복사 명령을 수행하도록 했습니다.
'-a' 옵션은 copy 모듈에 필요한 인자값을 전달하는 옵션으로, src file경로와 dest file 경로를 전달해주었습니다.
Controller 서버에서 위 명령을 수행하면 아래와 같은 화면을 보실 수 있습니다.
네, test.txt 파일이 보이네요. 잘 복사 되었습니다.
5. Ansible 구성파일
- /etc/ansible/ansible.cfg
> Ansible 환경 설정 파일
- /etc/ansible/hosts
> Ansible 이 접속하는 호스트들에 대한 정보
> [***] 와 같이 그룹지정도 가능
- Ansible imperative command 명령어 정보
-i (--inventory-file) : 적용될 호스트들에 대한 파일
-m ( --module-name ) : 모듈을 선택할 수 있도록
-k (--ask-pass) 패스워드 물어보도록 설정
-K (--ask-become-pass) root로 권한 상승
--list-hosts: 적용되는 호스트들을 확인
ex)
# ansible nginx -m ping -k
nginx 그룹에 ping 모듈 명령어를 패스워드 물어보며 전달
# ansible all -i test -m shell -a "ps -ef" -k
test파일에 있는 호스트들에 shell 모듈을 사용하여 argument 인 ps -ef 명령어를 패스워드 물어보며 전달하고 결과를 알려줌
6. Ansible 실습
1) 한번에 명령으로 다수의 시스템 작업하기
(shell, user, copy 모듈 사용)
uptime 확인하기
$ ansible all -m shell -a "uptime" -k
디스크 용량 확인하기
$ ansible all -m shell -a "df -h" -k
메모리 상태 확인하기
$ ansible all -m shell -a "free -h" -k
새로운 유저 만들기
$ ansible all -m user -a "name=madal password=1 shell=/bin/bash" -k
파일 전송하기
$ ansible all -m copy -a "src=/etc/resolv.conf dest=/etc/resolv.conf" -k
(yum 모듈 사용)
$ ansible rocky -m yum -a "name=httpd state=present" -k
$ ansible rocky -m shell -a "rpm -qa | grep httpd" -k
(apt 모듈 사용)
$ ansible rocky -m yum -a "name=httpd state=present" -k
$ ansible ubuntu -m shell -a "dpkg -l | grep apache2" -k
이렇게 ansible에 대해 이해하고, 직접 ansible을 설치 및 사용해보았습니다.
'IaC > Configuration Management' 카테고리의 다른 글
Git에서 2개의 계정(SSH Key) 사용하기 (2) | 2024.06.13 |
---|---|
Git Rebase vs Merge (0) | 2024.06.03 |
Ansible 활용 - ansible-galaxy에 Role/Collection 업로드 (0) | 2023.12.25 |