웹사이트 검색

Ansible 가이드: LEMP Stack용 Ansible 플레이북 만들기


이 페이지에서

  1. 1단계 - Ansible 플레이북 프로젝트 설정\n
  2. 2단계 - 디렉토리 구조에 대한 Ansible 역할 생성\n
  3. 3단계 - 호스트 및 site.yml 설정\n
  4. 3단계 - 공통 역할 설정\n
  5. 4단계 - 웹 역할 설정\n
  6. 5단계 - db 역할 설정\n
  7. 6단계 - Ansible 플레이북 실행\n
  8. 7단계 - 테스트
  9. 참조

Ansible은 소프트웨어 애플리케이션 배포, 클라우드 프로비저닝 및 구성 관리를 자동화하는 간단한 자동화 도구입니다. Control Machines라는 단일 위치에서 많은 수의 서버 노드를 관리하고 제어하는 데 도움이 되는 서버 오케스트레이션 도구입니다. Ansible은 2012년 Michael DeHaan에 의해 만들어졌으며 Python 및 Powershell로 작성되었습니다.

이 튜토리얼에서는 Ubuntu 18.04 서버에서 LEMP 스택을 프로비저닝하기 위한 기본 Ansible Playbook을 생성하는 방법을 보여줍니다. WordPress, Nextcloud 등과 같은 다른 PHP 프로젝트 애플리케이션용으로 확장할 수 있는 기본 Ansible 플레이북을 만드는 방법을 배웁니다.

전제 조건

  • 2 우분투 OS.
    • 10.5.5.20 가능
    • 10.5.5.26 조항\n

    우리가 할 일:

    1. Ansible Playbook 프로젝트 설정\n
    2. Ansible 플레이북 역할 디렉토리 구조 생성\n
    3. 호스트 및 site.yml 설정\n
    4. 공통 역할 설정 - 기본 설정\n
    5. 웹 역할 설정 - Nginx 및 PHP-FPM 구성\n
    6. DB 역할 설정 - MySQL 데이터베이스 구성\n
    7. 테스트

    1단계 - Ansible 플레이북 프로젝트 설정

    Ansible 플레이북은 단일 또는 서버 호스트 그룹에서 실행하기 위해 보내는 일련의 지침입니다. 자동화가 작업으로 정의되고 패키지 설치, 파일 편집과 같은 모든 작업이 ansible 모듈에 의해 수행되는 ansible-provisioning을 나타냅니다.

    Ansible 플레이북에는 프로비저닝 서버의 호스트 및 사용자 정보, 프로비저닝 서버에 구현될 작업 목록, 템플릿 및 사용자 지정 구성, 템플릿 및 작업의 변수 그룹을 포함한 몇 가지 기본 구성이 포함되어 있습니다.

    먼저 ansible-control 머신에 마스터 프로젝트 디렉토리를 생성합니다. 마스터 프로젝트 디렉토리에는 모든 플레이북 디렉토리, 파일 및 구성이 저장됩니다.

    project-lemp라는 Ansible 프로젝트 디렉토리를 만들고 그 디렉토리로 이동합니다.

    mkdir project-lemp/
    cd project-lemp

    이제 새 구성 파일 hosts 및 site.yml을 만든 다음, roles라는 새 디렉터리를 만듭니다.

    touch hosts site.yml
    mkdir -p roles/

    구성에 대한 세부 정보:

    호스트 - ansible이 관리하는 서버에 대한 정보를 포함하는 인벤토리 파일입니다. 이를 통해 인벤토리 파일 자체를 보다 쉽게 관리하고 확장할 수 있는 서버 그룹을 만들 수 있습니다. INI 및 YAML 형식을 포함하여 다양한 형식으로 인벤토리 파일을 생성할 수 있습니다.

    site.yml - 사용 가능한 역할을 사용하여 관리할 호스트 그룹이 포함된 마스터 플레이북 파일입니다.

    역할 - 서버를 프로비저닝하는 데 사용될 Ansible 플레이북 그룹입니다. Ansible 역할에는 자체 디렉토리 구조가 있으며 각 역할에는 태스크, 핸들러, 변수 등과 같은 디렉토리가 포함됩니다.

    2단계 - 디렉터리 구조에 대한 Ansible 역할 생성

    이 단계에서는 ansible-galaxy 명령을 사용하여 ansible roles 디렉토리를 생성하려고 했습니다. 공통 역할과 웹 역할이라는 두 가지 역할을 생성합니다.

    project-lemp 디렉터리 내에서 역할 디렉터리로 이동합니다.

    cd roles/

    아래의 ansible-galaxy 명령을 실행하여 일반 및 웹 역할에 대한 역할 구조 디렉터리 및 파일을 생성합니다.

    ansible-galaxy init common
    ansible-galaxy init web
    ansible-galaxy init db

    그런 다음 다음 명령을 사용하여 사용 가능한 모든 역할 디렉토리 구조를 확인하십시오.

    tree .

    아래와 같이 결과가 표시됩니다.

    3단계 - 호스트 및 site.yml 설정

    호스트 파일에는 Ansible이 관리하는 서버의 목록과 그룹이 포함됩니다. 이 가이드에서는 구성원이 server01이고 IP 주소가 10.5.5.26인 lemp라는 그룹을 만듭니다.

    vim 편집기를 사용하여 호스트 파일을 편집합니다.

    vim hosts

    아래에 구성을 붙여넣습니다.

    [lemp]
    server01 ansible_host=10.5.5.26

    저장하고 닫습니다.

    다음으로 site.yml 구성 파일을 편집합니다.

    vim site.yml

    아래에 구성을 붙여넣으십시오.

    ---

    - hosts: lemp
      remote_user: hakase
      become: yes

      roles:
        - common
        - web
        - db

    저장하고 닫습니다.

    3단계 - 공통 역할 설정

    이 단계에서는 공통 역할을 설정하려고 했습니다. 그러기 위해서는 해야 할 작업 목록을 만들어야 합니다.

    공통 역할에서 수행할 작업 목록 아래에 있습니다.

    1. 저장소 변경
    2. 저장소 업데이트
    3. 패키지를 최신 버전으로 업그레이드
    4. 서버 시간대 설정

    이제 공통 디렉토리로 이동하여 tasks/main.yml 구성을 편집하십시오.

    cd common/
    vim tasks/main.yml

    리포지토리 변경을 위한 작업을 만들고 파일 디렉터리의 기본 sources.list를 원격 호스트 /etc/apt/에 복사하는 복사 모듈을 사용합니다.

    - name: Change repository Ubuntu 18.04Step 4 - Setup 'web' Roles
      copy:
        src: sources.list
        dest: /etc/apt/
        backup: yes

    리포지토리 업데이트 작업을 만들고 apt 모듈을 사용하여 모든 패키지를 최신 버전으로 업그레이드합니다.

    - name: Update repository and Upgrade packages
      apt:
        upgrade: dist
        update_cache: yes

    이제 ansible timezone 모듈을 사용하여 시스템 시간대를 구성하는 작업을 생성합니다.

    - name: Setup timezone to Asia/Jakarta
      timezone:
        name: Asia/Jakarta
        state: latest

    저장하고 닫습니다.

    그런 다음 파일 디렉토리 내에 새 리포지토리 구성 sources.list를 만듭니다.

    vim files/sources.list

    서버 위치에서 가장 가까운 저장소를 선택하십시오. 아래는 내 것입니다.

    deb http://buaya.klas.or.id/ubuntu/ bionic main restricted
    deb http://buaya.klas.or.id/ubuntu/ bionic-updates main restricted
    deb http://buaya.klas.or.id/ubuntu/ bionic universe
    deb http://buaya.klas.or.id/ubuntu/ bionic-updates universe
    deb http://buaya.klas.or.id/ubuntu/ bionic multiverse
    deb http://buaya.klas.or.id/ubuntu/ bionic-updates multiverse
    deb http://buaya.klas.or.id/ubuntu/ bionic-backports main restricted universe multiverse
    deb http://buaya.klas.or.id/ubuntu/ bionic-security main restricted
    deb http://buaya.klas.or.id/ubuntu/ bionic-security universe
    deb http://buaya.klas.or.id/ubuntu/ bionic-security multiverse

    저장하고 닫습니다.

    마지막으로 공통 역할 구성이 완료되었습니다.

    4단계 - 웹 역할 설정

    이 단계에서는 웹 역할을 설정하려고 했습니다. Nginx 웹 서버, 일부 기본 확장이 있는 PHP-FPM 설치, Nginx로 PHP-FPM 구성 등 일부 작업을 수행합니다.

    다음은 웹 역할에서 수행할 세부 작업입니다.

    1. Nginx 설치
    2. PHP-FPM 설치
    3. php.ini 구성
    4. 가상 호스트 만들기\n
    5. phpinfo 파일 추가

    웹 디렉토리로 이동하여 tasks/main.yml 파일을 편집합니다.

    cd web/
    vim tasks/main.yml

    apt 모듈을 사용하여 nginx 설치를 위한 첫 번째 작업을 만듭니다.

    - name: Install Nginx
      apt:
        name: nginx
        state: latest

    이제 몇 가지 기본 확장을 사용하여 PHP-FPM을 설치하기 위한 작업을 생성합니다. 그리고 다중 패키지 설치의 경우 아래와 같은 Python 목록 형식을 사용할 수 있습니다.

    - name: Instal PHP-FPM
      apt:
        name: ['php','php-fpm','php-common','php-cli','php-curl']
        state: latest

    다음으로 blockinfile 모듈을 사용하여 php.ini 구성에 새 줄을 추가합니다. 그리고 줄 끝에 php.ini 파일을 구성한 후 php-fpm 서비스를 다시 시작하도록 ansible에 알립니다.

    - name: Configure php.ini
      blockinfile:
        dest: /etc/php/{{ php_version }}/fpm/php.ini
        block: |
          date.time = Asia/Jakarta
          cgi-fix_pathinfo = 0
        backup: yes
      notify: restart php-fpm

    이제 템플릿 모듈을 사용하여 nginx 가상 호스트 구성을 복사합니다. 템플릿 모듈은 템플릿 디렉토리에서 원격 서버로 구성을 복사합니다. jinja2 가상 호스트 템플릿 vhost.j2를 /etc/nginx/sites-enabled/ 디렉토리에 복사하고 마지막으로 nginx 서비스를 다시 시작하도록 ansible에 알립니다.

    - name: Create Nginx virtual host
      template:
        src: vhost.j2
        dest: /etc/nginx/sites-enabled/vhost-{{ domain_name }}
      notify: restart nginx

    그런 다음 파일 모듈을 사용하여 웹 루트 디렉토리를 생성하기 위한 새 작업을 생성하고 index.php 템플릿을 여기에 복사합니다.

    - name: Create web-root directory
      file:
        path: /var/www/{{ domain_name }}
        state: directory

    - name: Upload index.html and info.php files
      template:
        src: index.php.j2
        dest: /var/www/{{ domain_name }}/index.php

    저장하고 닫습니다.

    이제 nginx 및 php-fpm 서비스를 다시 시작하기 위한 핸들러를 구성하려고 합니다. vim 편집기를 사용하여 handlers/main.yml 구성을 편집합니다.

    vim 핸들러/main.yml

    아래에 구성을 붙여넣으십시오.

    - name: restart nginx
      service:
        name: nginx
        state: restarted
        enabled: yes

    - name: restart php-fpm
      service:
        name: php{{ php_version }}-fpm
        state: restarted
        enabled: yes

    저장하고 닫습니다.

    다음으로 vars/main.yml 구성을 편집합니다. 구성 맨 위에 변수 구성 {{ php_version }} 및 {{ domain_name }}이 표시됩니다. 이러한 변수는 PHP 버전에 대한 환경 설정과 사용될 도메인 이름을 나타냅니다. 이 변수는 기본 구성을 편집하지 않고 변수 구성 vars/main.yml만 편집하면 되기 때문에 ansible을 더 재사용 가능하게 만듭니다.

    vim 편집기를 사용하여 변수 구성 vars/main.yml을 편집합니다.

    vim vars/main.yml

    아래에 구성을 붙여넣으십시오.

    php_version: 7.2
    domain_name: hakase-labs.io

    저장하고 닫습니다.

    이제 templates/ 디렉토리에 jinja2 템플릿 구성 index.php.j2 및 vhost.j2를 생성합니다.

    vim templates/index.php.j2

    아래에 구성을 붙여넣습니다.

    <html>
    <body>

    <h1><center>index.html for domain {{ domain_name }}</center></h1>

    <p>
    <p>

    <?php
    phpinfo();
    ?>

    </body>
    </html>

    저장하고 닫습니다.

    그런 다음 nginx 가상 호스트 구성 vhost.j2에 대한 템플릿을 만듭니다.

    vim templates/vhost.j2

    아래에 구성을 붙여넣으십시오.

    server {
        listen 80;
        listen [::]:80;

        root /var/www/{{ domain_name }};
        index index.php index.html index.htm index.nginx-debian.html;

        server_name {{ domain_name }};

        location / {
            try_files $uri $uri/ =404;
        }

        # pass PHP scripts to FastCGI server
        #
            location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php/php{{ php_version }}-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
            }

    }

    구성을 저장하고 닫으면 웹 역할 구성이 완료됩니다.

    5단계 - db 역할 설정

    이 단계에서는 MySQL 데이터베이스 설치 및 구성을 위한 db 역할을 구성하려고 했습니다.

    다음은 db 역할에서 수행할 세부 작업입니다.

    1. mysql 설치
    2. MySQL 데이터베이스 생성
    3. MySQL 사용자 만들기
    4. mysql 재시작

    db 디렉토리로 이동하여 tasks/main.yml 구성을 편집합니다.

    cd db/
    vim tasks/main.yml

    이제 여러 패키지 설치를 위해 apt 모듈 및 python 목록 형식을 사용하여 MySQL 패키지를 설치합니다.

    - name: Install MySQL
      apt:
        name: ['mysql-server','mysql-client','python-mysqldb']
        state: latest
      notify: restart mysql

    그런 다음 MySQL 데이터베이스 및 사용자를 생성하기 위한 새 작업을 생성한 다음 데이터베이스에 사용자의 모든 권한을 부여합니다.

    - name: Create database
      mysql_db:
        name: '{{ db_name }}'
        state: present

    - name: Create user for the database
      mysql_user:
        name: '{{ db_user }}'
        password: '{{ db_pass }}'
        encrypted: yes
        priv: '{{ db_name }}.*:ALL'
        state: present

    저장하고 닫습니다.

    다음으로 handlers/main.yml 구성을 편집합니다.

    vim handlers/main.yml

    MySQL 서비스를 다시 시작하기 위한 작업 구성을 붙여넣습니다.

    - name: restart mysql
      service:
        name: mysql
        state: restarted
        enabled: yes

    저장하고 닫습니다.

    그런 다음 vars 변수 구성 vars/main.yml을 편집합니다.

    vim vars/main.yml

    아래의 MySQL 데이터베이스 및 사용자 구성에 대해 이러한 변수를 붙여넣습니다.

    db_name: hakase-db
    db_user: hakase
    db_pass: '*C960D382DB42E57D3BAC33891CF87900DCB1A869'

    저장하고 닫습니다.

    db_pass 변수에는 MySQL 암호화된 암호가 있으며 온라인 도구를 사용하여 암호화된 MySQL 암호를 생성할 수 있습니다.

    6단계 - Ansible 플레이북 실행

    Ansible 프로젝트 디렉토리로 이동합니다.

    cd project-lemp/

    아래의 ansible-playbook 명령을 실행합니다.

    ansible-playbook -i hosts site.yml

    이제 ansible은 호스트에 할당한 모든 역할을 실행합니다. 완료되면 아래와 같이 결과가 표시됩니다.

    오류가 없는지 확인하십시오.

    7단계 - 테스트

    웹 브라우저를 열고 주소 표시줄 http://hakase-labs.io에 도메인 이름을 입력합니다.

    그러면 아래와 같이 phpinfo가 포함된 인덱스 페이지가 표시됩니다.

    PHP-FPM과 Nginx가 작동 중입니다.

    다음으로 서버 터미널로 돌아가 mysql 역할 변수에서 생성한 사용자와 암호를 사용하여 MySQL 서버에 로그인합니다.

    mysql -u hakase -p
    PASSWORD: hakasepass

    사용자가 소유한 데이터베이스 목록을 확인합니다.

    show databases;

    그러면 MySQL 셸에 로그인되고 목록에 hakase-db라는 데이터베이스가 표시됩니다.

    마지막으로 LEMP 스택 설치 및 구성을 위한 Ansible Playbook이 생성되고 성공적으로 테스트되었습니다.

    참조