mirror of
https://github.com/vyos/vyos-documentation.git
synced 2025-10-26 08:41:46 +01:00
Merge pull request #1345 from mkorobeinikov/master
Article about terraform and google.
This commit is contained in:
commit
09c7f833bc
BIN
docs/_static/images/json.png
vendored
Normal file
BIN
docs/_static/images/json.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
BIN
docs/_static/images/key.png
vendored
Normal file
BIN
docs/_static/images/key.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 162 KiB |
BIN
docs/_static/images/project.png
vendored
Normal file
BIN
docs/_static/images/project.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
BIN
docs/_static/images/service.png
vendored
Normal file
BIN
docs/_static/images/service.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 191 KiB |
@ -0,0 +1,708 @@
|
|||||||
|
:lastproofread: 2024-03-25
|
||||||
|
|
||||||
|
.. _terraformgoogle:
|
||||||
|
|
||||||
|
Deploying VyOS in the google cloud
|
||||||
|
==================================
|
||||||
|
|
||||||
|
With the help of Terraform, you can quickly deploy VyOS-based infrastructure in the google cloud. If necessary, the infrastructure can be removed using terraform.
|
||||||
|
Also we will make provisioning using Ansible.
|
||||||
|
|
||||||
|
In this case, we'll create the necessary files for Terraform and Ansible next using Terraform we'll create a single instance on the google cloud and make provisioning using Ansible.
|
||||||
|
|
||||||
|
Preparation steps for deploying VyOS on google
|
||||||
|
----------------------------------------------
|
||||||
|
|
||||||
|
How to create a single instance and install your configuration using Terraform+Ansible+google
|
||||||
|
Step by step:
|
||||||
|
|
||||||
|
google cloud
|
||||||
|
|
||||||
|
|
||||||
|
1 Create an account with google cloud and a new project
|
||||||
|
|
||||||
|
.. image:: /_static/images/project.png
|
||||||
|
:width: 50%
|
||||||
|
:align: center
|
||||||
|
:alt: Network Topology Diagram
|
||||||
|
|
||||||
|
2 Create a service aacount and download your key (.JSON)
|
||||||
|
|
||||||
|
.. image:: /_static/images/service.png
|
||||||
|
:width: 50%
|
||||||
|
:align: center
|
||||||
|
:alt: Network Topology Diagram
|
||||||
|
|
||||||
|
.. image:: /_static/images/key.png
|
||||||
|
:width: 50%
|
||||||
|
:align: center
|
||||||
|
:alt: Network Topology Diagram
|
||||||
|
|
||||||
|
The .JSON file download automaticly after creating and will look like:
|
||||||
|
|
||||||
|
.. image:: /_static/images/json.png
|
||||||
|
:width: 50%
|
||||||
|
:align: center
|
||||||
|
:alt: Network Topology Diagram
|
||||||
|
|
||||||
|
|
||||||
|
Terraform
|
||||||
|
|
||||||
|
|
||||||
|
1 Create an UNIX or Windows instance
|
||||||
|
|
||||||
|
2 Download and install Terraform
|
||||||
|
|
||||||
|
3 Create the folder for example /root/google
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
mkdir /root/google
|
||||||
|
|
||||||
|
4 Copy all files into your Terraform project "/root/google" (vyos.tf, var.tf, terraform.tfvars, .JSON), more detailed see `Structure of files Terrafom for google cloud`_
|
||||||
|
|
||||||
|
5 Type the commands :
|
||||||
|
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
cd /<your folder>
|
||||||
|
terraform init
|
||||||
|
|
||||||
|
|
||||||
|
Ansible
|
||||||
|
|
||||||
|
|
||||||
|
1 Create an UNIX instance whenever you want (local, cloud, and so on)
|
||||||
|
|
||||||
|
2 Download and install Ansible
|
||||||
|
|
||||||
|
3 Create the folder for example /root/google/
|
||||||
|
|
||||||
|
4 Copy all files into your Ansible project "/root/google/" (ansible.cfg, instance.yml, mykey.json and "all"), more detailed see `Structure of files Ansible for google cloud`_
|
||||||
|
|
||||||
|
mykey.json you have to get using step 2 of the google cloud
|
||||||
|
|
||||||
|
|
||||||
|
Start
|
||||||
|
|
||||||
|
|
||||||
|
Type the commands on your Terrafom instance:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
cd /<your folder>
|
||||||
|
terraform plan
|
||||||
|
terraform apply
|
||||||
|
yes
|
||||||
|
|
||||||
|
|
||||||
|
Start creating a google cloud instance and check the result
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# terraform apply
|
||||||
|
|
||||||
|
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
|
||||||
|
+ create
|
||||||
|
|
||||||
|
Terraform will perform the following actions:
|
||||||
|
|
||||||
|
# google_compute_firewall.tcp_22[0] will be created
|
||||||
|
+ resource "google_compute_firewall" "tcp_22" {
|
||||||
|
+ creation_timestamp = (known after apply)
|
||||||
|
+ destination_ranges = (known after apply)
|
||||||
|
+ direction = (known after apply)
|
||||||
|
+ enable_logging = (known after apply)
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ name = "vyos-tcp-22"
|
||||||
|
+ network = "default"
|
||||||
|
+ priority = 1000
|
||||||
|
+ project = "vyosproject"
|
||||||
|
+ self_link = (known after apply)
|
||||||
|
+ source_ranges = [
|
||||||
|
+ "0.0.0.0/0",
|
||||||
|
]
|
||||||
|
+ target_tags = [
|
||||||
|
+ "vyos-deployment",
|
||||||
|
]
|
||||||
|
|
||||||
|
+ allow {
|
||||||
|
+ ports = [
|
||||||
|
+ "22",
|
||||||
|
]
|
||||||
|
+ protocol = "tcp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# google_compute_firewall.udp_500_4500[0] will be created
|
||||||
|
+ resource "google_compute_firewall" "udp_500_4500" {
|
||||||
|
+ creation_timestamp = (known after apply)
|
||||||
|
+ destination_ranges = (known after apply)
|
||||||
|
+ direction = (known after apply)
|
||||||
|
+ enable_logging = (known after apply)
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ name = "vyos-udp-500-4500"
|
||||||
|
+ network = "default"
|
||||||
|
+ priority = 1000
|
||||||
|
+ project = "vyosproject"
|
||||||
|
+ self_link = (known after apply)
|
||||||
|
+ source_ranges = [
|
||||||
|
+ "0.0.0.0/0",
|
||||||
|
]
|
||||||
|
+ target_tags = [
|
||||||
|
+ "vyos-deployment",
|
||||||
|
]
|
||||||
|
|
||||||
|
+ allow {
|
||||||
|
+ ports = [
|
||||||
|
+ "500",
|
||||||
|
+ "4500",
|
||||||
|
]
|
||||||
|
+ protocol = "udp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# google_compute_instance.default will be created
|
||||||
|
+ resource "google_compute_instance" "default" {
|
||||||
|
+ can_ip_forward = true
|
||||||
|
+ cpu_platform = (known after apply)
|
||||||
|
+ current_status = (known after apply)
|
||||||
|
+ deletion_protection = false
|
||||||
|
+ effective_labels = (known after apply)
|
||||||
|
+ guest_accelerator = (known after apply)
|
||||||
|
+ id = (known after apply)
|
||||||
|
+ instance_id = (known after apply)
|
||||||
|
+ label_fingerprint = (known after apply)
|
||||||
|
+ machine_type = "n2-highcpu-4"
|
||||||
|
+ metadata = {
|
||||||
|
+ "enable-oslogin" = "FALSE"
|
||||||
|
+ "serial-port-enable" = "TRUE"
|
||||||
|
+ "user-data" = ""
|
||||||
|
}
|
||||||
|
+ metadata_fingerprint = (known after apply)
|
||||||
|
+ min_cpu_platform = (known after apply)
|
||||||
|
+ name = "vyos"
|
||||||
|
+ project = "vyosproject"
|
||||||
|
+ self_link = (known after apply)
|
||||||
|
+ tags_fingerprint = (known after apply)
|
||||||
|
+ terraform_labels = (known after apply)
|
||||||
|
+ zone = "us-west1-a"
|
||||||
|
|
||||||
|
+ boot_disk {
|
||||||
|
+ auto_delete = true
|
||||||
|
+ device_name = (known after apply)
|
||||||
|
+ disk_encryption_key_sha256 = (known after apply)
|
||||||
|
+ kms_key_self_link = (known after apply)
|
||||||
|
+ mode = "READ_WRITE"
|
||||||
|
+ source = (known after apply)
|
||||||
|
|
||||||
|
+ initialize_params {
|
||||||
|
+ image = "projects/sentrium-public/global/images/vyos-1-3-5-20231222143039"
|
||||||
|
+ labels = (known after apply)
|
||||||
|
+ provisioned_iops = (known after apply)
|
||||||
|
+ provisioned_throughput = (known after apply)
|
||||||
|
+ size = (known after apply)
|
||||||
|
+ type = (known after apply)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ network_interface {
|
||||||
|
+ internal_ipv6_prefix_length = (known after apply)
|
||||||
|
+ ipv6_access_type = (known after apply)
|
||||||
|
+ ipv6_address = (known after apply)
|
||||||
|
+ name = (known after apply)
|
||||||
|
+ network = "default"
|
||||||
|
+ network_ip = (known after apply)
|
||||||
|
+ nic_type = "GVNIC"
|
||||||
|
+ stack_type = (known after apply)
|
||||||
|
+ subnetwork = "default"
|
||||||
|
+ subnetwork_project = (known after apply)
|
||||||
|
|
||||||
|
+ access_config {
|
||||||
|
+ nat_ip = (known after apply)
|
||||||
|
+ network_tier = (known after apply)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# local_file.ip will be created
|
||||||
|
+ resource "local_file" "ip" {
|
||||||
|
+ content = (known after apply)
|
||||||
|
+ content_base64sha256 = (known after apply)
|
||||||
|
+ content_base64sha512 = (known after apply)
|
||||||
|
+ content_md5 = (known after apply)
|
||||||
|
+ content_sha1 = (known after apply)
|
||||||
|
+ content_sha256 = (known after apply)
|
||||||
|
+ content_sha512 = (known after apply)
|
||||||
|
+ directory_permission = "0777"
|
||||||
|
+ file_permission = "0777"
|
||||||
|
+ filename = "ip.txt"
|
||||||
|
+ id = (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
# null_resource.SSHconnection1 will be created
|
||||||
|
+ resource "null_resource" "SSHconnection1" {
|
||||||
|
+ id = (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
# null_resource.SSHconnection2 will be created
|
||||||
|
+ resource "null_resource" "SSHconnection2" {
|
||||||
|
+ id = (known after apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
Plan: 6 to add, 0 to change, 0 to destroy.
|
||||||
|
|
||||||
|
Changes to Outputs:
|
||||||
|
+ public_ip_address = (known after apply)
|
||||||
|
╷
|
||||||
|
│ Warning: Quoted references are deprecated
|
||||||
|
│
|
||||||
|
│ on vyos.tf line 126, in resource "null_resource" "SSHconnection1":
|
||||||
|
│ 126: depends_on = ["google_compute_instance.default"]
|
||||||
|
│
|
||||||
|
│ In this context, references are expected literally rather than in quotes. Terraform 0.11 and earlier required quotes, but quoted references are now deprecated and will be removed in a
|
||||||
|
│ future version of Terraform. Remove the quotes surrounding this reference to silence this warning.
|
||||||
|
│
|
||||||
|
│ (and one more similar warning elsewhere)
|
||||||
|
╵
|
||||||
|
|
||||||
|
Do you want to perform these actions?
|
||||||
|
Terraform will perform the actions described above.
|
||||||
|
Only 'yes' will be accepted to approve.
|
||||||
|
|
||||||
|
Enter a value: yes
|
||||||
|
|
||||||
|
google_compute_firewall.udp_500_4500[0]: Creating...
|
||||||
|
google_compute_firewall.tcp_22[0]: Creating...
|
||||||
|
google_compute_instance.default: Creating...
|
||||||
|
google_compute_firewall.udp_500_4500[0]: Still creating... [10s elapsed]
|
||||||
|
google_compute_firewall.tcp_22[0]: Still creating... [10s elapsed]
|
||||||
|
google_compute_instance.default: Still creating... [10s elapsed]
|
||||||
|
google_compute_firewall.tcp_22[0]: Creation complete after 16s [id=projects/vyosproject/global/firewalls/vyos-tcp-22]
|
||||||
|
google_compute_firewall.udp_500_4500[0]: Creation complete after 16s [id=projects/vyosproject/global/firewalls/vyos-udp-500-4500]
|
||||||
|
google_compute_instance.default: Creation complete after 20s [id=projects/vyosproject/zones/us-west1-a/instances/vyos]
|
||||||
|
null_resource.SSHconnection1: Creating...
|
||||||
|
null_resource.SSHconnection2: Creating...
|
||||||
|
null_resource.SSHconnection1: Provisioning with 'file'...
|
||||||
|
null_resource.SSHconnection2: Provisioning with 'remote-exec'...
|
||||||
|
null_resource.SSHconnection2 (remote-exec): Connecting to remote host via SSH...
|
||||||
|
null_resource.SSHconnection2 (remote-exec): Host: 10.***.***.104
|
||||||
|
null_resource.SSHconnection2 (remote-exec): User: root
|
||||||
|
null_resource.SSHconnection2 (remote-exec): Password: true
|
||||||
|
null_resource.SSHconnection2 (remote-exec): Private key: false
|
||||||
|
null_resource.SSHconnection2 (remote-exec): Certificate: false
|
||||||
|
null_resource.SSHconnection2 (remote-exec): SSH Agent: false
|
||||||
|
null_resource.SSHconnection2 (remote-exec): Checking Host Key: false
|
||||||
|
null_resource.SSHconnection2 (remote-exec): Target Platform: unix
|
||||||
|
local_file.ip: Creating...
|
||||||
|
local_file.ip: Creation complete after 0s [id=7d568c3b994a018c942a3cdb952ccbf3c729d0ca]
|
||||||
|
null_resource.SSHconnection2 (remote-exec): Connected!
|
||||||
|
null_resource.SSHconnection1: Creation complete after 4s [id=5175298735911137161]
|
||||||
|
|
||||||
|
null_resource.SSHconnection2 (remote-exec): PLAY [integration of terraform and ansible] ************************************
|
||||||
|
|
||||||
|
null_resource.SSHconnection2 (remote-exec): TASK [Wait 300 seconds, but only start checking after 60 seconds] **************
|
||||||
|
null_resource.SSHconnection2: Still creating... [10s elapsed]
|
||||||
|
null_resource.SSHconnection2: Still creating... [20s elapsed]
|
||||||
|
null_resource.SSHconnection2: Still creating... [30s elapsed]
|
||||||
|
null_resource.SSHconnection2: Still creating... [40s elapsed]
|
||||||
|
null_resource.SSHconnection2: Still creating... [50s elapsed]
|
||||||
|
null_resource.SSHconnection2: Still creating... [1m0s elapsed]
|
||||||
|
null_resource.SSHconnection2: Still creating... [1m10s elapsed]
|
||||||
|
null_resource.SSHconnection2 (remote-exec): ok: [104.***.***.158]
|
||||||
|
|
||||||
|
null_resource.SSHconnection2 (remote-exec): TASK [Configure general settings for the vyos hosts group] *********************
|
||||||
|
null_resource.SSHconnection2: Still creating... [1m20s elapsed]
|
||||||
|
null_resource.SSHconnection2 (remote-exec): changed: [104.***.***.158]
|
||||||
|
|
||||||
|
null_resource.SSHconnection2 (remote-exec): PLAY RECAP *********************************************************************
|
||||||
|
null_resource.SSHconnection2 (remote-exec): 104.***.***.158 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
||||||
|
|
||||||
|
null_resource.SSHconnection2: Creation complete after 1m22s [id=3355727070503709742]
|
||||||
|
|
||||||
|
Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
|
||||||
|
|
||||||
|
Outputs:
|
||||||
|
|
||||||
|
public_ip_address = "104.***.***.158"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
After executing all the commands you will have your VyOS instance on the google cloud with your configuration, it's a very convenient desition.
|
||||||
|
If you need to delete the instance please type the command:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
terraform destroy
|
||||||
|
|
||||||
|
|
||||||
|
Troubleshooting
|
||||||
|
---------------
|
||||||
|
|
||||||
|
1 Increase the time in the file instance.yml from 300 sec to 500 sec or more. (It depends on your location).
|
||||||
|
Make sure that you have opened access to the instance in the security group.
|
||||||
|
|
||||||
|
2 Terraform doesn't connect via SSH to your Ansible instance: you have to check the correct login and password in the part of the file VyOS.tf
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
connection {
|
||||||
|
type = "ssh"
|
||||||
|
user = "root" # open root access using login and password on your Ansible
|
||||||
|
password = var.password # check password in the file terraform.tfvars isn't empty
|
||||||
|
host = var.host # check the correct IP address of your Ansible host
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Make sure that Ansible is pinging from Terrafom.
|
||||||
|
|
||||||
|
Structure of files Terrafom for google cloud
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
.
|
||||||
|
├── vyos.tf # The main script
|
||||||
|
├── ***.JSON # The credential file from google cloud
|
||||||
|
├── var.tf # The file of all variables in "vyos.tf"
|
||||||
|
└── terraform.tfvars # The value of all variables (passwords, login, ip adresses and so on)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
File contents of Terrafom for google cloud
|
||||||
|
------------------------------------------
|
||||||
|
|
||||||
|
vyos.tf
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# 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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var.tf
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
terraform.tfvars
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# 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
|
||||||
|
|
||||||
|
|
||||||
|
Structure of files Ansible for google cloud
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
.
|
||||||
|
├── group_vars
|
||||||
|
└── all
|
||||||
|
├── ansible.cfg
|
||||||
|
└── instance.yml
|
||||||
|
|
||||||
|
|
||||||
|
File contents of Ansible for google cloud
|
||||||
|
-----------------------------------------
|
||||||
|
|
||||||
|
ansible.cfg
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
[defaults]
|
||||||
|
inventory = /root/google/ip.txt
|
||||||
|
host_key_checking= False
|
||||||
|
remote_user=vyos
|
||||||
|
|
||||||
|
instance.yml
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# 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
|
||||||
|
|
||||||
|
|
||||||
|
group_vars/all
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
ansible_connection: ansible.netcommon.network_cli
|
||||||
|
ansible_network_os: vyos.vyos.vyos
|
||||||
|
ansible_user: vyos
|
||||||
|
ansible_ssh_pass: vyos
|
||||||
|
|
||||||
|
Sourse files for google cloud from GIT
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
All files about the article can be found here_
|
||||||
|
|
||||||
|
|
||||||
|
.. _here: https://github.com/vyos/vyos-automation/tree/main/TerraformCloud/Google_terraform_ansible_single_vyos_instance-main
|
||||||
Loading…
x
Reference in New Issue
Block a user