Skip to content

Commit 4c20b69

Browse files
nrcdtrswrzRoman Schwarz
authored
Add installing the opsstack agent via run command or via cloud-init (#7)
* Add installing the opsstack agent via run command or via cloud-init * Update prod-stackit/terraform/50_projects/opsstack-agent-test-server/terraform.tf Co-authored-by: Roman Schwarz <rswrz@users.noreply.github.com> * Add GitHub Actions workflow Signed-off-by: Roman Schwarz <rs@cloudeteer.de> * Update prod-stackit/terraform/50_projects/opsstack-agent-test-server/main.tf Co-authored-by: Roman Schwarz <rswrz@users.noreply.github.com> * Use other launchpad bucket * Add missing Secrets * lowercase url * working agent deployment --------- Signed-off-by: Roman Schwarz <rs@cloudeteer.de> Co-authored-by: Roman Schwarz <rswrz@users.noreply.github.com> Co-authored-by: Roman Schwarz <rs@cloudeteer.de>
1 parent da00dc5 commit 4c20b69

8 files changed

Lines changed: 301 additions & 0 deletions

File tree

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: prod-stackit-terraform-50-opsstack-agent-test-server
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
terraform-force-unlock:
7+
default: false
8+
description: Terraform force unlock
9+
required: false
10+
type: boolean
11+
terraform-force-unlock-id:
12+
description: Terraform LOCK_ID
13+
required: false
14+
type: string
15+
pull_request:
16+
paths:
17+
- prod-stackit/terraform/50_projects/opsstack-agent-test-server/**
18+
- .github/workflows/prod-stackit-terraform-50-opsstack-agent-test-server.yaml
19+
20+
permissions:
21+
contents: read
22+
id-token: write
23+
24+
jobs:
25+
terraform:
26+
name: Terraform
27+
uses: cloudeteer/iac-deployment-framework/.github/workflows/terraform-deploy-stackit.yaml@wip/stackit
28+
with:
29+
directory: prod-stackit/terraform/50_projects/opsstack-agent-test-server
30+
terraform-force-unlock-id: ${{ github.event_name == 'workflow_dispatch' && inputs.terraform-force-unlock == true && inputs.terraform-force-unlock-id }}
31+
terraform-force-unlock: ${{ github.event_name == 'workflow_dispatch' && inputs.terraform-force-unlock == true && inputs.terraform-force-unlock }}
32+
secrets:
33+
stackit_service_account_key: ${{ secrets.CDT_LAUNCHPAD_STACKIT_SERVICE_ACCOUNT_KEY }}
34+
backend_s3_secret_key: ${{ secrets.CDT_LAUNCHPAD_STACKIT_BACKEND_SECRET_ACCESS_KEY }}
35+
backend_s3_access_key: ${{ secrets.CDT_LAUNCHPAD_STACKIT_BACKEND_ACCESS_KEY }}
36+
env: |
37+
TF_VAR_agent_login: ${{ secrets.CDT_OPSSTACK_DEV_AGENT_LOGIN }}
38+
TF_VAR_deepview_url: ${{ vars.CDT_OPSSTACK_DEV_DEEPVIEW_URL }}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/bin/bash -ex
2+
3+
set -eo pipefail
4+
retryCount=0
5+
while ! curl -H "Authorization: Basic ${agent_login}" --fail --fail-early -sSL "https://${deepview_url}/opsstack-agent/install/linux-${agent_version}.sh" -o linux-${agent_version}.sh; do
6+
retryCount=$((retryCount+1))
7+
8+
if [ "$${retryCount}" -eq 100 ]; then
9+
echo "Request to $1 failed. Exiting" >&2
10+
exit 1
11+
fi
12+
echo "Request to $1 failed. Retrying in $((retryCount*2)) seconds" >&2
13+
sleep $((retryCount*2));
14+
done
15+
16+
exec bash linux-${agent_version}.sh
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/bin/bash
2+
3+
#Download GPG public key
4+
curl https://stackit-server-agent.object.storage.eu01.onstackit.cloud/stackit-server-agent.gpg -o /tmp/stackit-server-agent.gpg
5+
6+
# Install dependencies
7+
8+
apt-get update && apt-get install gnupg -y
9+
10+
# Import GPG Public key
11+
gpg --import /tmp/stackit-server-agent.gpg
12+
13+
# Download STACKIT Server Agent
14+
curl https://stackit-server-agent.object.storage.eu01.onstackit.cloud/stackit-server-agent.deb -o /tmp/stackit-server-agent.deb
15+
16+
# Download the package signature file
17+
curl https://stackit-server-agent.object.storage.eu01.onstackit.cloud/stackit-server-agent.deb.sig -o /tmp/stackit-server-agent.deb.sig
18+
19+
if gpg --verify /tmp/stackit-server-agent.deb.sig /tmp/stackit-server-agent.deb
20+
then
21+
echo "The STACKIT Server Agent is verified successfully"
22+
else
23+
echo "The STACKIT Server Agent is not verified successfully"
24+
rm -rf /tmp/stackit-server-agent.deb /tmp/stackit-server-agent.deb.sig /tmp/stackit-server-agent.gpg
25+
exit 1
26+
fi
27+
28+
dpkg -i /tmp/stackit-server-agent.deb
29+
rm -rf /tmp/stackit-server-agent.gpg /tmp/stackit-server-agent.deb.sig /tmp/stackit-server-agent.deb
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
data "stackit_resourcemanager_project" "this" {
2+
project_id = "7642de78-ce95-48b0-877f-a986d8f92c67"
3+
container_id = "Observability"
4+
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
resource "stackit_server" "agent_test" {
2+
project_id = data.stackit_resourcemanager_project.this.project_id
3+
name = "agent-test-vm"
4+
5+
boot_volume = {
6+
size = 64
7+
source_type = "image"
8+
delete_on_termination = true
9+
10+
# stackit curl https://iaas.api.eu01.stackit.cloud/v1beta1/projects/$PROJECT_ID/images |
11+
# jq '.items[] | select(.name=="Ubuntu 24.04 ARM64")'
12+
#source_id = "882a8fdc-3bc9-403e-96e0-e1c92a8ed7a9" # Ubuntu 24.04 ARM64
13+
14+
# stackit curl https://iaas.api.eu01.stackit.cloud/v1beta1/projects/$PROJECT_ID/images |
15+
# jq '.items[] | select(.name=="Ubuntu 22.04")'
16+
source_id = "117e8764-41c2-405f-aece-b53aa08b28cc" # Ubuntu 24.04
17+
}
18+
19+
#machine_type = "g1r.1d" # ARM
20+
# the stackit server agent isnt available for arm yet
21+
machine_type = "g1.1" # X86
22+
23+
availability_zone = "eu01-1" # eu01-1, eu01-2, eu03-3, eu01-m (Metro Zone is not available for ARM machine types)
24+
#keypair_name = stackit_key_pair.agent_test.name
25+
user_data = data.cloudinit_config.agent_test.rendered
26+
}
27+
28+
29+
data "cloudinit_config" "agent_test" {
30+
gzip = false
31+
base64_encode = false
32+
33+
part {
34+
filename = "install-stackit-server-agent.sh"
35+
content_type = "text/x-shellscript"
36+
content = file("${path.module}/assets/install_stackit_agent.sh")
37+
}
38+
39+
part {
40+
filename = "download_opsstack_agent_setup.sh"
41+
content_type = "text/x-shellscript"
42+
43+
content = templatefile("${path.module}/assets/download_opsstack_agent_setup.tftpl", {
44+
deepview_url = var.deepview_url
45+
agent_version = var.agent_version
46+
agent_login = var.agent_login
47+
})
48+
}
49+
50+
}
51+
resource "stackit_network" "agent_test" {
52+
project_id = data.stackit_resourcemanager_project.this.project_id
53+
name = "opsstack-agent-test"
54+
ipv4_nameservers = ["1.1.1.1", "8.8.8.8", "9.9.9.9"]
55+
ipv4_prefix_length = 24
56+
}
57+
58+
resource "stackit_security_group" "agent_test" {
59+
project_id = data.stackit_resourcemanager_project.this.project_id
60+
name = "opsstack-agent-test"
61+
stateful = true
62+
}
63+
64+
resource "stackit_security_group_rule" "agent_test" {
65+
project_id = data.stackit_resourcemanager_project.this.project_id
66+
security_group_id = stackit_security_group.agent_test.security_group_id
67+
direction = "ingress"
68+
ether_type = "IPv4"
69+
}
70+
71+
resource "stackit_network_interface" "agent_test" {
72+
name = "nic"
73+
project_id = data.stackit_resourcemanager_project.this.project_id
74+
network_id = stackit_network.agent_test.network_id
75+
security_group_ids = [stackit_security_group.agent_test.security_group_id]
76+
}
77+
78+
resource "stackit_public_ip" "agent_test" {
79+
project_id = data.stackit_resourcemanager_project.this.project_id
80+
network_interface_id = stackit_network_interface.agent_test.network_interface_id
81+
}
82+
83+
resource "stackit_server_network_interface_attach" "agent_test" {
84+
project_id = data.stackit_resourcemanager_project.this.project_id
85+
server_id = stackit_server.agent_test.server_id
86+
network_interface_id = stackit_network_interface.agent_test.network_interface_id
87+
}
88+
89+
90+
#resource "null_resource" "run_agent_install_script" {
91+
# triggers = {
92+
# body = jsonencode({
93+
# commandTemplateName = "RunShellScript"
94+
# parameters = {
95+
# script = <<-EOT
96+
##!/bin/bash
97+
#
98+
#set -eo pipefail
99+
# retryCount=0
100+
# while ! curl -H "Authorization: Basic ${var.agent_login}" --fail --fail-early -sSL "https://${var.deepview_url}/opsstack-agent/install/linux-${var.agent_version}.sh" -o linux-${var.agent_version}.sh; do
101+
# retryCount=$((retryCount+1))
102+
#
103+
# if [ "$${retryCount}" -eq 100 ]; then
104+
# echo "Request to $1 failed. Exiting" >&2
105+
# exit 1
106+
# fi
107+
# echo "Request to $1 failed. Retrying in $((retryCount*2)) seconds" >&2
108+
# sleep $((retryCount*2));
109+
# done
110+
#
111+
#exec bash linux-${var.agent_version}.sh
112+
# EOT
113+
# }
114+
# })
115+
# }
116+
#
117+
# provisioner "local-exec" {
118+
# interpreter = ["bash", "-ec"]
119+
# # wait a minute for the server agent to be online
120+
# command = join("; ", [
121+
# "sleep 60s",
122+
# "tmpfile=$(mktemp)",
123+
# "chmod 600 \"$tmpfile\"",
124+
# "printf '%s' \"$TF_VAR_stackit_service_account_key\" > \"$tmpfile\"",
125+
# "stackit auth activate-service-account --service-account-key-path \"$tmpfile\"",
126+
# "shred --remove \"$tmpfile\"", # Note: On macOS, install coreutils to enable the `shred` command (e.g., via `brew install coreutils`)
127+
# format(
128+
# "stackit curl -X POST https://run-command.api.eu01.stackit.cloud/v1/projects/%s/servers/%s/commands --data ${jsonencode(self.triggers.body)}",
129+
# data.stackit_resourcemanager_project.this.project_id,
130+
# stackit_server.agent_test.server_id
131+
# )
132+
# ,
133+
# "stackit auth logout"
134+
# ])
135+
# }
136+
#}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
provider "stackit" {
2+
3+
# Region will be used as the default location for regional services.
4+
# Not all services require a region, some are global
5+
region = "eu01"
6+
7+
# NOTE: There are no environment variables available for the parameters stackit_service_account_key and private_key.
8+
# Alternatively, we use TF_VAR_stackit_service_account_key and TF_VAR_stackit_service_account_private_key.
9+
10+
# Service account key used for authentication
11+
service_account_key = var.stackit_service_account_key
12+
13+
# Private RSA key used for authentication, relevant for the key flow.
14+
# It takes precedence over the private key that is included in the service account key.
15+
private_key = var.stackit_service_account_private_key
16+
17+
# Enable beta resources.
18+
enable_beta_resources = true
19+
}
20+
21+
# These variables are mandatory and used on the provider configuration above.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
terraform {
2+
required_providers {
3+
stackit = {
4+
source = "stackitcloud/stackit"
5+
version = "~> 0.43"
6+
}
7+
}
8+
9+
# Terraform Remote State Backend Configuration
10+
# https://developer.hashicorp.com/terraform/language/backend/s3#configuration
11+
backend "s3" {
12+
bucket = "launchpad"
13+
region = "eu01"
14+
key = "prod-stackit/terraform/50_project/opsstack-agent-test/terraform.tfstate"
15+
16+
endpoints = {
17+
s3 = "https://object.storage.eu01.onstackit.cloud"
18+
}
19+
20+
# AWS specific checks must be skipped as they do not work on STACKIT
21+
skip_credentials_validation = true
22+
skip_region_validation = true
23+
skip_requesting_account_id = true
24+
skip_s3_checksum = true
25+
26+
# Credentials supplied by environment variables
27+
# access_key = null # AWS_ACCESS_KEY_ID
28+
# secret_key = null # AWS_SECRET_ACCESS_KEY
29+
}
30+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
variable "stackit_service_account_key" {
2+
type = string
3+
sensitive = true
4+
}
5+
6+
variable "stackit_service_account_private_key" {
7+
type = string
8+
default = null
9+
sensitive = true
10+
}
11+
12+
variable "agent_login" {
13+
type = string
14+
sensitive = true
15+
description = "Username and Password for the Agent User as hash "
16+
}
17+
18+
variable "deepview_url" {
19+
type = string
20+
description = "Public URL of the Opsstack Deployment"
21+
}
22+
23+
variable "agent_version" {
24+
type = string
25+
default = "latest"
26+
}
27+

0 commit comments

Comments
 (0)