66. Ansible 및 Azure Pipelines을 사용하여 클라우드에서 인프라 배포 자동화
<참조> https://www.azuredevopslabs.com/labs/vstsextend/ansible/
개요
Ansible은 클라우드 프로비저닝, 구성 관리 및 애플리케이션 배포를 자동화하는 오픈 소스 도구이다. Ansible을 사용하여 가상 머신, 컨테이너, 네트워크 및 완전한 클라우드 인프라를 프로비저닝 할 수 있다. 또한 Ansible을 사용하면 환경에서 리소스의 배포 및 구성을 자동화 할 수 있다.
Ansible에는 원격 호스트 또는 플레이 북을 통해 직접 실행할 수 있는 Ansible 모듈 제품군이 포함되어 있다. 사용자는 자신의 모듈을 만들 수도 있다. 모듈은 서비스, 패키지 또는 파일과 같은 시스템 리소스를 제어하거나 시스템 명령을 실행하는 데 사용할 수 있다.
Azure 서비스와 상호 작용하기 위해 Ansible에는 Azure에서 인프라를 쉽게 만들고 오케스트레이션하는 도구를 제공하는 Ansible 클라우드 모듈 제품군이 포함된다.
본 랩에서 다루는 내용
이번 랩에서 다음을 살펴 볼 것이다.
- Ansible을 사용하여 IaC (Infrastructure as Code)를 구현하는 방법
- Ansible 및 Azure 파이프 라인을 사용하여 클라우드에서 인프라 배포를 자동화하는 방법
다음 이미지는 이 랩에서 설명하는 모든 단계를 안내한다.
시작하기 전에
- 다음 실습을 수행하기 전에 시작하기 페이지를 참조한다.
- Azure DevOps 데모 생성기를 사용하여 Azure DevOps 조직에 프로젝트를 프로비저닝 한다. 이 URL은 데모 생성기에서 Ansible 템플릿을 자동으로 선택한다. 다른 프로젝트를 시도하려면 대신 이 URL을 사용한다. https://azuredevopsdemogenerator.azurewebsites.net/
간단한 실습을 따라하여 Azure DevOps 데모 생성기 사용 방법을 알아본다.
환경 설정하기
과제 1: Azure CLI를 사용하여 Azure 서비스 주체 만들기
Ansible에는 Azure Resource Manager와 상호 작용하기 위한 모듈 제품군이 포함되어있어 Microsoft Azure 클라우드에서 인프라를 쉽게 만들고 오케스트레이션하는 도구를 제공한다. Azure Resource Manager 모듈을 사용하려면 Azure API로 인증해야한다. 이 랩에서는 인증을 위해 Azure 서비스 주체를 사용한다.
(필자는 작업의 편의를 위해 Windows Terminal을 통해 Azure Cloud Shell에서 작업을 진행할 것이다. Windows Terminal을 사용하려면 여기를 참조한다.)
1. Windows Terminal을 실행한다.
2. 새 탭 드롭다운 메뉴에서 Azure Cloud Shell을 선택한다.
3. 안내에 따라 브라우저를 통해 인증을 득하고 테넌트가 여러 개일 경우 작업 대상을 선택하 후 명령 프롬프트가 떨어지면 az login을 수행한다.
(이어지는 자격증명 정보 등을 입력하여 인증과정을 수행한다.)
4. 원하는 값으로 ServicePrincipalName을 대체하여 다음 명령을 수행한다.
az ad sp create-for-rbac -n ServicePrincipalName |
이미지에서 보는 바와 같이 JSON 출력을 제공한다. 노트패드 또는 텍스트 파일에 출력을 복사한다. 이 세부내용은 다음 과제에서 필요하다.
Azure 서비스 주체에 대한 자세한 내용은 여기를 클릭한다.
과제 2: 리눅스 머신에 Ansible 구성
Ansible을 사용하여 Azure에서 리소스를 만들고 프로비저닝하려면 Ansible이 구성된 Linux VM이 있어야 한다. 이 실습에서는 Ansible과 함께 사전 설치되고 구성된 Azure Linux VM을 배포한다.
1. Deploy to Azure 버튼을 클릭하여 Ansible이 설치된 Ubuntu 18.04 VM을 프로비저닝한다.
표시된대로 필요한 모든 정보를 제공한다. 배포를 완료하는 데 약 5-10 분이 걸린다.
중요 결국 Azure CLI를 사용하여 Ansible 구성으로 배포하여 진행하였다. 혹시 동일한 내용으로 문제가 발생하면 Azure CLI를 사용하여 Ansible 구성을 따라 M 생성 및 Ansible 설치 후 진행한다. |
2. 배포가 성공하면 리소스 그룹으로 이동하여 VM을 선택한다.
3. Connect를 클릭하여 접속 정보를 확인하고 각자 상황에 따라 또는 다음과 같이 ssh 접속한다.
$ ssh-keygen.exe $ ssh -i <private key path> username@VMPublicIP |
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Try the new cross-platform PowerShell https://aka.ms/pscore6
PS C:\Users\zerobig> ssh-keygen.exe
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\zerobig/.ssh/id_rsa):
Created directory 'C:\Users\zerobig/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\zerobig/.ssh/id_rsa.
Your public key has been saved in C:\Users\zerobig/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:JTr7StDB4cIGgHBh4Bo4TNvNbDyltQpQ3Qnkr9aSqMQ zerobig@zerovm10pro
The key's randomart image is:
+---[RSA 2048]----+
|*=*ooo+o. |
|*o+o*+++. |
|++ o+X+.. . |
|.o .oo+o o |
|. ..+.S |
|. ..+o |
| E . =o. |
|. . .... |
| . ... |
+----[SHA256]-----+
PS C:\Users\zerobig> ssh -i C:\Users\zerobig\.ssh\id_rsa zerobig@20.194.29.157
The authenticity of host '20.194.29.157 (20.194.29.157)' can't be established.
ECDSA key fingerprint is SHA256:5JlMrvVQ/JKcvciWk/+dJkMcuInbf8IhCwoOjlC5DQA.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '20.194.29.157' (ECDSA) to the list of known hosts.
zerobig@20.194.29.157's password:
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-1031-azure x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Fri Jan 8 01:12:14 UTC 2021
System load: 0.08 Processes: 113
Usage of /: 8.5% of 28.90GB Users logged in: 0
Memory usage: 11% IP address for eth0: 10.0.0.4
Swap usage: 0%
0 packages can be updated.
0 of these updates are security updates.
*** System restart required ***
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
zerobig@linuxvm-ansible:~$
4. 이제 홈 디렉터리에 .azure라는 디렉터리를 만들고 그 아래에 자격 증명 파일을 만들어야한다. 다음 명령을 입력하여 작성한다.
$ mkdir ~/.azure $ nano ~/.azure/credentials |
zerobig@linuxvm-ansible:~$ mkdir ~/.azure
zerobig@linuxvm-ansible:~$ nano ~/.azure/credentials
5. credentials 파일에 다음 줄을 삽입한다. 자리 표시자를 이전 작업에서 복사한 서비스 주체 세부 정보의 정보로 바꾼다. Ctrl+O를 눌러 파일을 저장하고 Ctrl+X를 눌러 텍스트 편집기를 종료한다.
[default] subscription_id=<your-Azure-subscription_id> client_id=<azure service-principal-appid> secret=<azure service-principal-password> tenant=<azure serviceprincipal-tenant> |
6. Ansible은 에이전트 없는 아키텍처 기반 자동화 도구이다. Ansible Control Machine 개인/공개 키 쌍을 사용하는 SSH 인증만 필요하다. 이제 개인 및 공개 키 쌍을 생성해 보겠다. 다음 명령을 실행하여 ssh에 대한 개인/공개 키 쌍을 생성하고 로컬 시스템에 공개 키를 설치한다.
$ ssh-keygen -t rsa |
zerobig@linuxvm-ansible:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/zerobig/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/zerobig/.ssh/id_rsa.
Your public key has been saved in /home/zerobig/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Zv36kRfxGo1kGfKGpkSmS4Yiz5l2mMGbphqXPUvxZTE zerobig@linuxvm-ansible
The key's randomart image is:
+---[RSA 2048]----+
| o . . |
| . . + + o |
| . + . E . o B |
| + X o * o + = |
| & . S o + o|
| * + = . . + |
|. + + . + o |
| + . o . o |
|. . ... |
+----[SHA256]-----+
zerobig@linuxvm-ansible:~$ chmod 755 ~/.ssh
zerobig@linuxvm-ansible:~$ touch ~/.ssh/authorized_keys
zerobig@linuxvm-ansible:~$ chmod 644 ~/.ssh/authorized_keys
zerobig@linuxvm-ansible:~$ ssh-copy-id zerobig@127.0.0.1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/zerobig/.ssh/id_rsa.pub"
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:5JlMrvVQ/JKcvciWk/+dJkMcuInbf8IhCwoOjlC5DQA.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
zerobig@127.0.0.1's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'zerobig@127.0.0.1'"
and check to make sure that only the key(s) you wanted were added.
참고 : 위 명령에서 vmadmin을 VM 사용자 이름으로 바꾼다.
$ cat ~/.ssh/id_rsa |
zerobig@linuxvm-ansible:~$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAx0YmkGH3PGBNOGva7jjz4omPbB47hgr3Aw54kcOva4jrNXGP
cYJ10orZFuK7fjLlIlm61gWD3xzUIaWljDzrOepDABxS4lKnreU8hK3inGIDJhUG
0COt3gpixABo5t7/fC41IXbaHPCyAGquGF+3OD381cygZkgr2T25zPBLot1JHPkw
fpGEkaMVTQSBj32yArjxsEO5spM251FYKf0UMfupiXH6Jav8hl6uTVA/CVAq+lq2
C9nv3Ro+qn1e0FPuVNY+HyzvH18bwQgesP1c520Yx3MT9f3Bia51SPhUFWPhHAZ5
ACOof31bseEqEQrtAFsFnq2qH/1yJJencLri6wIDAQABAoIBABx2n7GF3LuqAb2q
YjYeum9EONE3rEbkMA4mtgAUFG1mvDoBA30yJkQxgvqq3h8Tg/kZGf/R/9kRlBdO
Qsw6M1stY+6THR+osLy8/pzw/Wpa8Zox7Kw0PHR3xU27xUAc4B9LtlkWUedKVhKL
Klze5xvIduHO/aY+bszz7SMhu5wCgNheuYxk+s3FeIrYjlkuGxiXY35RyKnJsZKV
tvr3Z2Md8HSI8hLh1hc1jAUvgZ1y69lOrrIL2kqmjN6vBYiXRNpp9v55lS0+tK2E
k5MN5n/aVta2aBTo1TkopdT1QyQQhvjAEFp+uAkSNiDj2LDWaevn9/4FF1Gkmf7w
YRCa/RECgYEA9jslLS4yFS3rj+FxeSKK8V+Gmkq4/SH1qvrorm6KSca4gROiPYxK
sQyOYzgeh8TuoKRvPFkKrmM9hNbP02UD0Ni9a+1BzDJx4E/5wUa/TEQHVju//9VN
wJy8OaT+fwsYbTIz5r9S8lNp3b0g+RZVg5nZqvwilxU2RXj5G+XBjxMCgYEAzy4V
tDHBqXSAMEddEisjQmjg5fCYry0kjSWAqJ6kFq1MMcXRvmimNha+WNiM5d5VMtE+
F5VCYShz+IA+Xv12orsATno1o/urkqyOrUeihktCynmdudFMz4JEYpgawYFR9eNz
GSuldfBJqXaR7kmTc+SijoNyZc2MlCN5IjNg38kCgYB8oatLlxpahge5qA7blZRm
YEetSS0hU1MZ3C5yPBlbBm7VRq7UIHKd8xEPP5SUfCWcwh5bmWZCppC48FH5WiP4
Tfxy6IBpbw8czt5H6hth6v0btNqWD81vNOZA9zap71/JxaNnpGfDqFzpk5Vg/uEB
35nBZiXL+zyhJX5RlJXIaQKBgFHStpmrCPw+2Z23oYdaaBuDRkcp5XNR1dy00gJG
XTHjkXMa2IJl3DcCdnyqUcM7MtTWFLrFpSiwDFU5eOiVG/Sa/D0CQQsZiyJrahH/
d62oLaG/tE493iMaJJ33yqFfzJnbEYsAVOGmW8FE5c+BWW3s/1JfkZ+pNXsQI3gh
aIIZAoGBAMpSj295tFmjdVksxVyrO5Afq/1n/XBGO0kqb4K3AuKjsGzhlAtxZ/BK
Ub8/tflMT/M15hm7cbLn6TuBSanu/J+aMfUuIKQVthjtE+haMG7LB9j/2vJmgMJ+
1DOlMQtgg7s2gYFjvaYy5/vP0J5fabrxdD3cOQzR3lLmssAswKoq
-----END RSA PRIVATE KEY-----
과제 3: Azure DevOps에서 SSH 서비스 연결 만들기
Azure 파이프 라인에서 Ansible VM을 통해 플레이 북을 연결하고 실행하려면 Azure DevOps와 Ansible VM이 연결되어 있어야한다. 이 서비스 연결은 Ansible에 대한 인증을 제공한다.
1. Azure DevOps 데모 생성기를 사용하여 위에서 만든 프로젝트로 이동한다.
2. Project Settings –> Service Connections을 선택한다. Select +New service connection선택하고 SSH를 선택한다.
3. Add an SSH service connection 창에서 필요한 세부 정보를 제공하고 저장한다.
실습 1: 소스 코드에서 Ansible 플레이 북 (IaC) 조사
이 실습에서는 MySQL 데이터베이스로 지원되는 샘플 Java 애플리케이션인 SmartHotel360-CouponManagement를 사용한다. SmartHotel Java 애플리케이션을 배포하는 데 필요한 Azure 리소스를 프로비저닝하는 데 도움이되는 Ansible 플레이 북을 살펴 보겠다. 프로젝트로 이동한다.
1. Repos를 선택한다.
2. ansible-scripts 폴더에서 webapp.yml 파일을 선택한다. 코드를 살펴본다.
webapp.yml은 YAML 형식으로 작성된 Ansible 플레이 북 파일이다. Ansible 플레이 북은 Ansible의 구성, 배포 및 오케스트레이션 언어이다. 원격 시스템에서 시행 할 정책 또는 일반 IT 프로세스의 일련의 단계를 설명 할 수 있다. 이러한 플레이 북은 YAML 파일 형식을 사용하여 구성 또는 프로세스의 모델을 정의한다.
Ansible에는 Azure Resource Manager와 상호 작용하기위한 모듈 제품군이 포함되어 있어 Microsoft Azure 클라우드에서 인프라를 쉽게 만들고 오케스트레이션 하는 도구를 제공한다.
이 예제에서는 웹 사이트를 배포하는 데 필요한 Azure 리소스 그룹, 앱 서비스 계획, 앱 서비스 및 MySQL 데이터베이스를 배포하려고한다. 그리고 필요한 Azure 리소스를 배포 할 수있는 Azure DevOps 프로젝트의 소스 제어 저장소에 플레이 북 파일 (Infrastructure as Code)을 추가했다.
다음과 같이 플레이 북 webapp.yml을 업데이트한다.
다음 이미지와 같이 앱 서비스의 이름을 Linux에서 Windows로 변경한다.
또한 다음 이미지와 같이 EndIpAdress를 255.255.255.255에서 0.0.0.0으로 변경한다.
실습 2: Azure CI Pipeline을 사용하여 애플리케이션 빌드
이 연습에서는 애플리케이션을 빌드하고 필요한 파일을 drop이라는 아티팩트에 게시한다.
1. Pipelines > Pipelines로 이동한다. Ansible-CI를 선택하고 Edit을 클릭한다.
2. 빌드 파이프 라인은 다음과 같다. 이 CI 파이프 라인에는 Java 프로젝트를 컴파일하는 태스크가 있다. 파이프 라인의 Maven은 종속성을 복원하고 빌드 출력을 빌드, 테스트 및 웹 애플리케이션에 배포 할 수 있는 war 파일 (패키지)로 게시한다.
Azure Pipelines를 사용하여 Java 프로젝트를 빌드하는 방법에 대한 자세한 지침은 여기를 참조한다.
3. 애플리케이션 빌드 외에도 CD 파이프 라인에서 사용할 수 있도록 Ansible 스크립트를 게시해야한다. 그래서 우리는 Ansible 플레이 북 .yml 및 자바 웹 패키지 .war 파일을 Artifacts 디렉토리에 복사하도록 Copy files 태스크를 구성했다.
4. 이제 Queue를 클릭하여 빌드를 트리거한다. 빌드가 성공하면 아티팩트에 ansible_scripts 폴더와 ROOT.war 파일이 drop에 있는지 확인한다.
실습 3: Azure CD Pipeline에서 Ansible을 사용하여 리소스 배포
이 실습에서는 배포 (CD) 파이프 라인의 일부로 Ansible을 사용하여 Azure 리소스를 만들고 Ansible에서 프로비저닝 한 앱 서비스에 SmartHotel Coupon 관리 애플리케이션을 배포한다.
1. Pipelines > Releases로 이동한다. Ansible-CD를 선택하고 Edit을 클릭한다.
2. Azure Dev 스테이지를 선택하고 View stage tasks를 클릭하여 파이프라인 태스크를 본다.
다음과 같은 태스크가 표시된다.
3. Replace Tokens 태스크를 선택한다.
실습 1, 단계 2에서 webapp.yml 파일을 살펴보면 접미사 및 접두사가 __로 끝나는 값이 거의 없음을 알 수 있다. 예 : __ webappName __. 토큰 바꾸기 태스크를 사용하여 해당 값을 릴리스 파이프 라인에 정의 된 변수 값으로 바꾼다.
CD 파이프 라인은 일부 기본값으로 프로비저닝됩니다. 필요한 경우 변수 값을 변경할 수 있습니다.
4. Ansible 태스크를 선택한다. 이 태스크는 Ansible과 통합하는 것이다. 이 태스크는 명령 줄 인터페이스를 통해 지정된 인벤토리 노드 목록에서 주어진 Ansible 플레이 북을 실행한다. 이 태스크를 수행하려면 Playbook 파일이 비공개 Linux 에이전트 또는 Ansible 자동화 엔진이 설치된 원격 머신에 있어야한다. Ansible Location 을 Remote Machine을 선택하고 과제 3에서 생성한 Ansible SSH endpoint를 선택한다.
Inventory 섹션에서 인벤토리 위치로 Host list를 선택하고 아래와 같이 Host list 필드에 ansible vm의 pubic ip를 입력한다.
5. Azure App Service Deploy 태스크를 선택한다. 드롭 다운 목록에서 Azure 구독을 선택하고 Authorize를 클릭하여 Azure 서비스 연결을 구성한다. 이 애플리케이션은 Ansible 스크립트를 사용하여 프로비저닝 된 MySQL 데이터베이스에 연결하기 위해 몇 가지 앱 설정이 필요하다. 태스크에서 App settings 매개 변수를 사용하여 업데이트하고 있다. 이 태스크는 이전 단계에서 Ansible 태스크로 프로비저닝 된 Azure 앱 서비스에 SmartHotel360-CouponManagement 패키지를 배포한다.
6. 완료되면 변경 사항을 Save 하고 Create a release 한다.
7. 릴리스가 성공하면 Azure Portal로 이동한하여 생성한 앱을 선택하고 배포된 애플리케이션을 찾아본다.
8. 다음 자격 증명으로 사이트에 로그인 할 수 있다.
Username: me@smarthotel360.com
Password: 1234
요약
이 랩에서는 Ansible을 사용하여 Azure 리소스를 자동으로 배포하고 Azure Pipelines를 사용하여 애플리케이션을 배포하는 방법을 배웠다.
Ansible on Azure 설명서 및 빠른 시작은 여기를 클릭한다.
참고
이 랩에서 설명하는 모든 단계를 안내하는 비디오는 여기에서 시청할 수 있다.