diff --git a/Jenkins/Terraform/conf/cloud-init.packages.yaml b/Jenkins/Terraform/conf/cloud-init.packages.yaml new file mode 100644 index 0000000000000000000000000000000000000000..62c3a501b56816cea5233c45b5f620338182c24b --- /dev/null +++ b/Jenkins/Terraform/conf/cloud-init.packages.yaml @@ -0,0 +1,31 @@ +#cloud-config +--- + +# package_update: true +# package_upgrade: true + +groups: + - docker + +system_info: + default_user: + groups: [docker] + +# add any basic packages here: +packages: + - curl + - nano + - ripgrep + - docker.io + - bash-completion + +# SH commands to install jenkns +runcmd: + - sudo yum update -y # updates the package list and upgrades installed packages on the system + - sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo #downloads the Jenkins repository configuration file and saves it to /etc/yum.repos.d/jenkins.repo + - sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key #imports the GPG key for the Jenkins repository. This key is used to verify the authenticity of the Jenkins packages + - sudo yum upgrade -y # upgrades packages again, which might be necessary to ensure that any new dependencies required by Jenkins are installed + - sudo dnf install java-11-amazon-corretto -y # installs Amazon Corretto 11, which is a required dependency for Jenkins. + - sudo yum install jenkins -y #installs Jenkins itself + - sudo systemctl enable jenkins #enables the Jenkins service to start automatically at boot time + - sudo systemctl start jenkins #starts the Jenkins service immediately diff --git a/Jenkins/Terraform/conf/cloud-init.users.yaml b/Jenkins/Terraform/conf/cloud-init.users.yaml new file mode 100644 index 0000000000000000000000000000000000000000..201c6c0f3e1f9aff03126232dc297b7639755392 --- /dev/null +++ b/Jenkins/Terraform/conf/cloud-init.users.yaml @@ -0,0 +1,15 @@ +#cloud-config +--- +groups: + - terraform + +system_info: + default_user: + name: terraform + gecos: terraform + primary_group: terraform + groups: [users, admin, sudo] + shell: /bin/bash + sudo: ALL=(ALL) NOPASSWD:ALL + ssh_authorized_keys: + - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICd2om++e154/EKtD66CaRELfJ/lbzum44EqLbRKjjuQ terraform@TF-lab diff --git a/Jenkins/Terraform/main.tf b/Jenkins/Terraform/main.tf new file mode 100644 index 0000000000000000000000000000000000000000..2a2903daa365d253d45f4fdf474d5e2a1d1d15dd --- /dev/null +++ b/Jenkins/Terraform/main.tf @@ -0,0 +1,164 @@ +# terraform apply -var-file="terraform.tfvars" -auto-approve + +terraform { + required_providers { + openstack = { + source = "terraform-provider-openstack/openstack" + version = "~> 3.0.0" + } + aws = { + source = "hashicorp/aws" + version = "~> 5.0.0" + } + local = { + source = "hashicorp/local" + version = "~> 2.0" + } + } + required_version = ">= 1.9.0" +} + +# Configure the OpenStack Provider +provider "openstack" { + cloud = "engines" +} + +resource "tls_private_key" "my_generated_key" { + algorithm = "RSA" + rsa_bits = 2048 +} + +resource "openstack_compute_keypair_v2" "my_keypair" { + name = "my-keypair" + public_key = tls_private_key.my_generated_key.public_key_openssh +} + +resource "local_file" "private_key" { + content = tls_private_key.my_generated_key.private_key_pem + filename = "${path.module}/private_key.pem" +} + +resource "openstack_compute_instance_v2" "app_server" { + name = var.instance_name + image_id = "654bf798-579b-47aa-a7f7-8a8798c9779d" + flavor_name = "m1.medium" + key_pair = openstack_compute_keypair_v2.my_keypair.name + + security_groups = ["default", "secgrp_1"] + user_data = data.cloudinit_config.my_config.rendered +} + +# Network configuration +resource "openstack_networking_secgroup_v2" "secgrp_1" { + name = "secgrp_1" +} + +resource "openstack_networking_secgroup_rule_v2" "secgroup_rule_1" { + direction = "ingress" + ethertype = "IPv4" + protocol = "icmp" + remote_ip_prefix = "0.0.0.0/0" + security_group_id = openstack_networking_secgroup_v2.secgrp_1.id +} + +resource "openstack_networking_secgroup_rule_v2" "secgroup_rule_2" { + 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.secgrp_1.id +} + +resource "openstack_networking_secgroup_rule_v2" "secgroup_rule_3" { + direction = "ingress" + ethertype = "IPv4" + protocol = "tcp" + port_range_min = 443 + port_range_max = 443 + remote_ip_prefix = "0.0.0.0/0" + security_group_id = openstack_networking_secgroup_v2.secgrp_1.id +} + +resource "openstack_networking_secgroup_rule_v2" "secgroup_rule_4" { + direction = "ingress" + ethertype = "IPv4" + protocol = "tcp" + port_range_min = 8080 + port_range_max = 8080 + remote_ip_prefix = "0.0.0.0/0" + security_group_id = openstack_networking_secgroup_v2.secgrp_1.id +} + +resource "openstack_networking_floatingip_v2" "fip_1" { + pool = "public" + description = "TF-Lab" +} + +data "openstack_networking_port_v2" "port" { + device_id = openstack_compute_instance_v2.app_server.id + network_id = openstack_compute_instance_v2.app_server.network.0.uuid +} + +resource "openstack_networking_floatingip_associate_v2" "fip_associate" { + floating_ip = openstack_networking_floatingip_v2.fip_1.address + port_id = data.openstack_networking_port_v2.port.id +} + +data "cloudinit_config" "my_config" { + gzip = false + base64_encode = false + + part { + filename = "file-1" + content_type = "text/cloud-config" + content = file("conf/cloud-init.users.yaml") + merge_type = "list(append)+dict(no_replace,recurse_list)" + } + + part { + filename = "file-2" + content_type = "text/cloud-config" + content = file("conf/cloud-init.packages.yaml") + merge_type = "list(append)+dict(no_replace,recurse_list)" + } +} + +# Configuration du provider AWS pour OpenStack Swift (S3-compatible) +provider "aws" { + region = "us-east-1" + skip_credentials_validation = true + skip_requesting_account_id = true + access_key = var.os_access_key + secret_key = var.os_secret_key + + endpoints { + s3 = "https://os.zhdk.cloud.switch.ch" + } +} + +# Création d'un conteneur (équivalent à un bucket S3) +resource "aws_s3_bucket" "bucket" { + bucket = var.container_name +} + +resource "aws_s3_bucket_policy" "public_policy" { + bucket = aws_s3_bucket.bucket.id + + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Principal = "*" + Action = [ + "s3:GetObject", + "s3:PutObject", + "s3:DeleteObject" + ] + Resource = "${aws_s3_bucket.bucket.arn}/*" + } + ] + }) +} \ No newline at end of file diff --git a/Jenkins/Terraform/terraform.tfvars b/Jenkins/Terraform/terraform.tfvars new file mode 100644 index 0000000000000000000000000000000000000000..6192502d2f4213dd3b4cafc46ecd987488577baa --- /dev/null +++ b/Jenkins/Terraform/terraform.tfvars @@ -0,0 +1,5 @@ +# openstack --os-cloud=engines ec2 credential list + +os_access_key = "3d134a2f61fd4fd8a1e73cbf54058c69" +os_secret_key = "ed64900428d64167b3d021a0a33e5f7d" + diff --git a/Jenkins/Terraform/varables.tf b/Jenkins/Terraform/varables.tf new file mode 100644 index 0000000000000000000000000000000000000000..3100dfec80e4184fd66cb74d8ad9bc8297d0f30e --- /dev/null +++ b/Jenkins/Terraform/varables.tf @@ -0,0 +1,22 @@ +variable "instance_name" { + description = "Value of the instance's name tag" + type = string + default = "Jenkins" +} + +variable "container_name" { + description = "Name of the OpenStack Swift container" + type = string + default = "Jenkins-Server" +} + +# Variables nécessaires +variable "os_access_key" { + description = "OpenStack Swift Access Key" + type = string +} + +variable "os_secret_key" { + description = "OpenStack Swift Secret Key" + type = string +}