본문 바로가기
프로그래밍/리눅스

프로그래밍 「 리눅스 편」Azure의 Bash 스크립팅

by grapedoukan 2023. 6. 11.
728x90

 

 

이 글은 클라우드 엔지니어링을 공부하는 저의 작업을 문서화하고 소개하는 시리즈의 첫 번째 게시물입니다. 클라우드 엔지니어링@madebygps 로드맵인 learntocloud.guide에 대한 멋진 학습 가이드를 따랐습니다. 가이드는 7단계로 나뉩니다.

  1. 배쉬

2. 네트워킹

3. 프로그래밍, Git 및 프롬프트 엔지니어링

4. AWS/애저/GCP

5. 테라폼

6. 도커

7. Github 작업

이러한 단계는 클라우드 엔지니어링을 구성하는 기본 도메인입니다. 각 단계는 학습 주제를 포함하며 실습 경험을 통해 습득한 지식을 적용하고 실용적인 기술을 습득할 수 있는 프로젝트로 마무리됩니다.

Azure Account Setup & Creating an Ubuntu VM

내가 한 첫 번째 일은 구독을 만들고 월 예산을 20 달러로 설정하고 예산의 50 % 및 70 %에있을 때 알려주는 알림이었습니다. 그런 다음 Azure 스폿 가상 머신 할인을 사용하여 Azure Portal에서 저렴한 Ubuntu VM을 만들었습니다. Azure 스폿 가상 머신은 사용자가 사용되지 않는 용량을 활용할 수 있도록 하여 상당한 비용 절감 효과를 제공합니다. Azure에서 용량을 다시 필요로 하는 경우 리소스의 VM을 제거합니다. VM이 제거된 후 VM에 어떤 일이 발생했는지 결정하는 추가 설정이 있었는데, 기본적으로 VM의 할당을 취소하고 나중에 전원을 다시 켜야 하거나 할당을 취소하고 즉시 삭제해야 합니다. 시간당 가격이 설정된 제한에 도달하면 VM의 할당을 취소하는 가격 제한을 설정할 수도 있습니다. 가격이 $0.02858 이상으로 상승하면 할당을 취소하도록 설정했습니다.

Azure 스폿 VM에 대한 자세한 내용은 https://learn.microsoft.com/en-us/azure/virtual-machines/spot-vms 에서 확인할 수 있습니다.

다음으로, 내 IP 주소에서 포트 22로의 인바운드 연결을 허용하는 규칙을 네트워크 보안 그룹에 추가했습니다.

VM에 인증하기 위해 ssh 키를 만드는 대신 VM에 사용자를 만들었습니다. Putty를 사용하고 공용 IP를 통해 VM에 ssh'd를 사용하고 업데이트, ping 및 ifconfig / network 도구를 설치했습니다. 기본 Linux 관리 명령을 조사하고 VM에서 작업한 후 나중에 Azure CLI를 사용하여 VM을 다시 만들고 싶었기 때문에 VM, 리소스 그룹 및 관련 리소스를 삭제했습니다.

Bash 스크립팅

Bash for Beginners YouTube 시리즈를 시청하기 시작했고 bash-for-beginners GitHub 저장소를 GitHub의 자체 저장소로 분기하여 내 계정에서 저장소 작업을 할 수 있었습니다. GitHub codespace를 사용하여 GitHub의 클라우드에서 무료 VM을 회전하여 시리즈의 자습서를 따랐습니다. 처음 몇 개의 비디오에서는 기본 Linux/bash 명령(help, man, ls, find, whereis, which 등)을 다루었습니다. 시리즈의 후반부에서는 함수, for 루프, if 문 및 재미있는 부분을 만드는 데 중점을 두었습니다.

시리즈를 마친 후 CLI를 사용하여 Ubuntu VM을 만들고 LAMP 서버를 설정하는 스크립트 작업을 했습니다. 스크립트에서 이미지 이름을 지정하는 데 문제가 있었습니다. Canonical의 특정 Ubuntu 최소 이미지를 사용하고 싶었지만 스크립트에서 참조 할 정확한 이미지 이름을 찾을 수 없습니다. 앞으로 스크립트에서 특정 이미지 이름을 참조하는 방법을 살펴 봐야하지만이 스크립트에서는 표준 UbuntuLTS 이미지를 사용했습니다. 스크립트에서 VM 및 리소스 그룹을 만드는 기본 명령을 얻었지만 LAMP 서버를 설정하는 데 필요한 프로그램을 설치할 수 있도록 VM에 SSH하는 방법을 포함하는 데 문제가있었습니다. VM의 공용 IP를 표시하고 변수에 저장하기 위해 다양한 명령을 조사했지만 작동시키는 데 도움이 필요했고 결국 ChatGPT를 사용하여 해당 부분을 도왔습니다. 다음은 스크립트 생성을 완료하기 위해 ChatGPT로 수행한 작업에 대한 요약입니다.

초기 장애물

내가 직면 한 초기 장애물은 VM의 IP 주소를 추출하는 것이 었습니다. 처음에는 — query 'publicIps' 옵션과 함께 az vm show 명령을 사용하여 검색하려고 시도했습니다. 그러나 이 방법은 효과가 없었습니다. 명령을 "az network public-ip list — resource-group $resource_group_name — query "[].ipAddress" — output tsv"로 수정하여 IP 주소를 성공적으로 추출했습니다.

VM에 대한 SSH 연결을 설정하려고 할 때 SSH 명령에 잘못된 변수 사용이 포함되어 있음을 발견했습니다. 신중한 분석 후 올바른 변수 참조를 통합하여 문제를 해결하여 성공적인 SSH 연결을 가능하게했습니다.

" vm_ip_address=$(az network public-ip list — resource-group $resource_group_name — query "[].ipAddress" — output tsv)
echo "VM IP 주소: $vm_ip_address"

ssh -t $admin_username@$vm_ip_address"

추가 개선 사항

스크립트를 더욱 향상시키겠다는 결심으로 install_lamp 함수와 verify_apache_mysql 함수를 install_lamp_and_verify라는 단일 함수로 결합했습니다. 이러한 수정을 통해 설치 및 확인 프로세스가 단일 SSH 세션 내에서 수행되어 워크플로를 간소화하고 효율성을 높일 수 있었습니다.

bash 스크립트는 이러한 단계를 수행하고, 부지런히 문제를 해결하고, 필요한 조정을 구현하여 이제 VM을 만들고, 해당 IP 주소를 추출하고, SSH 연결을 설정하고, LAMP 스택을 설치하고, 설치된 구성 요소를 완벽하게 확인합니다. 최종 스크립트는 다음과 같습니다.

다음 단계

스크립트를 다시 방문하여 다음과 같이 변경했습니다.

• 지역이 비용이 더 낮은 eastus2로 변경했습니다.

• 디스크 크기를 기본값보다 저렴한 standard_B1s로 변경했습니다.

• 모든 변수를 소문자로 변경했습니다(모범 사례).

변경하는 동안 원본 스크립트의 복사본을 유지할 수 있도록 새 Git 분기를 만들었습니다. 완료되면 분기를 병합하겠습니다. 마지막으로 스크립트 작업을 할 때 VM 및 VM과 연결된 모든 리소스/그룹을 중지하고 삭제하여 비용이 발생하지 않도록 했습니다. 스크립트를 다시 실행하여 작업 할 다음 스크립트 아이디어를 만들고 테스트하는 데 사용할 수있는 VM을 만들었습니다. 이 스크립트는 Ubuntu LAMP 서버를 만들기 위해 완벽하게 작동합니다!

맞춤법 검사 스크립트

그런 다음 사용자에게 폴더를 요청하고 해당 폴더의 모든 파일을 맞춤법으로 검사하는 스크립트를 만들었습니다. 이 스크립트를 직접 만들고 싶었지만 어디서부터 시작해야 할지에 대한 지침이 필요했습니다. 필자는 달성하고자하는 목표와 유사하게 기능하는 다른 스크립트 (사용자로부터 입력을 받고, 항목을 반복하고, 맞춤법 검사 등)를 온라인에서 조사했습니다.

스크립트를 스크립트가 취해야 할 정확한 작업으로 분해하여 시작할 프레임 워크를 갖기 시작했습니다.

그런 다음 각 섹션에 명령을 추가했습니다. 나는 다른 맞춤법 검사 명령을 연구했다 - aspell, ispell, spell. 주문은 이 용도로 사용하기에 충분히 간단했습니다. spell 명령의 구문에 대한 몇 가지 예를 발견하고 -p 플래그를 사용하여 read 명령을 조사하여 사용자에게 입력을 요청하고 입력을 변수에 저장했습니다. 또한 if 문을 사용하여 폴더가 존재하는지 확인하고 for 루프를 사용하여 주어진 폴더의 파일을 반복 한 다음 모두 묶어서 다음과 같이 얻었습니다.

(이것은 아래에 설명된 편집 후 작동하는 최종 코드입니다.)

의도적으로 철자가 틀린 텍스트가 있는 몇 가지 샘플 텍스트 파일이 있는 테스트 디렉토리를 만들었습니다. 스크립트를 실행했을 때 폴더가 존재하더라도 폴더를 찾지 못한 후 종료되었습니다. 나는 실수를 깨달았다 - 나는 폴더 를 변수인 $folder로 지정하지 않았다. 일단 수정하면 스크립트가 실행되고 "맞춤법 검사 파일 ..."을 에코한 후 아무것도하지 않습니다. 나는 그것이 아무것도하고 있는지 알 방법이 없었다. 몇 가지 편집과 테스트를 거친 후에도 동일한 결과를 계속 얻었습니다. ChatGPT를 사용하고 싶었지만 코드를 올바르게 사용하고 싶지 않았습니다. 나는 그것을 고치는 방법을 알고 싶었다. ChatGPT를 통해 스크립트를 실행하고 스크립트의 목적과 막힌 부분을 설명했습니다. ChatGPT는 저를 한 줄씩 안내하고 잠재적인 실수가 있는 부분과 제안된 수정 사항을 보여주었습니다.

나는 $folder 년에 $file 사용하고 있었다. 나는 $file 이전에 선언하고 $를 제거한 변수가 아니라는 것을 깨달았습니다. 제안된 변경 사항을 적용했고 스크립트가 작동했습니다. ChatGPT를 통해 스크립트를 한 번 더 실행하고 각 부분이 하는 일을 더 잘 이해할 수 있도록 작동 방식에 대한 코드를 한 줄씩 설명해 달라고 요청했습니다. 필자는 이미 bash-for-beginners 시리즈에서 if 문과 for 루프를 사용하는 방법을 배웠고 spell 및 read 명령을 연구했지만 스크립트의 컨텍스트에서 명령을 한 줄씩 살펴보는 데 도움이 되었습니다.

마지막으로 Ubuntu VM 및 리소스 그룹을 삭제하는 스크립트도 만들었습니다. 기본적으로 VM을 만드는 데 사용한 것과 동일한 스크립트를 사용하여 거꾸로 작업했습니다.

스크립트는 작동하지만 VM 및 리소스 그룹을 삭제하는 데 시간이 오래 걸리므로 추가 조정 및 테스트가 필요할 수 있습니다.

지금까지의 Azure 여정에서 저는 1주 동안 $58.<>만 지출하여 비용을 매우 낮게 유지했습니다.

이 기간 동안 얻은 기술과 지식은 가치 있는 투자가 되었습니다. Azure 계정을 설정하고, Ubuntu VM을 만들고, Bash 스크립팅 및 자동화를 마스터하여 클라우드 엔지니어링 작업을 위한 견고한 기반을 마련했습니다. 클라우드 엔지니어링 연구 가이드의 나머지 단계를 진행하는 동안 향후 게시물을 계속 지켜봐 주십시오.

728x90