메뉴 닫기

Ansible로 패키지 설치,iptables 설정


Ansible 이란?

프로비저닝, 구성 관리, 애플리케이션 배포, 오케스트레이션, 기타 여러 가지 수동 IT 프로세스를 자동화하는 오픈소스 IT 자동화 툴입니다.

출처 : https://www.redhat.com/ko/technologies/management/ansible/what-is-ansible


 

[개  요]

✅종    류 : 엔지니어링 
✅난이도 : ⭐ 
✅내용요약 : Ansible를 이용해 관리 노드에 패키지 설치 및 iptables 설정
✅테스트 환경 : 제어 노드 1대 : Rocky 8  / 관리 노드 3대 : Rocky 8 
✅관련직무 : 시스템&클라우드 엔지니어

 

[목  차]

  1. Ansible 의 주요 개념
  2. Ansible 설치
  3. 제어노드의 SSH 키 값을 관리 노드로 공유
  4. Inventory 작성
  5. 패키지 설치
  6. iptables 설정

 

 

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

Ansible이용을 위한 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

Ansible을 이용한 관리 노드와 ping 체크

정상적으로 통신이 되었다면 위와같이 SUCCESS 메시지가 확인됩니다.

 

 

4. Inventory 작성


저는 별도로 group_vars 폴더를 생성한 후 호스트 그룹 관리파일을 생성해보았습니다.

vi /root/group_vars/hosts.yaml

 

# 호스트명마다 ansible_host 1개씩 지정 // 질의가 가능한 호스트명으로 설정 시 ansible_host 설정 안해도 됨
all: ## 모든 호스트 그룹 변수
  hosts:
    web1: ## 아래 작성한 ansible_host 의 IP를 web1이라는 변수로 설정
      ansible_host: xxx.xxx.xxx.xxx ## 관리 노드 IP
    web2:
      ansible_host: xxx.xxx.xxx.xxx
    db1:
      ansible_host: xxx.xxx.xxx.xxx

  children: ## 위에 설정한 변수를 통해 하위그룹 지정
    webservers: ## webservers 라는 그룹을 만들고 해당 그룹에는 web1,web2 만 지정
      hosts:
        web1:
        web2:

    dbservers:
      hosts:
        db1:

위와같이 상위그룹 안에 하위그룹을 생성하실 수 있습니다.

ansible 명령어 실행 시 -i 옵션을 통해 인벤토리를 지정할 수 있으며, 별도로 -i 옵션을 지정해주지 않으면 /etc/ansible/hosts 파일을 참조합니다.

 

 

5. 패키지 설치


이제 아무것도 설치가 되지 않은 OS 에 서버를 구축하기 위한 기본적인 패키지들을 설치하기 위해 플레이북을 작성합니다.

vi /root/yum_install.yaml

 


– name: OS Base Install
  hosts: all  ## 인벤토리에서 지정한 그룹이름
  become: yes ## sudo 권한 사용

  tasks:  ## 한개의 플레이북으로 여러 작업을 진행하는 경우 태스크를 중복사용하지 않고 한개의 태스크 안에 -name 으로 구분하여 실행해주면 된다.
    – name: groupinstall
      yum:
        name: ## group install 시에는 , 또는 공백으로 처리가 안되는것 같다.
          – “@Base”
          – “@System Tools”
          – “@Development Tools”
        state: present

    – name: Package install
      yum:
        name: psmisc,xinetd,iptables*,net-snmp*,hdparm,lftp,vim,ntsysv,xinetd,cronie,sudo,vsftpd,network-scripts,csh,net-tools,pciutils,langpacks -ko.noarch,wget,rsync,rsyslog
        state: present

    – name: epel-release install
      yum:
        name: epel-release ## 추후 추가 패키지 설치를 위한 release 설치
        state: present

    – name: update
      yum:
        name: “*”
        state: latest ## 가장 마지막 버전으로 모든것을 업데이트

yum 설치를 위한 플레이북은 위와같이 설정해준 후 ansible을 통해 플레이북을 실행해줍니다.

ansible-playbook /root/yum_install.yaml -i group_vars/hosts.yaml

ansible을 이용한 yum install 패키지 결과

yaml 파일에 작성했던 각 태스크 별로 표시가 되며 문제 없이 정상적으로 설치가 되면 Changed 메세지와 함께 끝이 납니다. 이미 설치된 뒤에 다시 재설치를 하게되면 Ok 값으로만 반환됩니다.

이렇게 패키지들을 설치한 후 추가적으로 작업하기 이전에 보안설정을 해주어야 하는데 여기서는 기본 INPUT 은 모두 DROP 하고 필요한 IP만 접근이 가능하도록 설정해보겠습니다.

 

 

6. iptables 설정


** 주의할점은 INPUT 정책을 DROP 으로 변경할 경우 작업자의 IP 및 제어노드의 IP는 허용해주어야 합니다. **

우선 DROP 정책을 적용하기 이전에 허용이 필요한 IP부터 ACCEPT 를 해줍니다.

vi /root/iptables_INPUT.yaml

 


– name: INSERT
  hosts: all
  become: yes
  vars:  ## ip 리스트 변수 선언
    ip_list: 115.xxx.xxx.10,115.xxx.xxx.238

  task:
    – name: iptables INPUT
       iptables:
         chain: INPUT
         source: ‘{{ item.ip }}’
         jump: ACCEPT
       with_items: ## 항목 허용 설정
           – { ip: “{{ip_list}}” }

 

iptables INPUT 플레이북 실행

ansible-playbook /root/iptables_INPUT.yaml -i /root/group_vars/hosts.yaml

실행 결과

 ansible을 이용한 iptables INPUT 실행 결과

web1 서버의 예시로 iptables 로 리스트 확인 시 입력한 ip값들이 들어간것을 확인할 수 있습니다.

ansible을 이용한 iptables INPUT 실행 결과2

이제 필요한 IP들을 입력해주었으니 해당 IP외에는 접근하지 못하도록 기본 INPUT 정책을 DROP 시켜보겠습니다.

vi /root/iptables_DROP.yaml

 


– name: INPUT Policy DROP
  hosts: all
  become: yes

  task:
    – name: iptables INPUT
      iptables:
        chain: INPUT
        policy: ‘{{ item.policy }}’
      with_items: ## 항목 설정 설정
        – {policy: ‘DROP’ }

 

iptables INPUT chain DROP 플레이북 실행

 

ansible-playbook /root/iptables_DROP.yaml -i /root/group_vars/hosts.yaml

실행 결과

 ansible을 이용한 iptables INPUT Chain DROP 실행 결과

web1서버의 INPUT 정책이 드랍으로 변경된것을 확인할 수 있습니다.

ansible을 이용한 iptables INPUT Chain DROP 실행 결과2

반대로 다시 DROP -> ACCEPT 로 수정하기 위해서는 위 iptables_DROP.yaml 파일에서 policy item 변수를 ACCEPT 로 수정 후 다시 실행해주시면 됩니다.

다음은 iptables 에 삽입한 룰을 삭제해보겠습니다.

yaml 파일 작성 시 iptables -D 와 같은 delete 옵션은 제공되지 않고 state:absent 를 통해 제거할 수 있습니다.

테스트를 위해 관리 노드 모두 다시 INPUT 정책을 ACCEPT 로 수정하였습니다.

vi /root/iptables_DELETE.yaml

 


– name: DELETE
  hosts: all
  become: yes
  vars:
    ip_list: 115.xxx.xxx.10,115.xxx.xxx.238

  task:
    – name: iptables DELETE
      iptables:
        chain: INPUT
        source: ‘{{ item.ip }}’
        jump: ‘{{ item.jump }}’
        state: absent
     with_items: ## 항목을 설정
        – { ip: “{ {ip_list}}”, jump: ‘ACCEPT’ }

 

iptables INPUT 했던 규칙 DELETE playbook 실행

 

ansible-playbook iptables_DELETE.yaml -i /root/group_vars/hosts.yaml

실행 결과

ansible을 이용한 iptables INPUT Chain DELETE 실행 결과

위에서 적용했던 규칙이 playbook 실행 후 제거된 것을 확인할 수 있습니다.

ansible을 이용한 iptables INPUT Chain DELETE 실행 결과2


 

마치며, ansible 을 통해서 굳이 서버에 들어가서 작업하지 않고 제어노드 하나로도 여러개의 서버를 통합적으로 관리할 수 있다는 점에서 굉장히 편리한 것 같습니다.

다만, 본 글에서는 ssh 키 값을 공유하여 사용을 진행했으나, 해당 문제는 보안상 문제가 있을것으로 보여 이부분을 보완할 필요가 있을 것 같습니다.

참고문서: https://docs.ansible.com/ansible/latest/index.html

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x