서버 자동화는 효과적이고 기술 집약적인 방식으로 서버를 관리하고 모니터링하는 안전하고 신뢰할 수 있는 프로세스입니다. 전담 전문가 팀이 제어하는 데이터 센터에서 서버를 관리하는 기존 방식과 달리, 모든 서버는 자동화를 사용하여 관리됩니다. 그 결과, 인적 오류가 최소화됩니다.
다음과 같은 구성 관리 도구인 Ansible, Puppet, Terraform 등은 일반적으로 서버를 자동화하는 데 사용됩니다. 이러한 도구는 수동으로 작업할 때 발생할 수 있는 잠재적인 오류를 제거하는 동시에 새 서버에 대한 표준 절차를 수립하여 자동화로 서버를 설정합니다.
Ansible는 강력한 오픈 소스 프로젝트입니다. 유연하고 사용하기 쉬우며 가장 단순화된 아키텍처를 가지고 있습니다. Ansible 플레이북을 사용하는 데 코딩 배경 지식이 필요하지 않으며 노드에 소프트웨어를 설치할 필요도 없습니다. 무엇보다도 스크립트를 작성하고 자동화를 간소화할 수 있는 뛰어난 기능이 가득합니다.
이 가이드에서는 Ansible을 사용하여 Ubuntu 20.04에 LAMP를 설치하고 구성하는 단계를 안내합니다.
사전 요구 사항
이 튜토리얼을 따라 하려면 다음이 필요합니다.
- Ubuntu가 설치된 상태 (시스템에).
- 하나 이상의 Ansible 호스트: 최신 Ubuntu를 실행하는 하나 이상의 원격 Ansible 호스트가 처음에 설정되어 있어야 합니다. 설정을 위해 다음 튜토리얼을 따르세요: Ansible 및 Ubuntu 20.04를 사용한 서버 설정 자동화 (설정 방법).
- 하나의 Ansible 제어 노드: Ansible이 설치 및 구성되어 있고, 다음을 사용하여 Ansible 호스트에 연결된 Ubuntu 머신: SSH 키:
-
- 제어 노드에는 다음이 있어야 합니다: sudo 권한이 있는 사용자 및 방화벽 활성화(ON).
- Ansible 설정에 도움이 필요하면 다음 튜토리얼을 확인하세요: Ubuntu 20.04에 Ansible 설치 및 구성.
Ansible 플레이북의 목적은 무엇인가요?
이 Ansible 플레이북은 다음 가이드에 설명된 절차를 실행하는 대체 방법입니다: LAMP 스택 설정 – Linux Apache MySQL PHP.
Ansible 플레이북을 실행하면 Ansible 호스트에서 다음과 같은 작업이 수행됩니다.
-
다음 설치: aptitude (다음의 대안: apt 패키지 관리자, Ansible에서 선호함).
-
필요한 모든 LAMP 패키지를 설치합니다.
-
새로운 Apache VirtualHost를 생성하고 전용 문서 루트(document root)를 구성합니다.
-
설정: 켜짐(ON) (새로운 VirtualHost).
-
설정: 꺼짐(OFF) (기본 Apache 웹사이트, 즉 disable_default 변수를 true로 설정).
-
MySQL root 사용자의 비밀번호를 선택합니다.
-
익명 MySQL 계정 및 테스트 데이터베이스를 제거합니다.
-
구성된 포트에서 HTTP 트래픽을 허용하도록 UFW를 설정합니다. 기본값은 80.
-
PHP 테스트 스크립트를 설정합니다.
Ansible 플레이북 실행이 완료되면 설정한 구성에 따라 Apache 위에서 실행되는 웹 PHP 환경을 볼 수 있습니다.
Ansible 플레이북 활용하기
먼저, 다음에서 LAMP 플레이북 및 해당 종속성을 가져옵니다: do-community/ansible-playbooks 저장소. 다음으로, LAMP 플레이북이 포함된 저장소를 Ansible 제어 노드 내부의 로컬 폴더로 복제(clone)합니다.
다음 명령을 실행합니다: git pull 명령을 실행하여 이 튜토리얼에서 사용할 올바른 콘텐츠에 액세스할 수 있는지 확인합니다.
|
1 2 |
cd ~/ansible-playbooks git pull |
만약 다음 저장소를 처음 사용하는 경우, do-community/ansible-playbooks 저장소를 처음 사용하는 것이라면, 홈 폴더로 저장소를 복제하는 것을 고려해 보세요:
|
1 2 3 |
cd ~ git clone https://github.com/do-community/ansible-playbooks.git cd ansible-playbooks |
다음 폴더로 이동하면 lamp_ubuntu2004 폴더 구조를 볼 수 있습니다:
|
1 2 3 4 5 6 7 8 |
lamp_ubuntu2004 ├── files │ ├── apache.conf.j2 │ └── info.php.j2 ├── vars │ └── default.yml ├── playbook.yml └── readme.md |
이 파일들이 의미하는 바에 대한 개요는 다음과 같습니다:
-
files/info.php.j2: 웹 서버의 루트에 PHP 테스트 페이지를 설정할 수 있는 템플릿 파일입니다.
-
files/apache.conf.j2: Apache VirtualHost를 설정하는 데 사용되는 또 다른 템플릿 파일입니다.
-
vars/default.yml: 플레이북 설정을 사용자 정의하기 위한 변수 파일입니다.
-
playbook.yml: 이 파일에는 원격 서버에서 실행할 작업(task)의 모든 내용이 포함되어 있습니다.
-
readme.md: 이 플레이북에 대한 정보를 포함하는 읽기 파일입니다.
플레이북의 변수 파일을 변경하여 MySQL 및 Apache 구성을 사용자 정의해 보겠습니다. 다음으로 이동합니다. lamp_ubuntu2004 디렉터리로 이동하여 다음 파일을 엽니다. vars/default.yml 파일을 다음 편집기로 엽니다. nano 편집기:
|
1 2 |
cd lamp_ubuntu2004 nano vars/default.yml |
다음 파일을 열면 vars/default.yml 파일에 수정해야 할 변수 목록이 있습니다:
|
1 2 3 4 5 6 7 |
--- mysql_root_password: "mysql_root_password" app_user: "justin" http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80" disable_default: true |
각 변수에 대해 자세히 알아보겠습니다:
-
mysql_root_password: root MySQL 계정의 비밀번호를 저장합니다.
-
app_user: 애플리케이션 파일의 소유자 역할을 하는 Ansible 호스트의 원격 비-root 사용자입니다.
-
http_host: 도메인 이름을 표시합니다.
-
http_conf: Apache 내에 생성된 구성 파일의 이름을 표시합니다.
-
http_port: 이 가상 호스트의 HTTP 포트이며, 80이(가) 기본값입니다.
-
disable_default: Apache와 함께 제공되는 기본 옵션을 취소하는 데 사용됩니다.
그런 다음, 다음 파일을 저장하고 닫습니다. vars/default.yml 파일.
모든 설정이 완료되면 서버에서 이 플레이북을 실행할 준비가 된 것입니다. 기본적으로 플레이북의 대부분의 서버는 인벤토리의 모든 서버에서 실행되도록 구성되어 있습니다. 다음 플래그를 사용해 보겠습니다. -l 플래그를 사용하면 플레이북의 영향을 받는 단일 서버 또는 선택한 그룹 하위 집합에만 영향을 미칠 수 있습니다. 또는 다음 플래그를 사용할 수도 있습니다. -u 플래그를 사용하면 어떤 원격 서버가 연결되고 원격 호스트에서 실행 중인지 자세히 볼 수 있습니다.
하나의 서버에서 플레이북을 실행해 보겠습니다. server1 그리고 다음 사용자로 연결합니다. justin:
|
1 |
ansible-playbook playbook.yml -l server1 -u justin |
다음과 유사한 출력이 표시됩니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
PLAY [all] ********************************************************************************************************* TASK [Gathering Facts] *********************************************************************************************************ok: [server1] TASK [Install prerequisites] *********************************************************************************************************ok: [server1] => (item=aptitude) ... TASK [UFW - Allow HTTP on port 80] ********************************************************************************************************* changed: [server1] TASK [Sets Up PHP Info Page] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Reload Apache] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Restart Apache] ********************************************************************************************************* changed: [server1] PLAY RECAP ********************************************************************************************************* server1 : ok=15 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
플레이북 실행이 완료되면 웹 브라우저로 이동하여 서버의 호스트에 액세스합니다. 끝에 다음을 추가하는 것을 잊지 마세요. /info.php (IP 끝에):
|
1 |
http://server_host_or_IP/info.php |
이 URL을 클릭하면 다음과 같은 페이지가 표시됩니다:
|
경고: 표시된 페이지에는 PHP 환경에 대한 민감한 정보가 포함되어 있습니다. 따라서 다음 명령어를 사용하여 서버에서 개인 정보를 제거하는 것이 좋습니다. rm -f /var/www/info.php |
플레이북에는 무엇이 있나요?
다음으로, ansible-플레이북 콘텐츠에 사용된 파일들의 의미와 중요성을 알아보겠습니다:
-
vars/default.yml
The default.yml 변수 파일에는 MySQL root 계정의 도메인 이름과 비밀번호가 포함되어 있습니다. 이 값들은 ansible-플레이북 작업에서 사용되는 기본값입니다:
|
1 2 3 4 5 6 7 |
--- mysql_root_password: "mysql_root_password" app_user: "justin" http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80" disable_default: true |
- files/apache.conf.j2
The apache.conf.j2 파일은 새로운 Apache VirtualHost를 구성하는 데 사용되는 Jinja 2 템플릿 파일입니다. 이 템플릿 내에서 사용되는 변수는 vars/default.yml 변수 파일에 정의되어야 합니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<VirtualHost *:{{ http_port }}> ServerAdmin webmaster@localhost ServerName {{ http_host }} ServerAlias www.{{ http_host }} DocumentRoot /var/www/{{ http_host }} ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory /var/www/{{ http_host }}> Options -Indexes </Directory> <IfModule mod_dir.c> DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm </IfModule> </VirtualHost> |
- files/info.php.j2
Similar to files/apache.conf.j2와 유사하게, info.php.j2 파일 역시 Jinja 템플릿입니다. 이 파일을 사용하여 새로 구성된 LAMP 서버의 문서 루트에 테스트 PHP 스크립트를 설정합니다:
|
1 2 |
<?php phpinfo(); |
-
playbook.yml
The 플레이북.yml 파일은 이 설정의 모든 작업이 정의되는 곳입니다. 이 파일에서 모든 LAMP 스택이 구성됩니다. 대상 서버 그룹을 정의하는 것으로 시작하며, all로 설정됩니다. 또한, become 값을 true ( become: true)로 취하고, 실행해야 할 모든 작업을 정의합니다. 다음으로, yaml 파일에는 구성 옵션을 로드하기 위한 기본 파일인 vars/default.yml 변수 파일이 있습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: 설치 필수 조건 apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes loop: [ 'aptitude' ] #Apache 설정 - name: 설치 LAMP 패키지 apt: name={{ item }} update_cache=yes state=latest loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ] - name: 생성 문서 루트 file: path: "/var/www/{{ http_host }}" state: directory owner: "{{ app_user }}" mode: '0755' - name: 설정 up Apache 가상 호스트 template: src: "files/apache.conf.j2" dest: "/etc/apache2/sites-available/{{ http_conf }}" notify: 재로드 Apache - name: 활성화 새로운 사이트 shell: /usr/sbin/a2ensite {{ http_conf }} notify: 재로드 Apache - name: 비활성화 기본 Apache 사이트 shell: /usr/sbin/a2dissite 000-기본.conf when: disable_default notify: 재로드 Apache # MySQL 설정 - name: 설정 the root 비밀번호 mysql_user: name: root password: "{{ mysql_root_password }}" login_unix_socket: /var/run/mysqld/mysqld.sock - name: 제거 모든 익명 사용자 계정 mysql_user: name: '' host_all: yes state: absent login_user: root login_password: "{{ mysql_root_password }}" - name: 제거 the MySQL 테스트 데이터베이스 mysql_db: name: test state: absent login_user: root login_password: "{{ mysql_root_password }}" # UFW 설정 - name: "UFW - {{ http_port }} 포트에서 HTTP 허용" ufw: rule: allow port: "{{ http_port }}" proto: tcp # PHP 정보 페이지 - name: 설정 Up PHP 정보 페이지 template: src: "files/info.php.j2" dest: "/var/www/{{ http_host }}/info.php" handlers: - name: 재로드 Apache service: name: apache2 state: reloaded - name: 재시작 Apache service: name: apache2 state: restarted |
프로젝트의 필요와 요구 사항에 따라 이 파일들을 수정할 수 있습니다.
결론
이 튜토리얼에서는 Ansible을 사용하여 원격 서버에 LAMP를 설치하고 설정하는 단계를 살펴보았습니다. 실험해 볼 수 있는 다른 많은 사용자 정의 옵션이 있습니다. 예를 들어, Ansible 공식 문서를 사용하고, Ansible 모듈의 mysql_user 사례를 사용하는 것은 실력을 향상시키는 훌륭한 방법입니다. 또한, 이 가이드에서 설명한 단계를 따라 다른 구성 관리 도구와 OS를 사용하여 자동화를 연습함으로써 난이도를 높여보세요.
LAMP 스택을 처음 접하고 이 주제에 대해 깊이 알아보고 싶으신가요? 저희 블로그:
- Ubuntu 20.04에서 LAMP를 사용하여 WordPress를 설치하는 방법
- Centos-7에 Linux, Apache, MySQL, PHP (LAMP) 스택을 설치하는 방법
- Ubuntu 20.04에 LEMP 스택 Linux Nginx MySQL PHP를 설치하는 방법
즐거운 컴퓨팅 되세요!

댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.