From 53ded24e549ee208ab3c168751dd633d80aeb64c Mon Sep 17 00:00:00 2001 From: mkorobeinikov <92354771+mkorobeinikov@users.noreply.github.com> Date: Fri, 29 Mar 2024 07:54:44 +0300 Subject: Google + Terraform Ho to make ian nstance --- .../Ansible/ansible.cfg | 4 + .../Ansible/group_vars/all | 4 + .../Ansible/instance.yml | 25 ++++ .../README.md | 0 .../terraform.tfvars | 9 ++ .../var.tf | 79 +++++++++++ .../vyos.tf | 154 +++++++++++++++++++++ 7 files changed, 275 insertions(+) create mode 100644 TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/ansible.cfg create mode 100644 TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/group_vars/all create mode 100644 TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/instance.yml create mode 100644 TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/README.md create mode 100644 TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/terraform.tfvars create mode 100644 TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/var.tf create mode 100644 TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/vyos.tf diff --git a/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/ansible.cfg b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/ansible.cfg new file mode 100644 index 0000000..9cb2730 --- /dev/null +++ b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/ansible.cfg @@ -0,0 +1,4 @@ +[defaults] +inventory = /root/google/ip.txt +host_key_checking= False +remote_user=vyos \ No newline at end of file diff --git a/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/group_vars/all b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/group_vars/all new file mode 100644 index 0000000..d0f3f07 --- /dev/null +++ b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/group_vars/all @@ -0,0 +1,4 @@ +ansible_connection: ansible.netcommon.network_cli +ansible_network_os: vyos.vyos.vyos +ansible_user: vyos +ansible_ssh_pass: vyos diff --git a/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/instance.yml b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/instance.yml new file mode 100644 index 0000000..ca5102e --- /dev/null +++ b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/Ansible/instance.yml @@ -0,0 +1,25 @@ +############################################################################## +# About tasks: +# "Wait 300 seconds, but only start checking after 60 seconds" - try to make ssh connection every 60 seconds until 300 seconds +# "Configure general settings for the VyOS hosts group" - make provisioning into google cloud VyOS node +# You have to add all necessary cammans of VyOS under the block "lines:" +############################################################################## + + +- name: integration of terraform and ansible + hosts: all + gather_facts: 'no' + + tasks: + + - name: "Wait 300 seconds, but only start checking after 60 seconds" + wait_for_connection: + delay: 60 + timeout: 300 + + - name: "Configure general settings for the VyOS hosts group" + vyos_config: + lines: + - set system name-server xxx.xxx.xxx.xxx + save: + true diff --git a/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/README.md b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/README.md new file mode 100644 index 0000000..e69de29 diff --git a/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/terraform.tfvars b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/terraform.tfvars new file mode 100644 index 0000000..f94ab87 --- /dev/null +++ b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/terraform.tfvars @@ -0,0 +1,9 @@ +############################################################################## +# Must be filled in +############################################################################## + +zone = "us-west1-a" +gcp_auth_file = "/root/***/***.json" # path of your .json file +project_id = "" # the google project +password = "" # password for Ansible SSH +host = "" # IP of my Ansible diff --git a/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/var.tf b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/var.tf new file mode 100644 index 0000000..7f93178 --- /dev/null +++ b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/var.tf @@ -0,0 +1,79 @@ +variable "image" { + type = string + default = "projects/sentrium-public/global/images/vyos-1-3-5-20231222143039" +} + +variable "project_id" { + type = string +} + +variable "zone" { + type = string +} + +############################################################################## +# You can choose more chipper type than n2-highcpu-4 +############################################################################## + +variable "machine_type" { + type = string + default = "n2-highcpu-4" +} + +variable "networks" { + description = "The network name to attach the VM instance." + type = list(string) + default = ["default"] +} + +variable "sub_networks" { + description = "The sub network name to attach the VM instance." + type = list(string) + default = ["default"] +} + +variable "external_ips" { + description = "The external IPs assigned to the VM for public access." + type = list(string) + default = ["EPHEMERAL"] +} + +variable "enable_tcp_22" { + description = "Allow SSH traffic from the Internet" + type = bool + default = true +} + +variable "enable_udp_500_4500" { + description = "Allow IKE/IPSec traffic from the Internet" + type = bool + default = true +} + +variable "vyos_user_data" { + type = string + default = "" +} + +// Marketplace requires this variable name to be declared +variable "goog_cm_deployment_name" { + description = "VyOS Universal Router Deployment" + type = string + default = "vyos" +} + +# GCP authentication file +variable "gcp_auth_file" { + type = string + description = "GCP authentication file" +} + +variable "password" { + description = "pass for Ansible" + type = string + sensitive = true +} +variable "host"{ + description = "The IP of my Ansible" + type = string +} diff --git a/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/vyos.tf b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/vyos.tf new file mode 100644 index 0000000..1f91416 --- /dev/null +++ b/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main/vyos.tf @@ -0,0 +1,154 @@ +############################################################################## +# Build an VyOS VM from the Marketplace +# +# After deploying the GCP instance and getting an IP address, the IP address is copied into the file +#"ip.txt" and copied to the Ansible node for provisioning. +############################################################################## + +terraform { + required_providers { + google = { + source = "hashicorp/google" + } + } +} + +provider "google" { + project = var.project_id + request_timeout = "60s" + credentials = file(var.gcp_auth_file) +} + +locals { + network_interfaces = [for i, n in var.networks : { + network = n, + subnetwork = length(var.sub_networks) > i ? element(var.sub_networks, i) : null + external_ip = length(var.external_ips) > i ? element(var.external_ips, i) : "NONE" + } + ] +} + +resource "google_compute_instance" "default" { + name = var.goog_cm_deployment_name + machine_type = var.machine_type + zone = var.zone + + metadata = { + enable-oslogin = "FALSE" + serial-port-enable = "TRUE" + user-data = var.vyos_user_data + } + boot_disk { + initialize_params { + image = var.image + } + } + + can_ip_forward = true + + dynamic "network_interface" { + for_each = local.network_interfaces + content { + network = network_interface.value.network + subnetwork = network_interface.value.subnetwork + nic_type = "GVNIC" + dynamic "access_config" { + for_each = network_interface.value.external_ip == "NONE" ? [] : [1] + content { + nat_ip = network_interface.value.external_ip == "EPHEMERAL" ? null : network_interface.value.external_ip + } + } + } + } +} + +resource "google_compute_firewall" "tcp_22" { + count = var.enable_tcp_22 ? 1 : 0 + + name = "${var.goog_cm_deployment_name}-tcp-22" + network = element(var.networks, 0) + + allow { + ports = ["22"] + protocol = "tcp" + } + + source_ranges = ["0.0.0.0/0"] + + target_tags = ["${var.goog_cm_deployment_name}-deployment"] +} + +resource "google_compute_firewall" "udp_500_4500" { + count = var.enable_udp_500_4500 ? 1 : 0 + + name = "${var.goog_cm_deployment_name}-udp-500-4500" + network = element(var.networks, 0) + +allow { + ports = ["500", "4500"] + protocol = "udp" +} + +source_ranges = ["0.0.0.0/0"] + + target_tags = ["${var.goog_cm_deployment_name}-deployment"] +} + +output "public_ip_address" { + value = google_compute_instance.default.network_interface[0].access_config[0].nat_ip +} + +############################################################################## +# +# IP of google instance copied to a file ip.txt in local system Terraform +# ip.txt looks like: +# cat ./ip.txt +# ххх.ххх.ххх.ххх +############################################################################## + +resource "local_file" "ip" { + content = google_compute_instance.default.network_interface[0].access_config[0].nat_ip + filename = "ip.txt" +} + +#connecting to the Ansible control node using SSH connection + +############################################################################## +# Steps "SSHconnection1" and "SSHconnection2" need to get file ip.txt from the terraform node and start remotely the playbook of Ansible. +############################################################################## + +resource "null_resource" "SSHconnection1" { +depends_on = ["google_compute_instance.default"] +connection { + type = "ssh" + user = "root" + password = var.password + host = var.host +} + +#copying the ip.txt file to the Ansible control node from local system + + provisioner "file" { + source = "ip.txt" + destination = "/root/google/ip.txt" # The folder of your Ansible project + } +} + +resource "null_resource" "SSHconnection2" { +depends_on = ["google_compute_instance.default"] +connection { + type = "ssh" + user = "root" + password = var.password + host = var.host +} + +#command to run Ansible playbook on remote Linux OS + +provisioner "remote-exec" { + inline = [ + "cd /root/google/", + "ansible-playbook instance.yml" # more detailed in "File contents of Ansible for google cloud" +] +} +} -- cgit v1.2.3