앤서블은 여러개의 서버를 효율적으로 관리하기 위해 고안된 환경 구성 자동화 도구이다.
앤서블은 플레이 북이라는 곳에 실행할 구성을 선언해 놓으면, 필요할 때마다 자동으로 실행시킬 수 있는 것이 가장 큰 특징이다.
SHH를 기반으로 원격 서버에 명령을 전달하기 때문에 agent가 필요 없다.
리눅스에서 동일한 환경을 구성하기 위해 사용하는 가장 기초적인 방법은 Bash 쉘 스크립트이다.
많은 개발자들은 각종 패키지의 설치, 설정 파일의 수정 등을 위해 일괄 처리 목록을 쉘 스크립트에 나열하고 실행한다. 기술력이 진보함에 따라 인프라 환경도 기존 data center에서 클라우드 환경으로 변화하며 한명의 관리자가 관리해야 하는 거버의 숫자가 증가하게 되었다. 따라서 클러스터에 존재하는 많은 서버들에 동시에, 동일한 환경을 배포해야 하는 상황이 발생했고 Bash 쉘 스크립트의 한계점을 갖게 되었다.
이를 위해 고안된 것이 Infrastructure as a Code이다.
이는 환경의 배포와 구성을 규격화된 코드로 정의해 사용하는 것을 의미한다. 즉, Infrastructure as a Code의 개념을 내포하는 각종 환경 자동화 도구는 인프라의 상태를 코드로 선언하고 이를 모든 서버에 배포함으로써 특정 환경을 동일하게 유지할 수 있도록 돕는다. 그러한 환경 자동화 도구의 대표적인 예시가 앤서블이며, 앤서블은 환경의 배포뿐만 아니라 서버 클러스터의 체계적인 관리, 확장 가능한 모듈의 사용 등 다양한 측면에서 사용될 수 있다.
인벤토리,플레이북,모듈은 어디서 무엇을 어떻게 수행할 지 정의한다.
inventory는 앤서블에 의해 제어되어 infrastructure as a Code의 대상이 될 서버들의 목록을 정의하는 파일이다. 일반적으로 hosts.ini 파일에 정의해 사용하며, 여러 서버들의 SSH접근, ip포트, 리눅스 사용자 같은 접속 정보를 정의한다.
플레이북은 yaml 포맷으로 되어있는 파일로서 인벤터리 파일에서 정의된 서버들에서 무엇을 해야할지를 정의한다.
모듈은 플레이북에서 task가 어떻게 수행될지를 나타내는 요소이다.
티켓 호스트로 실제 작업을 처리하는 단위로 이 모듈이라는 개념을 사용한다. 앤서블은 Python Code를 호출하여 실행하기 때문에 Python이 필수적으로 필요하며, 실제로 앤서블을 설치해보면 다양한 모듈이 같이 설치되는 것을 볼 수 있다.
앤서블을 실행하는 노드이다. /usr/bin/ansible이나 /usr/bin/ansible-playbook 명령을 이용하여 제어 노드에서 관리 노드들을 관리합니다. 앤서블이 설치되어 있으면 노트북이나, 서버급 컴퓨터를 제어 노드로 이용할 수 있다.
앤서블로 관리하는 서버를 매니지드 노드라고 한다. 매니지드 노드는 호스트라고도 합니다. 매니지드 노드에는 앤서블이 설치 되지 않는다.
앤서블의 작업 단위다. 애드훅(ad-hoc)명령을 사용하여 단일 작업을 한 번 실행할 수 있다.
여러번 ansible 툴을 사용하더라도 동일한 결과 값을 나올 수 있도록 제공되는 형태여야 한다.
Ansible 툴의 거의 모든 모듈은 멱등성을 제공한다.
앤서블은 ssh로 제어 노드와 매니지드 노드가 연결된다. 앤서블을 이용해 작업을 진행하기 전에 authorized_keys에 키를 추가하는 것이 좋다.