티스토리 뷰
Terraform OpenStack Provider를 활용한 resource(instance 부터 network, volume 등)을 코드 기반으로 생성하고 삭제하는 방법에 대하여 알아보도록 하겠습니다.
terraform을 써보신 분이라면 쉽게 이해하실수 있는 구조로 생성이 되어집니다.
- provider 정의
- VM 생성을 위한 resource 들 생성 혹은 가져오기
- 가져온 ID 혹은 name을 통해 VM 생성 작업 수행
- 부가적으로 VM에 연결할 추가 resource 연결
OpenStack Provider는 terraform 작성시 두가지 방식을 사용할수 있다.
(다른 provider도 동일한 형태이기는 하다.)
- resources
- datasources
간단하게 분류하면 resources는 신규로 생성하여 해당 resource를 사용하는 방식이고 datasources는 이미 생성되어 있는 resource를 가져와 사용하는 것이다.
OpenStack provider의 경우 API Version에 따른 사용이 차이를 두고 있다.
하여 구성된 OpenStack에서 지원하는 API 버전을 OpenStack Horizon에 접근하여 사전에 확인해 놓는것을 추천한다.
아래와 같이 접근하여 구성된 버전에서 제공하고 있는 API version을 확인할 수 있다.
참고로 최신의 OpenStack에서 현재 지원되고 있는 api version list를 확인할 수 있다.
만약 각 component들의 api url에 접근이 안되는 환경이라면 접근이 가능하도록 domain lookup
아래는 kubernetes 기반의 openstack 이 구성된 환경에서 ingress로 접근가능한 주소이며 이를 host에 추가하여 연결 할수 있도록 하였다.
192.168.0.1 keystone.openstack.svc.cluster.local
192.168.0.1 nova.openstack.svc.cluster.local
192.168.0.1 neutron.openstack.svc.cluster.local
192.168.0.1 cinder.openstack.svc.cluster.local
192.168.0.1 glance.openstack.svc.cluster.local
192.168.0.1 placement.openstack.svc.cluster.local
OpenStack Prpvider를 이용한 OpenStack Resource 생성 및 삭제
provider 설정
provider는 기본정보를 직접 입력하여 사용할수 있다.
아래는 직접 입력한 provider 정보이다.
jacob@jacob-laptop:~/workspace/tf-jacob/tf-openstack$ cat 0-proivder.tf
provider "openstack" {
tenant = ""
username = "admin"
password = "password"
auth_url = "http://keystone.openstack.svc.cluster.local:80/v3"
region = "default"
}
혹은 horizon을 통해 다운로드 가능한 openstack.rc 파일을 다운로드 받아 해당 파일을 그대로 load 하도록 할 수 있다.
provider "openstack" { cloud = "openstack-cloud" }
이후 terraform init을 수행해보면 다음과 같은 plugin이 다운로드 되었음을 확인할 수 있다.
jacob@jacob-laptop:~/workspace/tf-jacob/tf-openstack$ ls -al .terraform/plugins/linux_amd64/
total 29040
drwxr-xr-x 2 jacob jacob 4096 11월 2 13:23 .
drwxr-xr-x 3 jacob jacob 4096 11월 2 13:23 ..
-rw-r--r-- 1 jacob jacob 75751 11월 2 13:23 CHANGELOG.md
-rw-r--r-- 1 jacob jacob 16725 11월 2 13:23 LICENSE
-rwxrwxr-x 1 jacob jacob 85 11월 2 13:23 lock.json
-rw-r--r-- 1 jacob jacob 3101 11월 2 13:23 README.md
-rwxr-xr-x 1 jacob jacob 29622272 11월 2 13:23 terraform-provider-openstack_v1.32.0
Network 및 기타 자원 생성 및 사용
Network 생성 혹은 가져오기
resource "openstack_networking_network_v2" "network_1" {
name = "jacob-network"
admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "subnet_1" {
name = "jacob-subnet"
network_id = openstack_networking_network_v2.network_1.id
cidr = "10.90.90.0/24"
ip_version = 4
}
# 혹은 아래처럼 가져오기
data "openstack_networking_network_v2" "network_2" {
name = var.nat_network
}
floating IP 생성
지정된 pool로부터 생성
resource "openstack_networking_floatingip_v2" "fip_1" {
pool = var.public_network
}
security group 생성
resource "openstack_networking_secgroup_v2" "secgroup_1" {
name = "secgroup_1"
description = "My neutron security group"
}
resource "openstack_networking_secgroup_rule_v2" "secgroup_rule_1" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.secgroup_1.id
}
image 가져오기
data "openstack_images_image_v2" "image" {
name = "centos8"
most_recent = true
}
flavor 생성 혹은 가져오기
resource "openstack_compute_flavor_v2" "flavor_1" {
name = "m1.middle_jacob"
ram = "4096"
vcpus = "2"
disk = "30"
}
# 혹은 아래처럼 가져오기
data "openstack_compute_flavor_v2" "flavor" {
name = "m1.small"
}
public ssh key 생성
data "local_file" "pubkey" {
filename = "${path.module}/pubkey"
}
resource "openstack_compute_keypair_v2" "jacob-test-cloud-key_1" {
name = "jacob-test-key"
public_key = data.local_file.pubkey.content
}
instance 생성 및 각종 연결
instance 생성
앞서 생성한 혹은 가져온 resource 들을 기반으로 instance를 생성한다.
resource "openstack_compute_instance_v2" "testvm" {
name = "test-vm"
image_name = data.openstack_images_image_v2.image.name
flavor_name = data.openstack_compute_flavor_v2.flavor.name
key_pair = openstack_compute_keypair_v2.jacob-test-cloud-key_1.name
security_groups = ["default", openstack_networking_secgroup_v2.secgroup_1.name]
network {
name = data.openstack_networking_network_v2.network_2.name
}
network {
name = openstack_networking_network_v2.network_1.name
}
depends_on = [ openstack_networking_subnet_v2.subnet_1, ]
}
위와 같이 다수의 network를 추가할수도 있다.
물론 고정IP를 가질수 있도록 설정할 수도 있다.
고정 IP를 사용하고자 할 경우 다음과 같은 방식으로 port를 사전에 생성하고
# ===== Fixed IP =====
resource "openstack_networking_port_v2" "port-sub1" {
name = "port_1"
network_id = openstack_networking_network_v2.jacobbaek-network.id
admin_state_up = "true"
fixed_ip {
subnet_id = openstack_networking_subnet_v2.subnet_1.id
ip_address = "11.11.11.50"
}
}
생성한 port를 instance 생성하는 과정에서 추가하면 된다.
resource "openstack_compute_instance_v2" "testvm" {
name = "jacobbaek-testvm"
...
network {
name = openstack_networking_network_v2.jacobbaek-network.name
port = openstack_networking_port_v2.port-sub1.id
}
또한 아래와 같이 interface를 추가할수도 있다.
(아래의 방법은 사전에 port생성없이 지정된 network에서 fixedIP를 추가한다.)
resource "openstack_compute_interface_attach_v2" "interface_1" {
instance_id = openstack_compute_instance_v2.testvm.id
network_id = openstack_networking_network_v2.jacobbaek-network.id
fixed_ip = "22.22.22.50"
}
참고로
depends_on의 경우 subnet 생성이 안되었는데 instance가 생성을 요청하면서 꼬이는 경우가 발생되었어서 방지차원에서 넣어두었다.
floating IP 연결
resource "openstack_compute_floatingip_associate_v2" "extip" {
floating_ip = openstack_networking_floatingip_v2.fip_1.address
instance_id = openstack_compute_instance_v2.testvm.id
fixed_ip = openstack_compute_instance_v2.testvm.network.0.fixed_ip_v4
}
여기서 fixed_ip는 provider network(external_network)을 통해 외부로 연결 가능한 네트워크이다.
즉, vrouter에 등록된 network이라 보면 된다.
Octavia 사용
Octavia 환경은 아직 구성을 하지 못해 테스트가 이루어지지는 않았다.
관련 terraform script는 아래 github 주소에 있으니 참고바란다.
참고사이트
- https://ssup2.github.io/record/OpenStack_Terraform_%EC%8B%A4%EC%8A%B5_Kubernetes_%ED%99%98%EA%B2%BD_%EA%B5%AC%EC%B6%95/
- https://github.com/diodonfrost/terraform-openstack-examples
- https://training.galaxyproject.org/training-material/topics/admin/tutorials/terraform/tutorial.html
- https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs
'Cloud > Private Cloud' 카테고리의 다른 글
prometheus alertmanager workflow (0) | 2020.12.28 |
---|---|
Jenkins pipeline for Terraform OpenStack (0) | 2020.11.04 |
access another Openstack VM using cirros image (0) | 2020.09.23 |
openstack cli (0) | 2020.09.23 |
How to use clouds.yaml at OpenStack (0) | 2020.09.10 |
- Total
- Today
- Yesterday
- jenkins
- hashicorp boundary
- mattermost
- socket
- vmware openstack
- Jenkinsfile
- kata container
- minikube
- nginx-ingress
- crashloopbackoff
- aquasecurity
- Helm Chart
- boundary ssh
- open policy agent
- kubernetes
- minio
- DevSecOps
- Terraform
- macvlan
- openstacksdk
- ceph
- K3S
- wsl2
- OpenStack
- openstack backup
- metallb
- kubernetes install
- ansible
- GateKeeper
- azure policy
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |