VPC에서 Virtual Server 인스턴스에 소프트웨어 설치
이 튜토리얼에서는 비용이 발생할 수 있습니다. Cost Estimator를 사용하여 예상 사용량을 기반으로 비용 추정값을 생성하십시오.
이 튜토리얼에서는 Terraform 및 Ansible 등의 IaC(Infrastructure as Code) 도구를 사용하여 IBM Cloud® Virtual Private Cloud(VPC) 인프라를 프로비저닝하고 가상 서버 인스턴스(VSI)에 소프트웨어를 설치하는 방법을 설명합니다.
튜토리얼 아키텍처에 대한 소개 이후에 튜토리얼에 필요한 환경을 준비하고 IBM Cloud에서 소프트웨어 설치의 기본을 검토할 것입니다. 이 시점에서 모든 기술을 평가할 것인지, 아니면 Terraform 이나 Ansible.
목표
- IBM에서 제공하는 운영 체제 소프트웨어 이해
- 운영 체제 소프트웨어 업데이트 및 새 소프트웨어 설치를 위한 수동 단계 활용
- 리소스 프로비저닝 및 및 소프트웨어 설치를 자동화하기 위한 IBM Cloud CLI, Terraform 및 Ansible 이해
이 튜토리얼에서는 다른 튜토리얼 Virtual Private Cloud의 공용 프론트 엔드 및 사설 백엔드에서 소개한 구성을 배치합니다. 인터넷 연결 없이 백엔드 서버에 통신하는 퍼블릭 인터넷에서 액세스할 수 있는 프론트 엔드 서버를 프로비저닝합니다.
또한 구성에는 공인 IP 주소 없이 프로비저닝된 인스턴스에 대한 보안 연결을 허용하며 점프 서버 역할을 수행하는 배스천 호스트(bastion host)도 포함됩니다.
리소스를 프로비저닝하는 동안 가상 서버 인스턴스에도 애플리케이션을 배치합니다. 클라우드에 애플리케이션을 배치할 때 소프트웨어가 다른 소스에서 시작될 수 있습니다.
- 로컬 워크스테이션의 파일 시스템 - Terraform과 같은 도구를 사용하여 필수 인프라를 작성하거나
ssh및scp와 같은 Ansible을 사용하여 가상 서버 인스턴스에 소프트웨어를 설치하고 구성할 수 있습니다. - 운영 체제를 업데이트하거나 지원되는 패키지를 설치하기 위한 IBM 미러
- 인터넷 또는 인트라넷 소프트웨어 저장소
이러한 다양한 소스를 사용하는 방법을 탐색합니다.
시작하기 전에
VPC ssh 키 작성
가상 서버 인스턴스를 프로비저닝할 때에는 나중에 서버에 연결할 수 있도록 SSH 키가 인스턴스에 삽입됩니다.
- 로컬 시스템에 SSH 키가 없는 경우 VPC용 키 작성에 대한 지시사항을 참조하십시오. 기본적으로 개인 키는
$HOME/.ssh/id_rsa에 있습니다. - 컴퓨팅 / SSH 키의 VPC 콘솔에 SSH 키를 추가하십시오. 이 학습서에서 다른 리소스를 작성할 리소스 그룹과 동일한 그룹에 키를 작성해야 합니다.
환경 변수 설정
이 튜토리얼에는 VPC 환경에서 리소스를 프로비저닝하고 소프트웨어를 설치 또는 업데이트하기 위한 다양한 옵션을 설명하는 샘플 코드가 포함되어 있습니다.
terraform 및 ansible 쉘을 사용하여 터미널에서 예제 단계를 수행할 수 있습니다. 해당 도구를 이후 단계에 설치할 것입니다. 스크립트가 작동하려면 환경 변수 세트를 정의해야 합니다.
-
소스 코드 저장소학습서를 복제하십시오.
git clone https://github.com/IBM-Cloud/vpc-tutorials.git -
소스 코드 디렉토리를 가리키는
CHECKOUT_DIR이라는 이름의 변수 정의:cd vpc-tutorials export CHECKOUT_DIR=$PWD -
튜토리얼 디렉토리로 변경:
cd $CHECKOUT_DIR/vpc-app-deploy -
구성 파일 복사:
cp export.template export -
export파일 편집 및 환경 변수값 설정:-
TF_VAR_ibmcloud_api_key는 IBM Cloud API 키입니다. 콘솔에서 작성할 수 있습니다. -
TF_VAR_ssh_key_name은 이전 절에서 식별된 VPC SSH 공개 키의 이름입니다. 이는 워크스테이션의 개인 키를 통해 보안 SSH 액세스를 제공하기 위해 가상 서비스 인스턴스에 로드될 공개 키입니다. CLI를 사용하여 존재하는지 확인하십시오.ibmcloud is keys -
TF_VAR_resource_group_name은 리소스가 작성되는 리소스 그룹입니다. 리소스 그룹 작성 및 관리를 참조하십시오. -
TF_VAR_region은(는) 리소스가 작성되는 영역입니다. 이 명령은 영역을 표시합니다.ibmcloud is regions -
TF_VAR_zone은(는) 리소스가 작성되는 구역입니다. 이 명령은 구역을 표시합니다.ibmcloud is zones -
TF_VAR_ssh_agent는 비밀번호 문구로 보호된 SSH키가 사용됨을 표시합니다. 주석 해제하여 변수를 사용으로 설정하십시오. 그런 다음ssh-add ~/.ssh/id_rsa를 사용하여 인증 에이전트에 SSH키를 추가하십시오.
-
-
환경에 변수 로드:
source export다음 시나리오에서는 항상 동일한 터미널 창을 사용하거나 새 창을 사용하는 경우에는 환경 변수를 설정하십시오.
export의 환경 변수는 편의상 Terraform 형식 (TF_VAR_접두어에 주목)으로 되어 있습니다. 후속 섹션에서 사용됩니다.
소프트웨어 설치의 기본 사항
기본 이미지에서 가상 서버 인스턴스 프로비저닝
가상 서버 인스턴스를 프로비저닝할 때 IBM에서 제공하는 사전 정의된 운영 체제 이미지 세트에서 기본 이미지를 선택하십시오. ibmcloud is images를 사용하여 사용 가능한 이미지 목록을 찾으십시오.
IBM에는 IBM 이미지를 지원하기 위한 내부 미러가 있습니다. 미러는 분배와 연관된 선택적 패키지 외에도 IBM에서 제공하는 이미지의 소프트웨어에 대한 새 버전을 포함합니다. 미러는 IBM Cloud VPC에 사용 가능한 서비스 엔드포인트의 일부입니다. 미러를 읽어도 수신 비용이 부과되지 않습니다.
이러한 미러에서 프로비저닝된 인스턴스에 사용 가능한 버전 목록 업데이트 및 설치된 소프트웨어 업그레이드 두 가지를 모두 고려하십시오.
cloud-init를 사용하여 클라우드 인스턴스 초기화 및 사용자 정의
가상 서버 인스턴스를 프로비저닝할 때, 서버 초기화 과정에서 실행될 클라우드 초기화 스크립트를 지정할 수 있습니다. cloud-init는 클라우드 인스턴스의 초기 초기화를 처리하는 다중 배포 패키지입니다. 이는 클라우드 인스턴스의 초기화를 인코딩하기 위해 파일 형식의 콜렉션을 정의합니다.
IBM Cloud에서 cloud-init 파일 컨텐츠는 서버가 프로비저닝될 때 user-data 매개변수에서 제공됩니다. 허용되는 사용자 데이터 내용은 사용자 데이터 형식을 참조하세요. 스크립트 실행을 디버깅해야 하는 경우, cloud-init가 가상 서버 인스턴스의 /var/log/cloud-init-output.log에 초기화 스크립트의 출력을 로깅합니다.
이 튜토리얼에서는 install.sh 초기화 스크립트로:
#!/bin/bash
set -x
apt-get update
apt-get install -y nginx
indexhtml=/var/www/html/index.html
# Demonstrate the availability of internet repositories. If www.python.org is availble then other software internet software like
# npm, pip, docker, ... if isolated only the software from the ibm mirrors can be accessed
if curl -o /tmp/x -m 3 https://www.python.org/downloads/release/python-373/; then
echo INTERNET > $indexhtml
else
echo ISOLATED > $indexhtml
fi
이 스크립트에서 설치된 소프트웨어를 업그레이드하고 운영 체제에서 제공하는 소프트웨어 설치 도구를 사용하여 nginx 및 기타 패키지를 설치하면 격리된 인스턴스가 IBM에서 제공하는 미러에 액세스 권한이 있음을 확인할 수 있습니다. Ubuntu의 경우, apt-get 명령이 미러에 액세스합니다.
www.python.org에 액세스하는 curl 명령은 인터넷에서 소프트웨어에 액세스하여 설치하려는 잠재적인 시도를 표시합니다.
호스트에 인터넷 연결이 있는지 여부에 따라, 이 스크립트는 index.html에 의해 수행되는 nginx 페이지를 수정합니다.
파일 시스템에서 업로드하여 인스턴스에서 실행
가상 서버 인스턴스에 업로드되어 실행되어야 하는 CI/CD 파이프라인 또는 온프레미스 시스템의 파일 시스템에서 사용 가능한 데이터 및 소프트웨어가 있을 수 있습니다.
이런 경우, 서버에 대한 SSH 연결을 통해 scp를 사용하여 파일을 업로드한 다음 ssh가 있는 서버에서 스크립트를 실행하십시오. 또한 스크립트는 온프레미스 시스템 및 클라우드 간에 VPN 등의 연결을 설정했다는 가정 하에 온프레미스
시스템이나 인터넷에서 소프트웨어 설치 프로그램을 검색할 수 있습니다.
튜토리얼 코드에는 uploaded.sh 이 작업은 워크스테이션에서 가상 서버 인스턴스로 업로드됩니다(수동 또는 Terraform 및 Ansible 와 같은 자동화
기능을 통해).
이후 섹션에서는 스크립트를 사용하게 됩니다 test_provision.bash 서버가 성공적으로 프로비저닝되었는지, 인터넷에 액세스할 수 있는지(또는 액세스할 수 없는지), 그리고 uploaded.sh 스크립트가 올바르게 실행되었는지 확인합니다.
IBM Cloud CLI 및 쉘 스크립트 사용
IBM Cloud CLI는 IBM Cloud에서 생성할 수 있는 모든 리소스와 상호 작용하기 위한 명령을 제공합니다. 이 절에서는 이러한 명령을 사용하는 방법에 대해 설명하지만 자원을 작성하지는 않습니다. Terraform을 사용하여 전체 솔루션을 배치하는 것이 좋습니다.
시작하기 전에
이러한 단계에 따라 명령행 인터페이스(CLI) 도구를 설치하십시오.
가상 서버 인스턴스 프로비저닝 및 소프트웨어 설치
CLI에는 계산 및 네트워크 리소스를 포함하여 모든 VPC 관련 기능을 위한 플러그인 이 있습니다.
-
VPC 리소스에 대해 작업하기 전에 현재 리소스 그룹 및 지역을 설정하십시오.
ibmcloud target -g $TF_VAR_resource_group_name -r $TF_VAR_region -
가상 서버 인스턴스를 프로비저닝하려면
ibmcloud is instance-createCLI 명령을 실행하십시오. 에shared/install.sh프론트엔드와 백엔드 서버를 초기화하는 데 사용되는 클라우드 초기화 파일입니다. 다음과 같이--user-data매개변수를 사용하여 스크립트를 전달할 수 있습니다.ibmcloud is instance-create ... --user-data @shared/install.sh -
프론트 엔드 및 백엔드 VSI가 배치되고 유지보수 모드에서 스크립트를 예를 들어 프론트 엔드 서버로 전송한 후 스크립트를 실행하여 인터넷에서 소프트웨어를 설치할 수 있습니다. 프론트 엔드 서버로 스크립트를 전송하십시오.
scp -F ../scripts/ssh.notstrict.config -o ProxyJump=root@$BASTION_IP_ADDRESS shared/uploaded.sh root@$FRONT_NIC_IP:/uploaded.sh그런 후 다음 스크립트를 실행하십시오.
ssh -F ../scripts/ssh.notstrict.config -o ProxyJump=root@$BASTION_IP_ADDRESS root@$FRONT_NIC_IP sh /uploaded.sh서버의 ssh 서비스가 초기화되는 데 몇 분 정도 걸릴 수 있으며,
cloud-init스크립트가 완료되는 데 몇 분 더 걸릴 수 있습니다.uploaded.sh스크립트는 종료 전에 초기화가 완료될 때까지 대기합니다.
Terraform을 사용하여 인프라 프로비저닝
Terraform을 사용하면 안전하고 예측 가능한 방식으로 인프라를 생성, 변경 및 개선할 수 있습니다. 이는 API를 팀 구성원 간에 공유할 수 있으며 코드로 취급하여 편집, 검토 및 버전화할 수 있는 선언적 구성 파일로 코드화하는 오픈 소스 도구입니다.
시작하기 전에
지시사항에 따라 워크스테이션에 Terraform 및 IBM Cloud Provider plug-in for Terraform을 설치하십시오.
단일 가상 서버 인스턴스 프로비저닝
더 복잡한 아키텍처를 배치하고 Terraform 제공자 설치를 확인하기 위해 유동 IP를 사용하여 단일 가상 서버 인스턴스를 배치하고 SSH를 통해 이 서버에 액세스합니다.
확인해 보세요 main.tf 테라폼 스크립트를 위한 파일입니다. 이전에 정의한 환경 변수를 사용합니다.
-
이 예제의 경우, terraform 스크립트 폴더로 변경:
cd $CHECKOUT_DIR/vpc-app-deploy/tfinstance -
Terraform 초기화:
terraform init -
Terraform 플랜 적용:
terraform apply스크립트가 VPC 및 VSI를 작성하고 SSH 액세스를 사용 가능하도록 설정합니다.
-
플랜에 의해 생성된 출력 보기:
terraform output -
이전 명령의 출력을 복사하여 붙여넣거나
terraform output을 사용하여 SSH를 통해 VSI로 이동할 수 있습니다.$(terraform output -raw sshcommand)Terraform의 출력을 사용하면 Terraform 플랜을 적용한 후에 기타 스크립트에서 리소스 특성을 재사용할 때 매우 편리합니다.
-
Terraform에 의해 작성된 리소스를 제거하십시오.
terraform destroy
서브넷 및 가상 서버 인스턴스 프로비저닝
vpc-tutorials 저장소의 vpc-app-deploy/tf 폴더에 있는 Terraform 파일 세트는 Virtual Private Cloud의 공용 프론트 엔드 및 사설 백엔드 학습서의 아키텍처를 구현합니다.
스크립트 vpc-app-deploy/tf/main.tf 리소스의 정의가 포함되어 있습니다. 이는 다른 학습서와 공유되는 Terraform 모듈을 가져옵니다.
module vpc_pub_priv {
source = "../../vpc-public-app-private-backend/tfmodule"
basename = "${local.BASENAME}"
ssh_key_name = "${var.ssh_key_name}"
zone = "${var.zone}"
backend_pgw = false
profile = "${var.profile}"
image_name = "${var.image_name}"
resource_group_name = "${var.resource_group_name}"
maintenance = "${var.maintenance}"
frontend_user_data = "${file("../shared/install.sh")}"
backend_user_data = "${file("../shared/install.sh")}"
}
이 정의에서,
- backend_pgw는 백엔드 서버가 공용 인터넷에 액세스할 수 있는지 여부를 제어합니다. 공용 게이트웨이는 백엔드 서브넷에 연결할 수 있습니다. 프론트 엔드에는 공인 IP 및 게이트웨이 둘 다를 인터넷에 제공하는 유동 IP가 지정됩니다. 이로 인해 소프트웨어 설치에 대한 개방형 인터넷 액세스가 허용됩니다. 백엔드에는 인터넷에 대한 액세스 권한이 없습니다.
- frontend_user_data 및 backend_user_data는 cloud-init 초기화 스크립트를 가리킵니다.
Terraform을 사용하면 모든 리소스가 연관된 프로비저너를 가질 수 있습니다. null_resource 프로비저너는 클라우드 리소스를 프로비저닝하지 않으나 파일을 서버 인스턴스로 복사하는 데 사용될 수 있습니다. 이 구조는 스크립트에서 복사본을 만드는 데 사용됩니다 uploaded.sh 파일을 열고 아래와 같이 실행합니다. 서버에 연결하기 위해, 테라폼은 튜토리얼에서 설명된 바와 같이 배스천 호스트를 사용하는 것을 지원합니다:
resource "null_resource" "copy_from_on_prem" {
connection {
type = "ssh"
user = "root"
host = "${module.vpc_pub_priv.frontend_network_interface_address}"
private_key = "${file("~/.ssh/id_rsa")}"
bastion_user = "root"
bastion_host = "${local.bastion_ip}"
bastion_private_key = "${file("~/.ssh/id_rsa")}"
}
provisioner "file" {
source = "../shared/${local.uploaded}"
destination = "/${local.uploaded}"
}
provisioner "remote-exec" {
inline = [
"bash -x /${local.uploaded}",
]
}
}
리소스를 프로비저닝하려면 다음을 수행하십시오.
- terraform 스크립트 폴더로 변경:
cd $CHECKOUT_DIR/vpc-app-deploy/tf - Terraform 초기화:
terraform init - Terraform 플랜 적용:
terraform apply - 플랜에 의해 생성된 출력 보기:
terraform output
가상 서버의 구성 테스트
이제 Terraform이 리소스를 배치했으므로 올바르게 프로비저닝되었는지 확인할 수 있습니다.
- 프론트 엔드 가상 서버 인스턴스에 연결할 수 있으며 인터넷에 대한 아웃바운드 액세스를 가지고 있는지 확인하십시오.
명령 출력은 다음과 같아야 합니다.../test_provision.bash $(terraform output -raw FRONT_IP_ADDRESS) INTERNET hisuccess: httpd default file was correctly replaced with the following contents: INTERNET success: provision of file from on premises worked and was replaced with the following contents: hi - 배스천 호스트를 통해 백엔드에 연결할 수 있으며 인터넷에 대한 액세스 권한이 없는지 확인하십시오.
명령 출력은 다음과 같아야 합니다.../test_provision.bash $(terraform output -raw BACK_NIC_IP) ISOLATED hi "ssh -F ../../scripts/ssh.notstrict.config root@$(terraform output -raw FRONT_NIC_IP) -o ProxyJump=root@$(terraform output -raw BASTION_IP_ADDRESS)"success: httpd default file was correctly replaced with the following contents: ISOLATED success: provision of file from on premises worked and was replaced with the following contents: hi
자원 제거
- Terraform에 의해 작성된 리소스를 제거하십시오.
terraform destroy
Ansible을 사용하여 소프트웨어 설치
Ansible 은 Chef 와 Puppet 과 유사한 구성 관리 및 프로비저닝 도구로, 클라우드에서 다중 계층 앱 배포 및 프로비저닝을 자동화하도록 설계되었습니다. Python으로 작성된 Ansible은 YAML 구문을 사용하여 자동화 태스크를 설명하며 쉽게 학습하고 사용할 수 있습니다.
Ansible을 사용하는 방법으로도 VPC 리소스를 프로비저닝하고 소프트웨어를 설치할 수 있지만 이 절에서는 Terraform을 사용하여 리소스를 프로비저닝하고 Ansible을 사용하여 소프트웨어를 배치합니다.
시작하기 전에
이 절에서는 Terraform 및 Ansible을 둘 다 사용합니다.
- 지시사항에 따라 워크스테이션에 Terraform 및 IBM Cloud Provider plug-in for Terraform을 설치하십시오.
- 이 지시사항 에 따라 Ansible을 설치하십시오.
Ansible 플레이북
Ansible 플레이북은 실행할 태스크를 제공합니다. 아래 예제에는 nginx를 설치하고 스크립트를 업로드하는 데 필요한 일련의 태스크가 포함되어 있습니다. 앞에서 설명한 cloud-init 스크립트와 유사함을 알 수 있을 것입니다. uploaded.sh 스크립트는 동일합니다.
- hosts: FRONT_NIC_IP BACK_NIC_IP
remote_user: root
tasks:
- name: update apt cache manual
# this should not be required but without it the error: Failed to lock apt for exclusive operation is generated
shell: apt update
args:
executable: /bin/bash
- name: update apt cache
apt:
update_cache: yes
- name: ensure nginx is at the latest version
apt:
name: nginx
state: latest
notify:
- restart nginx
- name: execute init.bash
script: ./init.bash
- name: upload execute uploaded.sh
script: ../shared/uploaded.sh
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
Ansible 인벤토리
Ansible은 동시에 인프라 내의 다중 시스템에 대해 작업합니다. Ansible 인벤토리에는 이러한 시스템 목록이 포함되어 있습니다. 이 튜토리얼은 스크립트를 제공합니다 inventory.bashAnsible
의 인벤토리를 생성하기 위해 Terraform 출력을 사용합니다.
#!/bin/bash
TF=tf
printf 'all:
children:
FRONT_NIC_IP:
hosts:
%s
BACK_NIC_IP:
hosts:
%s
' $(cd $TF; terraform output -raw FRONT_NIC_IP) $(cd $TF; terraform output -raw BACK_NIC_IP)
서브넷 및 가상 서버 인스턴스 프로비저닝
vpc-app-deploy/ansible/tf 디렉토리에는 소프트웨어 설치가 제외된 이전 섹션에서 설명한 것과 유사한 Terraform 구성이 포함되어 있습니다.
Ansible 스크립트가 미러에서 소프트웨어를 설치한 다음 워크스테이션에서 소프트웨어를 업로드합니다.
- 이 예제의 경우, Ansible 스크립트 폴더로 변경:
cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf - Terraform 초기화:
terraform init - Terraform 플랜 적용:
terraform apply - 플랜에 의해 생성된 출력 보기:
terraform output - Ansible 인벤토리 생성:
cd .. && ./inventory.bash > inventory - 프론트 엔드 서버에서 소프트웨어 프로비저닝:
ansible-playbook -T 40 -l FRONT_NIC_IP -u root \ --ssh-common-args "-F ../../scripts/ssh.notstrict.config -o ProxyJump=root@$(cd tf; terraform output -raw BASTION_IP_ADDRESS)" \ -i inventory lamp.yaml - 백엔드 서버에서 소프트웨어 프로비저닝:
ansible-playbook -T 40 -l BACK_NIC_IP -u root \ --ssh-common-args "-F ../../scripts/ssh.notstrict.config -o ProxyJump=root@$(cd tf; terraform output -raw BASTION_IP_ADDRESS)" \ -i inventory lamp.yaml
가상 서버의 구성 테스트
이제 Terraform이 리소스를 배치하고 Ansible이 소프트웨어를 설치했으므로 올바르게 프로비저닝되었는지 확인할 수 있습니다.
- 프론트 엔드 가상 서버 인스턴스에 연결할 수 있으며 인터넷에 대한 아웃바운드 액세스를 가지고 있는지 확인하십시오.
명령 출력은 다음과 같아야 합니다.../test_provision.bash $(cd tf && terraform output -raw FRONT_IP_ADDRESS) INTERNET hisuccess: httpd default file was correctly replaced with the following contents: INTERNET success: provision of file from on premises worked and was replaced with the following contents: hi - 배스천 호스트를 통해 백엔드에 연결할 수 있으며 인터넷에 대한 액세스 권한이 없는지 확인하십시오.
명령 출력은 다음과 같아야 합니다.../test_provision.bash $(cd tf && terraform output -raw BACK_NIC_IP) ISOLATED hi "ssh -F ../../scripts/ssh.notstrict.config root@$(cd tf && terraform output -raw FRONT_NIC_IP) -o ProxyJump=root@$(cd tf && terraform output -raw BASTION_IP_ADDRESS)"success: httpd default file was correctly replaced with the following contents: ISOLATED success: provision of file from on premises worked and was replaced with the following contents: hi
자원 제거
-
Terraform에 의해 작성된 리소스를 제거하십시오.
cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf및
terraform destroy
리소스에 따라 즉시 삭제되지 않고 보유될 수 있습니다(기본 7일 동안). 리소스를 영구적으로 삭제하여 재확보하거나 보유 기간 내에 리소스를 복원할 수 있습니다. 리소스 재확보 사용 방법은 이 문서를 참조하십시오.