Ansible Collections를 사용하여 가상 머신을 빌드하는 방법

Red Hat Blog를 보다가 관심 가는 글이 보여서 AI번역+약간 교정해 보았습니다.
출처: https://developers.redhat.com/articles/2024/11/27/how-build-virtual-machines-using-ansible-collections

Cornerstone Collection은 Red Hat Ansible Automation Platform 기반의 랩 프로비저닝 도구입니다 . 온프레미스 환경(libvirt)과 클라우드 기반 플랫폼(예: Amazon Web Services(AWS), Microsoft Azure, Google Cloud Platform(GCP))에서 가상 머신(VM)을 생성하는 프로세스를 간소화합니다. 그림 1은 이를 보여줍니다. 이 문서에서는 이 컬렉션을 사용하여 AWS와 GCP에 테스트 인스턴스를 배포하는 방법을 간단히 살펴보겠습니다.

코너스톤 아키텍처 다이어그램
그림 1: 코너스톤 아키텍처 다이어그램.

텍스트 기반 학습을 선호하는 분들은 이 튜토리얼을 따라 컬렉션의 작동 방식과 VM 생성 방법을 이해하실 수 있습니다. 시각적인 학습 스타일을 선호하는 분들은 다음 영상 의 튜토리얼을 따라 하실 수 있습니다 .

이 모든 것이 어떻게 작동하나요?

이 컬렉션은 pre-req-installcornerstone의 두 가지 역할로 구성됩니다. 두 역할 모두  main.yml로 불리는 전역 변수 파일을 활용하는데, 이 파일은프로비저닝 프로세스에서 이러한 역할을 호출하는 플레이북 옆의 별도 디렉터리에 있습니다. main.yml에는 VM 구축에 필수적인 모든 변수가 포함되어 있어 접근성이 더욱 중요해지기 때문입니다.

플레이북 주문:

```
[oezeakac@oezeakac-thinkpadt14gen3 cornerstone-playbooks]$ tree
.
├── pre-req-run.yml
├── run.yml
└── vars
    └── main.yml
```

pre-req-install 역할:

이 역할은 가상 머신 생성에 필요한 패키지 및 도구의 설치 및 구성을 자동화합니다. 이 역할은 아래와 같이 플레이북(pre-req-run.yml)을 통해 활용되며, main.yml vars 파일을 사용하여 설치를 성공적으로 완료합니다. 아래 main.yml 발췌 부분을 보면 AWS 또는 GCP에서 VM을 실행하기 위해 제공해야 하는 변수의 예를 확인할 수 있습니다.

pre-req-run.yml:

```
---
- name: Build Instance  
  hosts: localhost
  vars_files:
    - vars/main.yml
  tasks:
    - include_role:
        name: cornerstone.cornerstone.pre_req_install
```

전체 예는 아래에서 확인할 수 있습니다.

/vars/main.yml (AWS):

```yaml
aws_system_user:
aws_profile:             #Ex: profile1
aws_access_key:          #access-key
aws_secret_key:          # secret-key
aws_region:              #Ex: "eu-west-1"
aws_format:              #Ex: table
foundation:              #Ex: "aws" 
key_name:                #Ex: aws_keypair
key_file:                #Ex: /home/oezeakac/labs/Ansible/cornerstone-playbooks/aws_keypair #non-root dir
ansible_python_interpreter: #Ex: /usr/bin/python3.11
cornerstone_prefix:         #Ex: cs
cornerstone_ssh_admin_username: #Ex: rhadmin
cornerstone_ssh_admin_pubkey: #Ex: rsa.pub
cornerstone_aws_ssh_key_name: #Ex: "{{ key_name }}"
cornerstone_aws_profile: #Ex: default
cornerstone_ssh_user: #Ex: ec2-user
cornerstone_ssh_key_path: #Ex: "ssh_key.pem"
cornerstone_platform: #Ex: aws
cornerstone_location: #Ex: eu-west-1
```

/vars/main.yml (GCP):

```yaml
foundation:             #Ex: "gcp"
```

foundation 변수는 역할의 작업 폴더에서 실행될 설정 작업을 결정하는 데 사용됩니다. main.yml작업 디렉터리 아래의 파일을 살펴보세요. foundation 변수 값이 로 설정되면 aws플레이 aws.yml북이 실행되고 AWS 관련 설치 작업이 실행됩니다. foundation 변수 값이 로 설정되면 gcp플레이 gcp.yml북이 실행되고 GCP 관련 작업이 실행됩니다. Libvrt 및 Azure 값에도 동일한 논리가 적용됩니다.

/tasks/main.yml:

```yaml
- name: AWS Pre-Req Install
  ansible.builtin.include_tasks: "aws.yml"
  when: foundation == 'aws'
- name: Azure Pre-Req Install
  ansible.builtin.include_tasks: "azure.yml"
  when: foundation == 'azure'
- name: Libvrt Pre-Req Install
  ansible.builtin.include_tasks: "libvrt.yml"
  when: foundation == 'libvrt'
- name: GCP AWS Pre-Req Install
  ansible.builtin.include_tasks: "gcp.yml"
  when: foundation == 'gcp'
```

준비가 되면 관련 정보로 vars 파일을 채우고 다음 명령으로 플레이북을 실행합니다.

```
ansible-navigator run pre-req-run.yml
```

코너스톤 역할

이 역할은 선택한 클라우드 환경에서 가상 머신을 만드는 작업을 수행합니다.

run.yml:

```
---
- name: Build Instance  
  hosts: localhost
  vars_files:
    - vars/main.yml
  tasks:
    - include_role:
        name: cornerstone.cornerstone.Cornerstone
```

/vars/main.yml (AWS):

```yaml
cornerstone_sg:
  - name: "testworkshop-sg"
    description: Security group for aws
    region: "{{ cornerstone_location }}"
    rules:
      - proto: tcp
        from_port: 22
        to_port: 22
        group_name: ""
        cidr_ip: 0.0.0.0/0
        rule_desc: "allowSSHin_all"
      - proto: tcp
        from_port: 443
        to_port: 443
        group_name: ""
        cidr_ip: 0.0.0.0/0
        rule_desc: "allowHttpsin_all"
      - proto: all
        from_port: ""
        to_port: ""
        group_name: "testworkshop-sg"
        cidr_ip: 0.0.0.0/0
        rule_desc: "allowAllfromSelf"
vm_state: present
guests:
  testsystem1:
      cornerstone_vm_state:            #Ex: "{{vm_state}}"
      cornerstone_platform:            #Ex: aws
      cornerstone_tag_purpose:         #Ex: "Testing"
      cornerstone_tag_role:            #Ex: "testsystem"
      cornerstone_vm_name:             #Ex: testsystem
      cornerstone_location:            #Ex: eu-west-1
      cornerstone_vm_aws_az:           #Ex: eu-west-1a
      cornerstone_vm_flavour:          #Ex: t3.2xlarge
      cornerstone_vm_aws_ami:          #Ex: ami-0b04ce5d876a9ba29
      cornerstone_vm_aws_sg:           #Ex:  obitestworkshop-sg
      cornerstone_virtual_network_name: #Ex: "{{ cornerstone_prefix }}vnet"
      cornerstone_virtual_network_cidr: #Ex: "10.1.0.0/16"
      cornerstone_subnet_name:          #Ex: "{{ cornerstone_prefix }}subnet"
      cornerstone_public_private_ip:    #Ex: public
      cornerstone_vm_private_ip:              
      cornerstone_vm_assign_public_ip:  #Ex: yes
      cornerstone_vm_public_ip:         #Ex: 63.34.15.95
      cornerstone_publicip_allocation_method: #Ex: Dynamic
      cornerstone_publicip_domain_name: #Ex: null
      cornerstone_vm_os_disk_size:      #Ex: 10
      cornerstone_vm_data_disk:         #Ex: false
      cornerstone_vm_data_disk_device_name: #Ex: "/dev/xvdb"
      cornerstone_aws_vm_data_disk_managed: #Ex: "gp2"
      cornerstone_vm_data_disk_size:        #Ex: "50"
```

/vars/main.yml (GCP):

```yaml
cornerstone_prefix:     #Ex: cs
cornerstone_platform:   #Ex: gcp
ansible_python_interpreter: #Ex: /usr/bin/python3.11
cornerstone_gcp_project:    #Ex: openenv-d2p2t
cornerstone_gcp_auth_kind:  #Ex: "serviceaccount"
cornerstone_service_account_file: #Ex: /home/oezeakac/labs/Ansible/cornerstone-playbooks/openenv-prbtd-6d274028b755.json - This is the private key
cornerstone_virtual_network_name:  #Ex: "{{ cornerstone_prefix }}-vnet"
cornerstone_location:              #Ex: europe-west2
cornerstone_gcp_zone:              #Ex: europe-west2-a
cornerstone_virtual_network_cidr:  #Ex: 172.16.0.0/28
cornerstone_gcp_use_serviceaccount: true
cornerstone_ssh_admin_username: root user
cornerstone_ssh_admin_pubkey:       #<generate pub ssh key and sub in here when running run.yml>
ocp4_platform: gcp
cornerstone_sg:
  - name: "cs-sg"
    description: "firewall rules"
    rules:
      - proto: tcp
        from_port: 22
vm_state: present
guests:
  bastion:
    cornerstone_platform:               #Ex: gcp
    cornerstone_gcp_project:            #Ex: openenv-d2p2t
    cornerstone_gcp_auth_kind:          #Ex: "serviceaccount"
    cornerstone_service_account_file: "" #Ex:/home/oezeakac/labs/Ansible/cornerstone-playbooks/openenv-prbtd-6d274028b755.json 
    cornerstone_working_dir:            #Ex:'/tmp/'
    cornerstone_vm_state:               #Ex:"{{vm_state}}"
    cornerstone_vm_name:                #Ex: "bastion"
    cornerstone_location:               #Ex:   europe-west2
    cornerstone_gcp_zone:               #Ex:   europe-west2-a
    cornerstone_virtual_network_name:   #Ex: "{{ cornerstone_prefix }}-vnet"
    cornerstone_virtual_network_cidr:   #Ex: 172.16.0.0/28
    cornerstone_subnet_name:            #Ex: "{{ cornerstone_prefix }}subnet"
    cornerstone_vm_flavour:             #Ex: e2-medium
    cornerstone_vm_gcp_source_image:    #Ex:"projects/rhel-cloud/global/images/rhel-8-v20230411"
    cornerstone_vm_os_disk_size:        #Ex: 30
    cornerstone_tag_purpose:            #Ex: "bastion"
    cornerstone_tag_role:               #Ex: "testing"
```

이전 역할과 마찬가지로, 코너스톤은 역할을 활용하는 플레이북과 main.yml의 vars 디렉터리를 통해 사용됩니다. 위의 vars 파일 예시를 다시 살펴보면 선택한 클라우드 플랫폼에서 가상 머신을 생성하는 데 필요한 구성 정보가 포함되어 있음을 알 수 있습니다. AWS를 선택한 경우 VPC, 보안 그룹, EC2 플레이버 등이 여기에 자세히 설명되어 있습니다. 변수 cornerstone-platform는 프로비저닝을 완료하기 위해 실행해야 하는 작업 유형을 결정합니다. main.yml 아래의 작업 폴더에서 변수는 값을 확인하고 cornerstone-platform, 값이 예를 들어 aws로 설정된 경우 AWS 관련 모든 작업 파일이 실행됩니다. 변수 값이 gcp 로 설정된 경우 GCP의 경우도 마찬가지입니다.

아래 명령을 사용하여 플레이북을 실행합니다.

```
ansible-navigator run run.yml 
```

완료되면 AWS 콘솔로 이동하여 EC2 대시보드에서 테스트 인스턴스가 생성되었는지 확인할 수 있습니다. 그림 2를 참조하세요.

Cornerstone을 통해 AWS에서 EC2 인스턴스가 생성되었다는 증거
그림 2: Cornerstone을 통해 AWS에서 EC2 인스턴스가 생성된 증거.

GCP의 배스천 서버의 경우 콘솔에 로그인하면 생성된 것을 볼 수 있습니다(그림 3).

Cornerstone을 통해 GCP에서 GCP 인스턴스가 발생했다는 증거
그림 3: Cornerstone을 통해 GCP에서 GCP 인스턴스가 생성된 증거.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like
Read More

4가지 필수 네트워크 자동화 사용 사례

Red Hat Blog를 보다가 관심 가는 글이 보여서 AI번역+약간 교정해 보았습니다.출처: https://developers.redhat.com/articles/2025/06/23/4-essential-network-automation-use-cases-everyone 기업들이 다양한 공급업체의 구성 요소를 관리하고,…