소개
요즘에는 서버를 매우 빈번하게 생성하고 삭제해야 합니다. 때로는 서버에 많은 실행 부하가 걸리는 반면, 다른 때에는 부하가 줄어들어 시스템 리소스가 낭비되기 때문입니다. 흔한 예로 휴가철에 많은 트래픽이 몰리는 이커머스 웹사이트가 있습니다. 애플리케이션의 특성이 확장 가능해야 할 때, 서버 생성의 전반적인 과정을 더 쉽게 만들어 줄 구성 관리 도구가 항상 필요합니다. Ansible은 표준 절차를 사용하여 서버 생성을 자동화함으로써 인적 오류를 줄여주는 훌륭한 구성 관리 도구입니다.
Ansible은 서버 노드에 특별한 소프트웨어를 설치할 필요가 없습니다. 스크립트의 작성, 빌드 및 자동화를 용이하게 하는 데 필요한 모든 도구를 갖추고 있습니다. 본 튜토리얼은 당사의 Ubuntu 서버 설정 방법 튜토리얼에 포함된 단계를 자동화하기 위해 Ansible을 사용하는 방법을 자세히 설명합니다..
전제 조건
이 가이드를 완료하기 위해 Ubuntu 20.04을 사용합니다. 또한 다음이 필요합니다:
-
Ansible 제어 노드: 최신 Ubuntu 버전을 실행하는 Ubuntu 머신입니다. 이 머신에는 Ansible의 마스터 바이너리가 설치되어 실행 중이어야 합니다. 이 머신은 Ansible 노드에 연결할 수 있어야 합니다. 이러한 연결을 위해 SSH 키를 사용해야 합니다. 연결 시 문제를 방지하려면 Ansible 제어 노드에 방화벽이 활성화되어 있는지 확인하십시오. 도움이 필요하시면 당사의 Ubuntu 20.04에서 Ansible 설치 및 구성 블로그를 확인해 보세요.
-
Ansible 호스트: 연결할 하나 이상의 호스트가 필요합니다. 호스트는 본질적으로 Ansible에서 관리되는 노드입니다. 이들은 반드시 Ubuntu 서버여야 합니다.
Ansible Playbook의 기능
아래에 언급된 모든 단계를 수동으로 설정할 수도 있습니다. 하지만 이 실행을 자동화할 것입니다. 이 플레이북을 실행하면 머신에서 다음 작업이 수행됩니다:
-
다음 패키지를 설치합니다: aptitude(Ansible이 패키지 관리자로 선호하는 도구).
-
비밀번호 없는 sudo 권한을 가진 관리 그룹 wheel을 생성합니다.
-
새로운 sudo 사용자를 생성합니다.
-
로컬 SSH 키를 다음 경로에 복사합니다: authorized_keys. 이는 원격 호스트의 새로운 관리 사용자를 위해 사용됩니다.
-
root 사용자의 비밀번호 기반 인증을 비활성화합니다.
-
필요한 패키지를 설치합니다.
-
SSH 연결만 허용하도록 UFW 방화벽을 구성합니다. 다른 모든 연결은 차단됩니다.
Playbook 실행이 완료되면 새로운 사용자를 사용할 수 있습니다. 이 사용자를 사용하여 시스템에 로그인할 수 있습니다.
Ansible Playbook 사용하기
서버를 설정하려면 초기 서버 설정 플레이북과 그 종속성이 필요합니다. 처음 사용하는 경우 아래 링크를 사용하여 리포지토리를 복제해야 합니다:
|
1 |
cd ~ |
|
1 |
git clone https://github.com/do-community/ansible-playbooks.git |
|
1 |
cd ansible-playbooks |
리포지토리가 이미 시스템에 존재하는 경우, 아래 명령을 실행하여 최신 업데이트를 가져옵니다:
|
1 |
cd ~/ansible-playbooks |
|
1 |
git pull |
머신에 다음과 같은 파일 구조가 생성됩니다:
|
1 2 3 4 |
setup |-- playbook.yml |__vars |-- default,yml |
아래는 파일에 대한 설명입니다:
-
vars/default.yml: 이 파일에는 Ansible 노드를 구성하기 위한 변수가 포함되어 있습니다.
-
playbook.yml: 이 파일에는 서버에서 실행할 작업이 포함되어 있습니다.
다음 파일은 vars/default.yml 다음과 같이 보입니다:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
아래는 이러한 변수들에 대한 설명입니다. 수정하려면 값을 본인의 값으로 대체하면 됩니다:
-
create_user: 생성되는 사용자입니다. 이 사용자는 sudo 권한을 가집니다.
-
copy_local_key: 로컬 SSH 공개 키의 경로를 포함합니다. 이 키는 원격 서버에 다음과 같이 복사됩니다. authorized_key.
-
sys_packages: 서버에 하나 이상의 패키지를 설치하려면 여기에 배열로 지정하십시오.
이 파일을 편집한 후 내용을 저장하십시오. 그 후 nano에서 다음을 누릅니다. CTRL+X , Y. 그런 다음, ENTER 키를 눌러 파일 내용을 저장합니다.
이제 여러 서버에서 이 플레이북을 실행할 준비가 되었습니다. 기본적으로 플레이북은 인벤토리에 있는 서버에서 실행할 준비가 되어 있습니다. 특정 서버에서 플레이북을 사용하려면 다음을 사용할 수 있습니다. -l 플래그. 이제 원격 서버에 여러 사용자가 있다고 가정하면, 다음을 사용할 수 있습니다. -u 플래그를 사용하여 연결할 사용자를 지정할 수 있습니다.
서버 이름이 my_server 이고 사용자 이름이 my_user 이라면, Ansible 노드에서 실행하기 위해 아래 명령을 실행하십시오:
|
1 |
ansible-playbook playbook.yml -l my_server -u my_user |
다음과 같은 출력이 표시됩니다:
|
1 2 3 4 5 6 7 8 9 |
PLAY [all] ***************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [my_server] TASK [Install Prerequisites] *********************************************************************************************************** changed: [my_server] TASK [Make sure we have a 'wheel' group] *********************************************************************************************** changed: [my_server] TASK [Allow 'wheel' group to have passwordless sudo] *********************************************************************************** changed: [my_server] |
실행이 완료되면 아래 명령을 사용하여 연결할 수 있습니다:
|
1 |
ssh my_user@server_host_or_IP |
기억하십시오. my_user 는 우리가 다음 파일에서 사용했던 이름이었습니다. vars/default.yml 파일. 위 명령에서도 서버 IP를 실제 서버의 IP로 변경해야 합니다. 만약 사용자 지정 SSH 키를 가리키도록 copy_local_key 변수를 제공했다면, 다음 스위치로 위치를 지정하십시오. -i 스위치:
|
1 |
ssh my_user@server_host_or_IP -i ~/.ssh/ansible_controller_key |
다음으로, 서버에 로그인하여 UFW 방화벽 규칙을 확인합니다:
|
1 |
sudo ufw status |
다음과 같은 출력이 표시됩니다:
|
1 2 3 4 5 |
상태: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) |
위의 출력은 UFW 방화벽이 성공적으로 완료되었음을 확인합니다. 이것이 우리 플레이북의 마지막 단계였습니다. 이 작업이 올바르게 수행되었다면 실행이 성공적이었음을 의미합니다.
Ansible 플레이북 내용
이 튜토리얼에서 사용한 플레이북 파일은 다음에 호스팅되어 있습니다: ansible-playbooks/setup_ubuntu1804 at master · do-community/ansible-playbooks · GitHub. 각 파일의 내용을 확인하여 사용하거나 편집하려면, 상단의 Raw 버튼을 클릭하십시오.
빠른 참조를 위해 관련 파일과 함께 플레이북의 전체 내용을 공유합니다:
-
vars/default.yml
이 파일에는 플레이북 작업에서 사용할 값이 포함되어 있습니다. 여기에는 사용자 이름, 권한, SSH 키, 초기 설정의 일부로 설치할 패키지 등의 값이 포함됩니다:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
-
playbook.yml
해당 playbook.yml 파일에는 실행할 작업이 포함되어 있습니다. 먼저, 이 파일은 대상이 될 모든 호스트를 나열합니다. 모든 서버를 지정하려면 이 키의 값을 다음과 같이 설정하십시오: all. 다음으로, sudo 권한을 사용하여 실행할 작업을 지정하려면 변수 값을 다음과 같이 설정합니다: become: true. 마지막으로, 이 파일에는 위의 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 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: 필수 요구사항 설치 apt: name=aptitude update_cache=yes state=latest force_apt_get=yes # Sudo 그룹 설정 - name: 확인 우리가 가지고 있는지 하나의 'wheel' 그룹 group: name: wheel state: present - name: 허용 'wheel' 그룹이 가지는 것을 비밀번호 없는 sudo 권한 lineinfile: path: /etc/sudoers state: present regexp: '^%wheel' line: '%wheel ALL=(ALL) NOPASSWD: ALL' validate: '/usr/sbin/visudo -cf %s' # 사용자 + 키 설정 - name: 생성 하나의 새로운 일반 사용자 가진 sudo 권한 user: name: "{{ create_user }}" state: present groups: wheel append: true create_home: true shell: /bin/bash - name: 설정 인증된 키 위한 원격 사용자 authorized_key: user: "{{ create_user }}" state: present key: "{{ copy_local_key }}" - name: 비활성화 비밀번호 인증 위한 root lineinfile: path: /etc/ssh/sshd_config state: present regexp: '^#?PermitRootLogin' line: 'PermitRootLogin prohibit-password' # 패키지 설치 - name: apt 업데이트 apt: update_cache=yes - name: 설치 필수 시스템 패키지 apt: name={{ sys_packages }} state=latest # UFW 설정 - name: UFW - SSH 연결 허용 ufw: rule: allow name: OpenSSH - name: UFW - 거부 모든 다른 수신 트래픽 기본 설정으로 ufw: state: enabled policy: deny direction: incoming |
결론
IT에서 자동화는 모든 프로세스에 오류가 없고 표준 관행 및 절차를 따르도록 보장하는 핵심 요소입니다. 오늘날 대부분의 소프트웨어는 분산된 특성을 지닌 웹을 통해 제공되므로, 스테이징이나 프로덕션과 같은 서로 다른 환경 또는 데모 환경을 위해 새로운 서버를 생성하는 것이 일상적인 작업이 되었습니다.
이 튜토리얼에서는 많은 시간을 절약할 수 있는 강력하고 사용하기 쉬운 도구인 Ansible을 사용하여 서버 자동화를 달성하는 방법을 시연했습니다.
즐거운 컴퓨팅 되세요!
댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.