Ansible 을 활용한 NPM 서버 구축
참고 링크 : https://sysdocu.tistory.com/1858
▶ 목차
- Ansible?
- Ansible 기본 설치 및 설정
- NPM 서버 구축
- 테스트 및 정리
01. Ansible?
안녕하세요. Ansible을 활용하여 클라이언트 서버에 NPM 서버를 구축하는 방법에 대해 알아보겠습니다.
먼저 Ansible이란, 오픈 소스 IT 자동화 도구로서, 구성 관리, 애플리케이션 배포, 작업 자동화 등 다양한 IT 작업을 자동화하는 데 사용됩니다.
Ansible은 에이전트를 필요로하지 않고 SSH를 통해 호스트에 명령을 전송하여 작업을 수행하는 특징을 가지고 있습니다.
다음은 Ansible의 주요 특징과 사용 방법에 대한 개요입니다.
주요 특징
- 에이전트리스 구조: Ansible은 에이전트를 필요로하지 않습니다. 대상 호스트에 에이전트를 설치할 필요가 없으므로 구성이 간단합니다.
- 사용자 친화적인 언어: Ansible은 YAML을 사용하여 작성된 플레이북(Playbook)이라 불리는 구성 파일을 통해 작업을 정의합니다. YAML은 가독성이 높고 사용하기 쉬운 언어입니다.
- 모듈 기반: Ansible은 다양한 모듈을 제공하여 시스템 관리, 네트워크 설정, 클라우드 관리 등 다양한 작업을 수행할 수 있습니다. 모듈은 Ansible이 호스트에서 실행하는 작업을 정의합니다.
- 플레이북(Playbook): 플레이북은 Ansible 작업을 설명하는 YAML 파일입니다. 호스트에서 실행해야 하는 일련의 작업과 목표를 정의합니다.
- 인벤토리(Inventory): 인벤토리는 Ansible이 작업을 수행할 대상 호스트 목록을 정의합니다. 호스트 및 호스트 그룹은 INI 파일 또는 YAML 파일을 사용하여 정의됩니다.
- 롤(Role): 롤은 Ansible 코드를 구성하여 재사용 가능한 모듈로 만들 수 있는 추상화 단위입니다. 코드의 구조화와 모듈 재사용을 쉽게 만듭니다.
02. Ansible 기본 설치 및 설정
- 기본 서버 설정 및 Ansible 설치
# yum update -y # yum upgrade -y # yum install epel-release -y // ansible을 설치하기 위한 선행 패키지 설치 # yum install ansible sshpass -y // SSH 기반으로 명령을 수행하기 때문에 sshpass 패키지까지 설치 # ansible --version ansible 2.9.27 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Jun 20 2023, 11:36:40) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
- Inventory 설정
관리하는 서버의 정보를 담은 파일을 아래와 같이 생성합니다.
섹션 이름은 서버를 그룹핑하기 위한 명칭으로 적절히 설정하면 되고,대상 호스트는 IP 또는 도메인으로 입력할 수 있습니다.
섹션 내에 여러대의 호스트 추가가 가능합니다.
# vi servers.ini [Client] 115.68.249.31
- SSH 공개키 복사
Ansible 은 ssh 를 이용하여 대상 호스트로 명령을 수행합니다.
ssh 공개키를 생성하고 대상 호스트에 설정해두면 Ansible 명령 실행시마다 패스워드를 입력하는 번거로움을 줄일 수 있습니다.# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): // 입력값 없이 Enter Enter passphrase (empty for no passphrase): // 입력값 없이 Enter Enter same passphrase again: // 입력값 없이 Enter Your identification has been saved in /root/.ssh/id_rsa Your public key has been saved in /root/.ssh/id_rsa.pub The key fingerprint is: SHA256:2bKuWWJfCBqiNnkCYgKZRmI6GEZDynqWbGM41/TsbAk root@kuru80-223962 The key's randomart image is: # ssh-copy-id root@115.68.249.31 ( Client Server IP ) => 패스워드 입력 없이 원격 접속 가능
- 연결 테스트
★ Ansible에서 주로 사용하는 옵션 3가지
- -m : 모듈
- -i : 인벤토리
- -u : 유저명
유저명은 제외하고 아래와 같이 Inventory ( servers.ini ) 파일에 등록된 호스트에 Ping Test 실행
all 말고 섹션명 지정 시 인벤토리 내의 특정 세션에 등록된 호스트로만 명령 실행
# ansible -i servers.ini all -m ping 115.68.249.31 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
- playbook 활용 예시
- 대상 서버로 파일 복사하기
# vi copy.yaml --- - name: Copy a file to a remote server hosts: Client become: yes # root 권한으로 실행하기 위해 필요한 옵션 tasks: - name: Copy a file copy: src: /root/servers.ini dest: /root/
– 플레이북 파일의 시작은 — 로 시작하고, 여러개의 작업이 있을 경우 작업 단위마다 – 으로 구분해줘야 합니다.
– hosts : 섹션을 지정합니다. hosts를 web 섹션으로 하지 않고 all로 입력할 경우, 인벤토리에 등록된 모든 호스트로 파일을 복사하게 됩니다.
– name : 작업을 구분하기 위한 명칭입니다. (위, 아래 둘 다)
– copy : 복사하려는 로컬 파일과 붙여넣으려는 대상 호스트의 디렉토리를 지정합니다 - playbook 실행
# ansible-playbook -i servers.ini copy.yaml
-> Client 서버로 복사된 servers.ini 파일을 확인할 수 있습니다
- 대상 서버로 파일 복사하기
03. Ansible 활용 NPM 서버 구축
- NPM 구축 Playbook 파일 생성
# vi NPM.yaml --- - name: Install Nginx, PHP, MySQL on CentOS 7 and configure firewalld hosts: Client become: true tasks: - name: Install EPEL repository for additional packages yum: name: epel-release state: present - name: Install Nginx latest version yum: name: nginx state: latest - name: Install PHP and required extensions yum: name: "{{ item }}" state: present loop: - php - php-fpm - php-mysql - php-xml - php-cli - php-mbstring // loop 구문으로 아래 나열된 패키지들이 돌아가며 item 변수에 들어가며 동작 - name: Install MySQL and Python MySQL library yum: name: "{{ item }}" state: present loop: - mariadb-server - MySQL-python # This may vary depending on CentOS version, check the available package - name: Start and enable Nginx service systemd: name: nginx state: started enabled: yes - name: Start and enable PHP-FPM service systemd: name: php-fpm state: started enabled: yes - name: Ensure MySQL service is running and enabled systemd: name: mariadb state: started enabled: yes - name: Create index.html in /usr/share/nginx/html copy: content: "<html><body><h1>Hello, Nginx!</h1></body></html>" dest: /usr/share/nginx/html/index.html notify: Reload Nginx handlers: - name: Reload Nginx systemd: name: nginx state: reloaded
- yaml 파일 실행
# ansible-playbook -i servers.ini NPM.yaml
- 클라이언트 서버 구동 확인
[root@ansibleclient ~]# netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 3534/php-fpm: maste tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 3870/mysqld tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3448/nginx: master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2180/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1042/master tcp6 0 0 :::80 :::* LISTEN 3448/nginx: master tcp6 0 0 :::22 :::* LISTEN 2180/sshd tcp6 0 0 ::1:25 :::* LISTEN 1042/master
[root@ansibleclient ~]# nginx -v nginx version: nginx/1.20.1 [root@ansibleclient ~]# php-fpm -v PHP 5.4.16 (fpm-fcgi) (built: Apr 1 2020 04:09:12) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies [root@ansibleclient ~]# mysql -V mysql Ver 15.1 Distrib 5.5.68-MariaDB, for Linux (x86_64) using readline 5.1
04. 테스트 및 정리
최종적으로 클라이언트 서버 IP 접근 시, nginx 기초 화면과 yaml 파일로 생성한 index.html 파일 내용이 확인되었습니다.
이로써 모든 과정을 마무리합니다.
감사합니다.