Ansible: 강력한 IT 자동화 플랫폼
Red Hat에서 개발한 오픈 소스 프로젝트인 Ansible은 Python을 기반으로 하며, 시스템 구성 관리 및 IT 자동화 분야에서 널리 사용되는 도구입니다.
Ansible은 다양한 운영체제를 지원하여 Linux, Windows, Mac 등 대부분의 최신 운영체제에서 원활하게 작동합니다. 시스템 구성 정의를 위해 YAML(YAML Ain’t Markup Language)로 작성된 선언적 언어를 사용합니다.
Ansible은 현대적인 구성 관리 플랫폼과 함께 IT 자동화 및 산업 표준을 선도하고 있습니다. 구성 관리 도구는 DevOps 도구 모음의 핵심 요소이며, 현대 IT 프로세스에서 필수적인 부분을 차지합니다. 온프레미스, 하이브리드 또는 클라우드 환경 등 어떤 인프라 환경에도 적용 가능하며, DevOps 뿐만 아니라 시스템 관리자가 매일 수행하는 여러 작업을 자동화하는 데 효과적입니다.
Ansible의 가장 큰 장점 중 하나는 에이전트가 필요 없다는 점입니다. 대상 시스템에 SSH 접속이 가능하고, Python 버전이 설치되어 있다면 바로 사용할 수 있습니다. 또한 가벼운 도구이므로 기존 시스템부터 최신 시스템까지 폭넓게 활용할 수 있습니다.
Ansible의 주요 활용 사례
오케스트레이션
Ansible은 다양한 시스템 관리 및 배포 작업을 조율하는 데 최적화된 도구입니다. 플레이북을 활용하여 여러 프로젝트에서 동일한 오케스트레이션 워크플로를 적용할 수 있으며, YAML 기반 구성 데이터를 통해 인프라를 Git 저장소나 다른 버전 관리 플랫폼에 저장하고 관리할 수 있습니다.
애플리케이션 배포
단순한 코드 애플리케이션부터 복잡한 다중 계층 배포까지, Ansible은 애플리케이션 배포의 전 과정을 자동화할 수 있습니다.
보안 및 규정 준수
Ansible은 조직의 보안 정책을 준수하고 산업 표준을 따르도록 시스템을 강화하는 데도 유용합니다. 수많은 서버에서 실행되는 작업을 자동화하고, 감사 결과를 생성하며, 보안 취약점을 수정함으로써 관리자는 환경을 효율적으로 제어할 수 있습니다.
이제 Ansible을 사용하여 자동화할 수 있는 일반적인 시스템 관리 작업 몇 가지를 살펴보겠습니다.
로컬 및 원격 시스템 간 파일 복사
시스템 관리자는 종종 한 디렉토리에서 다른 디렉토리로 파일을 복사해야 합니다. 구성 파일을 원격 서버로 복사하거나, 원격 위치 간에 파일을 이동해야 하는 경우가 많습니다.
Ansible의 복사 모듈을 사용하면 플레이북 내에서 이러한 파일 복사 작업을 쉽게 처리할 수 있습니다.
시스템 관리자는 관리 대상 서버의 상태를 확인하고, 미리 정의된 작업을 수행해야 합니다. 그 중 하나는 서버 가동 시간을 확인하는 것입니다. Ansible을 사용하면 가동 시간 값을 쉽게 가져와 출력할 수 있습니다. 다음은 복사 모듈을 사용하여 로컬에서 원격 서버로 NTP 구성을 복사하는 예시입니다.
--- - hosts: all gather_facts: no become: yes tasks: - name: Copy a new ntp configuration file and back up the original, if it differs copy: src: ./ntp.conf dest: /etc/ntp.conf owner: root group: root mode: '0644' backup: yes
크론 작업 설정 및 관리
정해진 시간에 작업을 예약하는 것은 서버 관리의 필수적인 부분입니다. 자동 백업, 패치 적용, 감사 등 다양한 작업을 자동으로 실행하도록 설정하면 관리자는 더 중요한 업무에 집중할 수 있습니다.
cron은 작업 스케줄링을 지원하는 Linux 도구 중 하나이며, Ansible은 이러한 크론 작업을 추가하거나 수정하는 데 도움을 줍니다. 다음 플레이북은 Ansible을 사용하여 여러 서버에서 rsync 작업을 root 권한으로 쉽게 설정하는 방법을 보여줍니다.
--- - hosts: all gather_facts: no become: yes tasks: - name: Deploy cron job cron: name: "Set rsync job" user: root minute: "5" hour: "4" job: "rsync -avz /path/to/folder1 /path/to/folder1 2>&1"
디스크 및 파일 시스템 관리
Ansible을 사용하면 Linux 서버에서 /etc/fstab을 포함한 디스크, 파티션 레이아웃, 파일 시스템 및 마운트를 관리할 수 있습니다. 다양한 Ansible 모듈이 이러한 작업을 지원합니다. 다음 예시는 100GB 디스크에 파티션을 생성하고, ext4 파일 시스템으로 포맷하고, 파티션을 마운트할 새 디렉토리를 만들고, 지정된 디렉토리에 마운트하는 과정을 보여줍니다. /etc/fstab 항목은 모듈 옵션에 따라 임시 또는 영구적으로 생성됩니다.
--- - hosts: all gather_facts: no become: yes tasks: - name: Create a partition parted: device: /dev/sdb number: 1 part_end: "100%" state: present - name: Format new partition filesystem: fstype: ext4 dev: /dev/sdb1 - name: Create mount directory file: path: /data state: directory - name: Mount partition mount: path: /data src: /dev/sdb1 fstype: ext4 state: mounted
서버 로그 수집
로그를 안전한 장소에 보관하는 것은 보안, 감사 및 분석에 필수적입니다. Ansible을 사용하면 여러 서버에서 로그를 수집하여 지정된 위치에 쉽게 저장할 수 있습니다. 다음은 이를 위한 플레이북 예시입니다.
--- - hosts: all gather_facts: no become: yes tasks: - name: Find logs find: paths: /var/log/ patterns: '*.log' recurse: yes register: _logs - name: Fetch logs fetch: src: "{{ item.path }}" dest: /tmp/logs with_items: "{{ _logs.files }}"
패키지 및 소프트웨어 설치 및 제거
패키지는 사용자 요청에 따라 또는 초기 서버 구축 과정에서 설치해야 합니다. 또한 더 이상 필요하지 않거나 심각한 버그가 있는 특정 패키지를 제거해야 할 수도 있습니다. Ansible을 사용하면 각 서버에 수동으로 명령을 실행할 필요 없이 패키지를 쉽게 설치하거나 제거할 수 있습니다. 다음은 Ubuntu 및 RHEL/CentOS 기반 Linux 서버에서 패키지를 설치 및 제거하는 방법을 보여주는 예시입니다.
--- - hosts: ubuntu gather_facts: no tasks: - name: Install lsof utility apt: pkg: lsof state: latest sudo: yes - name: Remove ARP Scan utility apt: pkg: arp-scan state: absent sudo: yes --- - hosts: centos gather_facts: no tasks: - name: Install lsof utility yum: pkg: lsof state: latest sudo: yes - name: Remove ARP Scan utility yum: pkg: arp-scan state: absent sudo: yes
사용자 및 그룹 관리
사용자 및 그룹은 Unix/Linux 시스템이 액세스 및 권한을 관리하는 기본 구조입니다. 대규모 조직에서는 환경 지원을 자동화하더라도 사용자 및 그룹을 관리하는 것이 큰 과제일 수 있습니다.
Ansible을 사용하면 시스템 관리자는 OS에서 지원하는 다양한 기능을 활용하여 사용자 및 그룹을 생성, 수정 및 삭제할 수 있습니다.
다음은 Ansible을 사용하여 사용자 및 그룹을 만들고 삭제하는 간단한 예시입니다. 이 플레이북을 실행하면 대상 서버에 주어진 GID로 생성된 groupA 및 groupB가 있으며, user1은 존재하면 삭제됩니다. 쉘이 없는 새 사용자는 주어진 UID, 할당된 그룹 및 잠긴 암호를 사용하여 user2로 생성됩니다.
--- - hosts: all gather_facts: no become: yes tasks: - group: gid: 12310 name: groupA state: present - group: gid: 12311 name: groupB state: present - user: name: user1 state: absent - user: name: user2 uid: 12427 shell: /bin/false password_lock: yes groups: groupA, groupB
서비스 관리
서비스는 백그라운드에서 실행되는 프로세스 데몬으로, SSH 연결 등을 제공합니다. Ansible을 사용하여 시스템 서비스 및 사용자 서비스를 시작, 중지 및 다시 시작할 수 있습니다. 다음은 이를 보여주는 샘플 플레이북입니다.
--- - hosts: all gather_facts: no become: yes tasks: - name: Restart ssh daemon service: name: ssh state: restarted - name: Restart sssd daemon service: name: sssd state: stopped - name: Restart httpd daemon service: name: httpd state: started
위 예시에서 SSH 서비스는 다시 시작되고, SSSD 서비스는 중지되며, httpd 데몬은 시작됩니다. Ansible은 멱등성을 지원하므로 이미 시작되거나 중지된 서비스는 변경되지 않으며, 다시 시작하면 서비스 상태가 변경됩니다. 다른 Linux 배포판은 동일한 서비스에 대해 다른 이름을 사용할 수 있으므로 서비스 이름을 확인해야 합니다.
결론
Ansible은 반복적이고 시간이 많이 소요되는 작업을 자동화하여 시스템 관리자의 업무 부담을 줄여줍니다. 또한 인적 오류를 줄이고 효율성을 높일 수 있습니다. 구성 데이터를 Git과 같은 중앙 코드 저장소에 저장하여 여러 사용자가 협업하고 변경 사항을 추적하는 데 유용합니다.
Ansible과 광범위한 모듈에 대한 자세한 내용은 다음 공식 문서를 참조하십시오. Ansible 공식 문서