Skip to content
Snippets Groups Projects
Commit 64565794 authored by Ondrej Dvorak's avatar Ondrej Dvorak
Browse files

Update 112 files

- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/commandline/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/commandline/cmdline-demo.sh
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/commandline/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/commandline/cmdline-demo-group-project.sh
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/commandline/obrazek.png
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/commandline/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/commandline/cmdline-demo.sh
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/commandline/cmdline-demo.sh.log
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/commandline/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/commandline/cmdline-demo-group-project.sh
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/commandline/obrazek.png
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/1tier_public_vm_farm/instances.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/1tier_public_vm_farm/keypair.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/1tier_public_vm_farm/networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/1tier_public_vm_farm/nodes-cloudinit.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/1tier_public_vm_farm/nodes-networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/1tier_public_vm_farm/providers.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/1tier_public_vm_farm/secgroup_rules.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/1tier_public_vm_farm/variables.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/1tier_public_vm_farm/volumes.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/2tier_public_bastion_private_vm_farm/bastion-cloudinit.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/2tier_public_bastion_private_vm_farm/bastion-instance.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/2tier_public_bastion_private_vm_farm/bastion-networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/2tier_public_bastion_private_vm_farm/instances.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/2tier_public_bastion_private_vm_farm/keypair.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/2tier_public_bastion_private_vm_farm/networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/2tier_public_bastion_private_vm_farm/nodes-cloudinit.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/2tier_public_bastion_private_vm_farm/providers.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/2tier_public_bastion_private_vm_farm/secgroup_rules.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/2tier_public_bastion_private_vm_farm/variables.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/2tier_public_bastion_private_vm_farm/volumes.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/common/instances.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/common/keypair.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/common/networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/common/nodes-cloudinit.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/common/providers.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/common/secgroup_rules.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/modules/common/volumes.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/terraform_group_project/modules/infra/cloudinit.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/terraform_group_project/modules/infra/instances.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/terraform_group_project/modules/infra/main.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/terraform_group_project/modules/infra/networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/terraform_group_project/modules/infra/output.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/terraform_group_project/modules/infra/providers.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/terraform_group_project/modules/infra/secgroup_rules.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/terraform_group_project/modules/infra/variables.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/terraform_group_project/modules/infra/volumes.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/repet_workshop/main.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/repet_workshop/output.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/1tier_public_vm_farm/instances.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/1tier_public_vm_farm/keypair.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/1tier_public_vm_farm/networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/1tier_public_vm_farm/nodes-cloudinit.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/1tier_public_vm_farm/nodes-networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/1tier_public_vm_farm/providers.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/1tier_public_vm_farm/secgroup_rules.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/1tier_public_vm_farm/variables.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/1tier_public_vm_farm/volumes.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/2tier_public_bastion_private_vm_farm/bastion-cloudinit.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/2tier_public_bastion_private_vm_farm/bastion-instance.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/2tier_public_bastion_private_vm_farm/bastion-networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/2tier_public_bastion_private_vm_farm/instances.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/2tier_public_bastion_private_vm_farm/keypair.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/2tier_public_bastion_private_vm_farm/networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/2tier_public_bastion_private_vm_farm/nodes-cloudinit.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/2tier_public_bastion_private_vm_farm/providers.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/2tier_public_bastion_private_vm_farm/secgroup_rules.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/2tier_public_bastion_private_vm_farm/variables.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/2tier_public_bastion_private_vm_farm/volumes.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/common/instances.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/common/keypair.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/common/networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/common/nodes-cloudinit.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/common/providers.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/common/secgroup_rules.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/modules/common/volumes.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/terraform/modules/infra/cloudinit.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/terraform/modules/infra/instances.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/terraform/modules/infra/main.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/terraform/modules/infra/networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/terraform/modules/infra/output.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/terraform/modules/infra/providers.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/terraform/modules/infra/secgroup_rules.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/terraform/modules/infra/variables.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/terraform/modules/infra/volumes.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/terraform/main.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/terraform_group_project/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/terraform_group_project/main.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/modules/infra_test/cloudinit-bastion.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/modules/infra_test/cloudinit.txt
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/modules/infra_test/instances.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/modules/infra_test/main.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/modules/infra_test/networks.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/modules/infra_test/output.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/modules/infra_test/providers.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/modules/infra_test/secgroup_rules.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/modules/infra_test/variables.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/main.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/output.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/terraform/terminal-transcript.log
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/terraform/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/terraform/main.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/general/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/meta-metaseminar-hands-on-2023-04-28/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.enes.org/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/vo.thepund.it/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/README.md
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/main.tf
- /openstack-infrastructure-as-code-automation/clouds/g1/brno/repet-workshop/terraform/ost-terraform/output.tf
- /README.md
parent 15ef4165
Branches
No related tags found
No related merge requests found
Showing
with 1 addition and 383 deletions
# Scripts for creating infrastructure
There is possibility to create infrastructure in [GUI][https://ostrava.openstack.cloud.e-infra.cz/]. - manual at [e-INFRA CZ guide][https://docs.e-infra.cz/compute/openstack/getting-started/creating-first-infrastructure/] or you can use custom script writed in [teraform][3]/[bash][4]
[3] https://code.it4i.cz/dvo0012/infrastructure-by-script/-/tree/main/openstack-infrastructure-as-code-automation/clouds/g2/ostrava/general/commandline
[4] https://code.it4i.cz/dvo0012/infrastructure-by-script/-/tree/main/openstack-infrastructure-as-code-automation/clouds/g2/ostrava/general/terraform
\ No newline at end of file
There is possibility to create infrastructure in ([GUI][https://ostrava.openstack.cloud.e-infra.cz/]). - manual at ([e-INFRA CZ guide][https://docs.e-infra.cz/compute/openstack/getting-started/creating-first-infrastructure/]) or you can use custom script writed in ([teraform][https://code.it4i.cz/dvo0012/infrastructure-by-script/-/tree/main/openstack-infrastructure-as-code-automation/clouds/g2/ostrava/general/commandline])/([bash][https://code.it4i.cz/dvo0012/infrastructure-by-script/-/tree/main/openstack-infrastructure-as-code-automation/clouds/g2/ostrava/general/terraform])
# General IaaS infrastructure demo
Assuming you are added into a group project and you can log in via [MetaCentrum OpenStack cloud dashboard](https://cloud.metacentrum.cz/) using one of supported federations (e-INFRA CZ, EGI CHeck-in, ...).
We recommend to build custom cloud infrastructure with Terraform or openstack client rather than using [MetaCentrum OpenStack cloud Horizon UI dashboard](https://dashboard.cloud.muni.cz).
Below demos show in detail how to do so.
## [Terraform `general` demo](./terraform)
Terraform demo shows how to automate building highly scalable IaaS infrastructure.
## [OpenStack client `general` demo](./commandline)
OpenStack shell script demo shows how to automate small IaaS infrastructure which does not need additional scalability.
# Build OpenStack infrastructure from command-line using openstack client
## Pre-requisites
* Linux/Mac/WSL2 terminal
* BASH shell
* installed openstack client ([how?](https://docs.fuga.cloud/how-to-use-the-openstack-cli-tools-on-linux))
* MetaCentrum OpenStack cloud [group project granted](https://docs.e-infra.cz/compute/openstack/technical-reference/brno-site/get-access/#group-project).
* downloaded application credentials from OpenStack Horizon dashboard ([how?](https://docs.cloud.muni.cz/cloud/cli/#getting-credentials)) and store as text file `project_openrc.sh.inc`.
## How to use the script
```sh
# in bash shell
source project_openrc.sh.inc
EXTRA_VOLUME_SIZE_GB=10 ./cmdline-demo.sh basic-infrastructure-1
```
See [linked reference execution](./cmdline-demo.sh.log).
## Infrastructure schema
How does the basic infrastructure looks like?
* single VM (ubuntu-jammy)
* VM firewall opening port 22
* VM SSH keypair generated locally and pubkey uploaded to cloud
* attached additional volume (size 10GB)
* private subnet and network
* router to external internet
* public floating ip address
![basic-infrastructure.png](/clouds/common/pictures/basic-infrastructure.png)
#!/usr/bin/env bash
# general group project command-line demo
# Usage: cmdline-demo.sh [ostack-entities-prefix/profile-name]
#
SCRIPT_DIR=$(dirname $(readlink -f $0))
#############################################################################
# variables
#############################################################################
ENTITIES_PREFIX="${1:-"${USER}_$(hostname)"}"
EXTERNAL_NETWORK_NAME="public-muni-147-251-124-GROUP"
KEYPAIR_NAME="${ENTITIES_PREFIX}-demo-keypair"
NETWORK_NAME="${ENTITIES_PREFIX}-demo-network"
SUBNET_NAME="${ENTITIES_PREFIX}-demo-subnet"
SUBNET_CIDR="${SUBNET_CIDR:-"192.168.0.0/24"}"
SERVER_NAME="${ENTITIES_PREFIX}-demo-server"
FLAVOR_NAME="${FLAVOR_NAME:-"standard.small"}"
IMAGE_NAME="${IMAGE_NAME:-"ubuntu-jammy-x86_64"}"
VM_LOGIN="${VM_LOGIN:-"ubuntu"}"
ROUTER_NAME="${ENTITIES_PREFIX}-demo-router"
FIP_FILE="${ENTITIES_PREFIX}-demo-fip.txt"
SECGROUP_NAME="${ENTITIES_PREFIX}-demo-secgroup"
SSH_KEYPAIR_DIR="${HOME}/.ssh/generated-keypair"
EXTRA_VOLUME_SIZE_GB=${EXTRA_VOLUME_SIZE_GB:-"10"}
EXTRA_VOLUME_NAME="${ENTITIES_PREFIX}-demo-volume"
EXTRA_VOLUME_TYPE="${EXTRA_VOLUME_TYPE:-"ceph-standard"}"
SERVER_CREATE_ADDITIONAL_ARGS="${SERVER_CREATE_ADDITIONAL_ARGS:-""}"
SERVER_EPHEMERAL_DISK_SIZE="${SERVER_EPHEMERAL_DISK_SIZE:-"0"}"
#############################################################################
# functions
#############################################################################
source ${SCRIPT_DIR}/../../../../common/lib.sh.inc
#############################################################################
# main steps
#############################################################################
log "Using commandline tools:"
report_tools || myexit 1
log "Using OpenStack cloud:"
openstack version show | grep identity || myexit 1
log "In project $(is_personal_project)"
# delete objects (from previous run)
log "Delete previously created objects in profile ${ENTITIES_PREFIX} (so we start from the nothing)"
delete_objects_group_project
log "List currently allocated objects (profile ${ENTITIES_PREFIX})"
list_objects
log_keypress "Create (generate) locally SSH keypair, upload public SSH key to cloud"
mkdir -p ${SSH_KEYPAIR_DIR}
chmod 700 ${SSH_KEYPAIR_DIR}
ssh-keygen -t rsa -b 4096 -f "${SSH_KEYPAIR_DIR}/id_rsa.${KEYPAIR_NAME}"
openstack keypair create --type ssh --public-key "${SSH_KEYPAIR_DIR}/id_rsa.${KEYPAIR_NAME}.pub" "${KEYPAIR_NAME}"
ls -la ${SSH_KEYPAIR_DIR}/id_rsa.${KEYPAIR_NAME}*
log_keypress "Create cloud security groups (custom VM firewall) to allow outgoing traffic and incomming SSH traffic on port 22"
openstack security group create --description "${ENTITIES_PREFIX} demo default security group" "${SECGROUP_NAME}"
openstack security group rule create --ingress --proto tcp --remote-ip 0.0.0.0/0 --dst-port 22 "${SECGROUP_NAME}"
openstack security group rule create --egress --proto tcp --remote-ip 0.0.0.0/0 --dst-port 1:65535 "${SECGROUP_NAME}"
log_keypress "Create cloud private network and subnet, so far isolated (CIDR:${SUBNET_CIDR})"
openstack network create "${NETWORK_NAME}"
NETWORK_ID=$(openstack network show "${NETWORK_NAME}" -f value -c id)
openstack subnet create "${SUBNET_NAME}" --network "${NETWORK_ID}" --subnet-range "${SUBNET_CIDR}"
if [ "${EXTRA_VOLUME_SIZE_GB}" -gt 0 ]; then
log_keypress "Create cloud VM extra volume \"${EXTRA_VOLUME_NAME}\" with following configuration:\n" \
" size: ${EXTRA_VOLUME_SIZE_GB} GB, volume type: ${EXTRA_VOLUME_TYPE}"
openstack volume create --type "${EXTRA_VOLUME_TYPE}" --size "${EXTRA_VOLUME_SIZE_GB}" ${EXTRA_VOLUME_NAME}
fi
if [ -n "${SERVER_EPHEMERAL_DISK_SIZE}" -a "${SERVER_EPHEMERAL_DISK_SIZE}" -gt "0" ]; then
SERVER_CREATE_ADDITIONAL_ARGS="${SERVER_CREATE_ADDITIONAL_ARGS} --ephemeral=size=${SERVER_EPHEMERAL_DISK_SIZE}"
fi
log_keypress "Create cloud VM instance \"${SERVER_NAME}\" with following configuration:\n" \
" flavor: ${FLAVOR_NAME}, image/os: ${IMAGE_NAME}, network: ${NETWORK_NAME}\n" \
" keypair: ${KEYPAIR_NAME}, sec-group/firewall: ${SECGROUP_NAME})" \
" additional arguments: ${SERVER_CREATE_ADDITIONAL_ARGS}"
openstack server create --flavor "${FLAVOR_NAME}" --image "${IMAGE_NAME}" \
--network "${NETWORK_ID}" --key-name "${KEYPAIR_NAME}" \
--security-group "${SECGROUP_NAME}" ${SERVER_CREATE_ADDITIONAL_ARGS} "${SERVER_NAME}"
SERVER_ID=$(openstack server show "${SERVER_NAME}" -f value -c id)
log "Wait for VM instance \"${SERVER_NAME}\" being ACTIVE"
vm_wait_for_status "${SERVER_NAME}" "ACTIVE"
if [ "${EXTRA_VOLUME_SIZE_GB}" -gt 0 ]; then
log_keypress "Attach extra volume \"${EXTRA_VOLUME_NAME}\" (${EXTRA_VOLUME_SIZE_GB} GB) to VM \"${SERVER_NAME}\""
openstack server add volume ${SERVER_NAME} ${EXTRA_VOLUME_NAME} --device /dev/sdb
fi
log "Route VM from internal software defined networking outside"
log_keypress " 1] Create route, associate router with external provider network and internal subnet (${SUBNET_CIDR})"
openstack router create "${ROUTER_NAME}"
openstack router set "${ROUTER_NAME}" --external-gateway "${EXTERNAL_NETWORK_NAME}"
openstack router add subnet "${ROUTER_NAME}" "${SUBNET_NAME}"
log_keypress " 2] Allocate single FIP (floating ip) from external provider network"
FIP=$(openstack floating ip create "${EXTERNAL_NETWORK_NAME}" -f value -c name)
echo "${FIP}" > "${FIP_FILE}"
echo "Obtained public FIP ${FIP}"
log_keypress " 3] Assign selected FIP with created VM"
openstack server add floating ip "${SERVER_NAME}" "${FIP}"
log "Test access to the VM server instance"
log_keypress " 1] TCP ping (ncat -z ${FIP} 22)"
test_vm_access "${FIP}"
log_keypress " 2] SSH command (ssh -i ${SSH_KEYPAIR_DIR}/id_rsa.${KEYPAIR_NAME} ${VM_LOGIN}@${FIP})"
ssh-keygen -R ${FIP} &>/dev/null
ssh -i "${SSH_KEYPAIR_DIR}/id_rsa.${KEYPAIR_NAME}" "${VM_LOGIN}@${FIP}" 'echo "";uname -a;uptime'
log_keypress "Object summary in profile ${ENTITIES_PREFIX}"
list_objects
log_keypress "Teardown of the objects " \
"(Interrupt with CTRL-C if you want to keep the created infrastructure and skip its destruction)"
delete_objects_group_project
# Terraform demonstration
This Terraform module creates up to two kind of VMs:
- public facing small bastion VM
- private VM farm
Cloud-init add following:
- Add ssh keys, disable SSH password auth
- Create partition and filesystemand mount extra data from extra volume
## Infrastructure schema
### Two tier infrastructure: public bastion and private VM farm
![two-tier-infra.png](/clouds/common/pictures/two-tier-infra.png)
### Single tier infrastructure: public VM farm
![single-tier-infra.png](/clouds/common/pictures/single-tier-infra.png)
## Create Infrastructure
1. Clone the repository.
1. Load you OpenStack application credentials to environment variables `source project_openrc.sh.inc`
1. Override any infrastructure variables in [main.tf](main.tf) file if needed. Full set of variables can be found in [modules/2tier_public_bastion_private_vm_farm/variables.tf](modules/2tier_public_bastion_private_vm_farm/variables.tf) or [modules/1tier-public-vm-farm/variables.tf](modules/1tier-public-vm-farm/variables.tf).
1. In the [terraform root directory](/clouds/g1/brno/general/terraform) run following commands to initiate and validate environment
* `terraform init`
* `terraform validate`
1. In the [same directory](/clouds/g1/brno/general/terraform) run commands to deploy cloud infrastructure
* `terraform plan --out plan`
* `terraform apply plan`
1. Once you need to change the infrastructure, first modify the infrastructure declaration and repeat above steps to deploy changes.
1. Similarly for resource teardown, once you want to clean-up cloud resources issue `terraform destroy`.
Detailed terminal transcript can be found in [terminal-transcript.log](./terminal-transcript.log).
## Access to the VM nodes
In single tier infrastructure you access directly the individual VM nodes via SSH on public IP addresses.
Two tier infrastructure requires the access following way:
1. Establish the connection with bastion
```sh
sshuttle -r ubuntu@<bastion-ip>
```
1. Connect directly to VM nodes via SSH on private IP addresses:
```sh
ssh ubuntu@<vm-node-ip-from-10.10.10.0/24>
```
terraform {
backend "local" {}
}
module "toplevel" {
# two tier infrastructure (2tier_public_bastion_private_vm_farm module):
# * single public facing tiny bastion VM
# * <nodes_count> private HPC VM farm
source = "./modules/2tier_public_bastion_private_vm_farm"
# single tier infrastructure (1tier_public_vm_farm monule)
# * <nodes_count> public HPC VM farm
#source = "./modules/1tier_public_vm_farm"
infra_name = "general-tf-demo"
nodes_count = 2
nodes_extra_volume_size = 20 # in GB
#nodes_flavor = "standard.medium"
#nodes_image = "ubuntu-jammy-x86_64"
}
../common/instances.tf
\ No newline at end of file
../common/keypair.tf
\ No newline at end of file
../common/networks.tf
\ No newline at end of file
../common/nodes-cloudinit.txt
\ No newline at end of file
# Floating IPs
resource "openstack_networking_floatingip_v2" "nodes_fips" {
count = var.nodes_count
pool = var.public_external_network
}
resource "openstack_compute_floatingip_associate_v2" "nodes_fips_associations" {
count = var.nodes_count
floating_ip = element(openstack_networking_floatingip_v2.nodes_fips.*.address, count.index)
instance_id = element(openstack_compute_instance_v2.nodes.*.id, count.index)
}
../common/providers.tf
\ No newline at end of file
../common/secgroup_rules.tf
\ No newline at end of file
variable "infra_name" {
description = "Infrastructure (profile) name. Used as a name prefix. Must match [a-zA-Z0-9-]+ regexp."
default = "general-tf-demo"
}
variable "ssh_public_key" {
default = "~/.ssh/id_rsa.pub"
}
#########################
# master nodes settings #
#########################
variable "nodes_count" {
default = 1
}
variable "nodes_name" {
description = "Name of the nodes. Must match [a-zA-Z0-9-]+ regexp."
default = "server"
}
variable "bastion_name" {
description = "Name of the bastion VM. Must match [a-zA-Z0-9-]+ regexp."
default = "bastion-server"
}
variable "bastion_flavor" {
default = "standard.small"
}
variable "nodes_flavor" {
default = "standard.large"
}
variable "int_network" {
description = "Internal network address, use CIDR notation"
default = "10.10.10.0/24"
}
variable "public_external_network" {
description = "Cloud public external network pool"
default = "public-cesnet-195-113-167-GROUP"
}
variable "bastion_image" {
description = "Bastion OS: Image name"
default = "ubuntu-jammy-x86_64"
}
variable "nodes_image" {
description = "nodes OS: Image name"
default = "ubuntu-jammy-x86_64"
}
variable "bastion_ssh_user_name" {
default = "ubuntu"
}
variable "nodes_ssh_user_name" {
default = "ubuntu"
}
variable "nodes_volume_size" {
description = "The size of the volume to create (in gigabytes) for root filesystem. "
default = "10"
}
variable "nodes_extra_volume_size" {
description = "The size of the volume to create (in gigabytes) for extra data."
default = "10"
}
variable "nodes_extra_volume_type" {
description = "The type of extra volume."
default = "ceph-standard"
}
../common/volumes.tf
\ No newline at end of file
users:
- default
- name: ubuntu
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC5fFLKPzxna7fq6kh1CHaIQFnpqXybqLqGs4ZpTDbIrEn7xjCsdyxMm9dcptyS0t6BzXO56BlJyYsR1GWo4rp3g8rMmb9u6/oHmMwgn7G/GLgsaAAO5XHW0A3UEJl3JHfCQLHkN1APQ4dy7gNTG24ahH/pcyr4rV0SsjPUCqFqkSMDZxRgfllNGftxWVHR2fYfPALLrGdhR/SjNSIs3pwBIUXaSfF3aBLsjeGBj4y5YsiR9yI3y2gUmpURROofTvtE7Fp8OIgmWCVqRe70CKDbl17HFbz3FIqYwZLAQHILcp1M45zV8koSOjW5+3C/ZJYzBKOnw/a/1Cw3uHFDrZfRqKLMP/gagnoEPRHjfmUsJ3UJO0eXDCXmnH7F48xBI76CgxYl039/SMmJ2mR0KqAHGnwqVmJI3yBGyK+Z4iEwk+JVDLEB14RHiMp2/I/tYpDWFE1IOigFFNLdfaZrVFY1/fD+yGGyFUO1Wo+CKb8tpndLB4H3Yj2MLRDP/aNpLC4M7Aru7hWnUF81aE/VUAqR6CP2vsHzlAOmH08pOlP9FVITinmJqzBL15l+W7q0Rhh4WBRO4ixlrtRJDNL2wm0vf+GiJnXligFtZ7Cw8bk/LcAe37WqcTl0xLKDyPSw4SvWOC2aE6BVuJjPAhoUUcBaNzoBa7lf4eb+FS4tquTZlQ== freznicek@LenovoThinkCentreE73
ssh_pwauth: false
resource "openstack_compute_instance_v2" "bastion" {
name = "${var.infra_name}-${var.bastion_name}"
image_name = var.bastion_image
flavor_name = var.bastion_flavor
key_pair = openstack_compute_keypair_v2.pubkey.name
security_groups = [openstack_networking_secgroup_v2.secgroup_default.name]
user_data = "#cloud-config\nhostname: ${var.infra_name}-${var.bastion_name}.local\n${file("${path.module}/bastion-cloudinit.txt")}"
network {
uuid = openstack_networking_network_v2.network_default.id
port = openstack_networking_port_v2.bastion_port.id
}
}
# Floating IPs (only for bastion node)
resource "openstack_networking_floatingip_v2" "bastion_fip" {
pool = var.public_external_network
}
resource "openstack_compute_floatingip_associate_v2" "bastion_fip_associate" {
floating_ip = openstack_networking_floatingip_v2.bastion_fip.address
instance_id = openstack_compute_instance_v2.bastion.id
}
# Ports
resource "openstack_networking_port_v2" "bastion_port" {
name = "${var.infra_name}-${var.bastion_name}-port"
network_id = openstack_networking_network_v2.network_default.id
admin_state_up = "true"
security_group_ids = [openstack_networking_secgroup_v2.secgroup_default.id]
fixed_ip {
subnet_id = openstack_networking_subnet_v2.subnet_default.id
}
}
../common/instances.tf
\ No newline at end of file
../common/keypair.tf
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment