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에 테스트 인스턴스를 배포하는 방법을 간단히 살펴보겠습니다.

텍스트 기반 학습을 선호하는 분들은 이 튜토리얼을 따라 컬렉션의 작동 방식과 VM 생성 방법을 이해하실 수 있습니다. 시각적인 학습 스타일을 선호하는 분들은 다음 영상 의 튜토리얼을 따라 하실 수 있습니다 .
이 모든 것이 어떻게 작동하나요?
이 컬렉션은 pre-req-install과 cornerstone의 두 가지 역할로 구성됩니다. 두 역할 모두 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를 참조하세요.

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