Ansible 이란?
프로비저닝, 구성 관리, 애플리케이션 배포, 오케스트레이션, 기타 여러 가지 수동 IT 프로세스를 자동화하는 오픈소스 IT 자동화 툴입니다.
출처 : https://www.redhat.com/ko/technologies/management/ansible/what-is-ansible
[개 요] 종 류 : 엔지니어링 |
[목 차]
|
1. Ansible의 주요 개념
제어 노드 (Control Node)
– Ansible 이 설치돼있고 Ansible 을 실행하는 노드
– Ansible 을 통해 관리 노드들을 관리 / 제어
관리 노드 (Managed Node)
– Ansible 이 관리하는 노드 및 호스트, 별도로 Ansible 을 설치하지 않아도 됩니다.
인벤토리 (Inventory)
– 하나 이상의 관리 노드를 관리하는 목록(그룹)이며 호스트파일이라고도 합니다.
– 관리노드들의 IP , 호스트 , 변수정보를 저장합니다.
모듈 (Module)
– 각 작업에 정의된 작업을 수행하기 위해 Ansible이 각 관리 노드(필요한 경우)에 복사하고 실행하는 코드 또는 바이너리입니다.
태스크 (Task)
– Ansible의 작업 단위입니다.
– 단일 작업을 수행합니다.
플레이북 (Playbook)
– YAML 파일로 작성하며, 이름/변수/태스크 등 지정된 순서대로 작업을 수행
2. Ansible 설치
Ansible 을 통합관리를 할 서버에 설치를 진행합니다. 설치는 간단하게 명령어 한줄이면 가능합니다.
yum -y install ansible |
3. 제어노드의 SSH 키 값을 관리 노드로 공유
제어 노드에서 ssh-keygen 을 통해 관리 노드와 공유할 키파일을 생성한 후 ssh-copy-id 를 통해 관리 노드에 공유를 합니다.
ssh-keygen |
ssh-copy-id root@관리노드IP |
ssh key 값이 모두 공유가 되었다면 Ansible 을 테스트하기 위한 관리노드들을 추가해주어야 하는데요.
기본적으로 ansible 설치 시 /etc/ansible/hosts 파일이 생성되며, 해당 파일에 관리노드를 추가해주면 되는데 주석으로 된 내용들은 모두 삭제해주어도 되며, 중간 또는 가장 하단에 작성해주시면 됩니다.
우선 저는 예시로 webservers 라는 그룹을 추가하고 해당 그룹에 관리노드 IP를 작성했습니다.
[웹서버] xxx.xxx.xxx.xxx #관리노드 IP |
위와 같이 작성한 후에 파일을 저장한 후 터미널에 아래와 같이 명령어를 실행해주시면 관리노드와 통신이 되는지 확인해볼 수 있습니다.
ansible all -m ping
정상적으로 통신이 되었다면 위와같이 SUCCESS 메시지가 확인됩니다.
4. Inventory 작성
저는 별도로 group_vars 폴더를 생성한 후 호스트 그룹 관리파일을 생성해보았습니다.
vi /root/group_vars/hosts.yaml |
# 호스트명마다 ansible_host 1개씩 지정 // 질의가 가능한 호스트명으로 설정 시 ansible_host 설정 안해도 됨 children: ## 위에 설정한 변수를 통해 하위그룹 지정 dbservers: |
위와같이 상위그룹 안에 하위그룹을 생성하실 수 있습니다.
ansible 명령어 실행 시 -i 옵션을 통해 인벤토리를 지정할 수 있으며, 별도로 -i 옵션을 지정해주지 않으면 /etc/ansible/hosts 파일을 참조합니다.
5. 패키지 설치
이제 아무것도 설치가 되지 않은 OS 에 서버를 구축하기 위한 기본적인 패키지들을 설치하기 위해 플레이북을 작성합니다.
vi /root/yum_install.yaml |
— tasks: ## 한개의 플레이북으로 여러 작업을 진행하는 경우 태스크를 중복사용하지 않고 한개의 태스크 안에 -name 으로 구분하여 실행해주면 된다. – name: Package install – name: epel-release install – name: update |
yum 설치를 위한 플레이북은 위와같이 설정해준 후 ansible을 통해 플레이북을 실행해줍니다.
ansible-playbook /root/yum_install.yaml -i group_vars/hosts.yaml |
yaml 파일에 작성했던 각 태스크 별로 표시가 되며 문제 없이 정상적으로 설치가 되면 Changed 메세지와 함께 끝이 납니다. 이미 설치된 뒤에 다시 재설치를 하게되면 Ok 값으로만 반환됩니다.
이렇게 패키지들을 설치한 후 추가적으로 작업하기 이전에 보안설정을 해주어야 하는데 여기서는 기본 INPUT 은 모두 DROP 하고 필요한 IP만 접근이 가능하도록 설정해보겠습니다.
6. iptables 설정
** 주의할점은 INPUT 정책을 DROP 으로 변경할 경우 작업자의 IP 및 제어노드의 IP는 허용해주어야 합니다. **
우선 DROP 정책을 적용하기 이전에 허용이 필요한 IP부터 ACCEPT 를 해줍니다.
vi /root/iptables_INPUT.yaml |
— task: |
iptables INPUT 플레이북 실행
ansible-playbook /root/iptables_INPUT.yaml -i /root/group_vars/hosts.yaml |
실행 결과
web1 서버의 예시로 iptables 로 리스트 확인 시 입력한 ip값들이 들어간것을 확인할 수 있습니다.
이제 필요한 IP들을 입력해주었으니 해당 IP외에는 접근하지 못하도록 기본 INPUT 정책을 DROP 시켜보겠습니다.
vi /root/iptables_DROP.yaml |
— task: |
iptables INPUT chain DROP 플레이북 실행
ansible-playbook /root/iptables_DROP.yaml -i /root/group_vars/hosts.yaml |
실행 결과
web1서버의 INPUT 정책이 드랍으로 변경된것을 확인할 수 있습니다.
반대로 다시 DROP -> ACCEPT 로 수정하기 위해서는 위 iptables_DROP.yaml 파일에서 policy item 변수를 ACCEPT 로 수정 후 다시 실행해주시면 됩니다.
다음은 iptables 에 삽입한 룰을 삭제해보겠습니다.
yaml 파일 작성 시 iptables -D 와 같은 delete 옵션은 제공되지 않고 state:absent 를 통해 제거할 수 있습니다.
테스트를 위해 관리 노드 모두 다시 INPUT 정책을 ACCEPT 로 수정하였습니다.
vi /root/iptables_DELETE.yaml |
— task: |
iptables INPUT 했던 규칙 DELETE playbook 실행
ansible-playbook iptables_DELETE.yaml -i /root/group_vars/hosts.yaml |
실행 결과
위에서 적용했던 규칙이 playbook 실행 후 제거된 것을 확인할 수 있습니다.
마치며, ansible 을 통해서 굳이 서버에 들어가서 작업하지 않고 제어노드 하나로도 여러개의 서버를 통합적으로 관리할 수 있다는 점에서 굉장히 편리한 것 같습니다.
다만, 본 글에서는 ssh 키 값을 공유하여 사용을 진행했으나, 해당 문제는 보안상 문제가 있을것으로 보여 이부분을 보완할 필요가 있을 것 같습니다.