메뉴 닫기

Ansible NPM 서버 구축

Ansible 을 활용한 NPM 서버 구축

참고 링크 : https://sysdocu.tistory.com/1858

▶ 목차

  1. Ansible? 
  2. Ansible 기본 설치 및 설정
  3. NPM 서버 구축
  4. 테스트 및 정리


01. Ansible?

안녕하세요. Ansible을 활용하여 클라이언트 서버에 NPM 서버를 구축하는 방법에 대해 알아보겠습니다.

먼저 Ansible이란, 오픈 소스 IT 자동화 도구로서, 구성 관리, 애플리케이션 배포, 작업 자동화 등 다양한 IT 작업을 자동화하는 데 사용됩니다.

Ansible은 에이전트를 필요로하지 않고 SSH를 통해 호스트에 명령을 전송하여 작업을 수행하는 특징을 가지고 있습니다.

다음은 Ansible의 주요 특징과 사용 방법에 대한 개요입니다.

주요 특징

  1. 에이전트리스 구조: Ansible은 에이전트를 필요로하지 않습니다. 대상 호스트에 에이전트를 설치할 필요가 없으므로 구성이 간단합니다.
  2. 사용자 친화적인 언어: Ansible은 YAML을 사용하여 작성된 플레이북(Playbook)이라 불리는 구성 파일을 통해 작업을 정의합니다. YAML은 가독성이 높고 사용하기 쉬운 언어입니다.
  3. 모듈 기반: Ansible은 다양한 모듈을 제공하여 시스템 관리, 네트워크 설정, 클라우드 관리 등 다양한 작업을 수행할 수 있습니다. 모듈은 Ansible이 호스트에서 실행하는 작업을 정의합니다.
  4. 플레이북(Playbook): 플레이북은 Ansible 작업을 설명하는 YAML 파일입니다. 호스트에서 실행해야 하는 일련의 작업과 목표를 정의합니다.
  5. 인벤토리(Inventory): 인벤토리는 Ansible이 작업을 수행할 대상 호스트 목록을 정의합니다. 호스트 및 호스트 그룹은 INI 파일 또는 YAML 파일을 사용하여 정의됩니다.
  6. 롤(Role): 롤은 Ansible 코드를 구성하여 재사용 가능한 모듈로 만들 수 있는 추상화 단위입니다. 코드의 구조화와 모듈 재사용을 쉽게 만듭니다.

02. Ansible 기본 설치 및 설정

  1. 기본 서버 설정 및 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)]
  2. Inventory 설정

    관리하는 서버의 정보를 담은 파일을 아래와 같이 생성합니다.

    섹션 이름은 서버를 그룹핑하기 위한 명칭으로 적절히 설정하면 되고,대상 호스트는 IP 또는 도메인으로 입력할 수 있습니다.

    섹션 내에 여러대의 호스트 추가가 가능합니다.

    # vi servers.ini
    
    [Client]
    115.68.249.31 
  3. 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 )
    => 패스워드 입력 없이 원격 접속 가능
  4. 연결 테스트

    ★ Ansible에서 주로 사용하는 옵션 3가지

    1. -m : 모듈
    2. -i : 인벤토리
    3. -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"
    }
  5. playbook 활용 예시
    1. 대상 서버로 파일 복사하기
      # 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 : 복사하려는 로컬 파일과 붙여넣으려는 대상 호스트의 디렉토리를 지정합니다

    2. playbook 실행
      # ansible-playbook -i servers.ini copy.yaml




      -> Client 서버로 복사된 servers.ini 파일을 확인할 수 있습니다

03. Ansible 활용 NPM 서버 구축 

  1. 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
  2. yaml 파일 실행
    # ansible-playbook -i servers.ini NPM.yaml
  3. 클라이언트 서버 구동 확인
    [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 파일 내용이 확인되었습니다.

이로써 모든 과정을 마무리합니다.

감사합니다.

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