Bobcares

Terraform Docker swarm | Installation steps

by | Aug 23, 2022

Let’s have a closer look at how to deploy Terraform Docker swarm Cluster and Ansible by our Support team as a part of our Docker hosting support service. We Bobcares respond to all your queries, no matter how minor.

Deploy Terraform Docker swarm using Terraform & Ansible

A node in a swarm cluster of any machine with a docker engine installed has the capability of hosting the containers or services, we often call applications as services when the docker engine is running under swarm mode. This is also described as the Docker node.

A Docker node can be a physical machine or even with one or more virtual machines running on a physical host or on cloud server. It is suggested to develop docker nodes across multiple physical machines to provide availability and reliability for the applications that is been running on the hosts.

The manager node executes orchestration and cluster management functions that require to maintain the desired state of the farm. If there are various manager nodes in a swarm cluster, then the nodes have the ability to elect one leader among the process to conduct orchestration which that implements a leader election strategy.

Terraform Docker swarm

Now we’ll check on how to deploy our Terraform docker swarm cluster step-by-step procedure.

Step-1 :

Initially install the terraform and set up an AWS account for working forward.

Step-2 :

Create a directory “swarm-deploy “. create files named variable.tf, security-groups.tf, main.tf and output.tf.

Additionally, add the following code in a variable.tf file:

variable "aws_region" {
description = "AWS region on which we will setup the swarm cluster"
default = "eu-west-1"
}variable "ami" {
description = "Amazon Linux AMI"
default = "ami-04d10c7d"
}variable "instance_type" {
description = "Instance type"
default = "t2.micro"
}variable "key_path" {
description = "SSH Public Key path"
default = "/path-to-keyfile/docker-key.pem"
}variable "key_name" {
description = "Desired name of Keypair..."
default = "docker-key"
}variable "bootstrap_path" {
description = "Script to install Docker Engine"
default = "install_docker_machine_compose.sh"
}

Now In the “security-groups.tf” file, add the given below code:

resource "aws_security_group" "sgswarm" {
name = "sgswarm"
tags {
Name = "sgswarm"
}# Allow all inbound
ingress {
from_port = 0
to_port = 65535
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}egress {
from_port = 0
to_port = 65535
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}# Enable ICMP
ingress {
from_port = -1
to_port = -1
protocol = "icmp"
cidr_blocks = ["0.0.0.0/0"]
}
}

In “main.tf” file add the following:

# Specify the provider and access details
provider "aws" {
access_key = "your-aws-access-key"
secret_key = "your-aws-secret-access-key"
region = "${var.aws_region}"
}resource "aws_instance" "master" {
ami = "${var.ami}"
instance_type = "${var.instance_type}"
key_name = "${var.key_name}"
user_data = "${file("${var.bootstrap_path}")}"
vpc_security_group_ids = ["${aws_security_group.sgswarm.id}"]tags {
Name = "master"
}
}resource "aws_instance" "worker1" {
ami = "${var.ami}"
instance_type = "${var.instance_type}"
key_name = "${var.key_name}"
user_data = "${file("${var.bootstrap_path}")}"
vpc_security_group_ids = ["${aws_security_group.sgswarm.id}"]tags {
Name = "worker 1"
}
}resource "aws_instance" "worker2" {
ami = "${var.ami}"
instance_type = "${var.instance_type}"
key_name = "${var.key_name}"
user_data = "${file("${var.bootstrap_path}")}"
vpc_security_group_ids = ["${aws_security_group.sgswarm.id}"]tags {
Name = "worker 2"
}
}

Finally, to “output.tf “file add the below code:

output "master_public_ip" {
  value = ["${aws_instance.master.public_ip}"]
}output "worker1_public_ip" {
  value = ["${aws_instance.worker1.public_ip}"]
}output "worker2_public_ip" {
  value = ["${aws_instance.worker2.public_ip}"]
}

Step-3 :

With help of a shell script, we can install docker. You just need to create a shell script named install_docker_machine_compose.sh. This script will execute in the provisioning time.

#!/bin/bash
export LC_ALL=C
sudo apt-get update -y
#sudo apt-get upgrade -y### install python-minimal
sudo apt-get install python-minimal -y# install docker-engine
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce
echo "Docker installed..."
sudo usermod -aG docker ${whoami}
sudo systemctl enable docker
sudo systemctl start dockerecho "########################################"
echo "########################################"echo "##################### install docker-compose ########################"
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
echo "docker-compose installed..."echo "########################################"
echo "########################################"echo "#################### install docker-machine #########################"
curl -L https://github.com/docker/machine/releases/download/v0.12.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine
chmod +x /tmp/docker-machine
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
echo "docker-machine installed..."

Step-4 :

We now need to Install Ansible, you can install them using the code:

$ sudo apt-add-repository ppa:ansible/ansible
Press ENTER to accept the PPA addition.
$ sudo apt-get update
$ sudo apt-get install ansible

Step-5 :

There are many techniques for setting up a swarm cluster. Can create using any virtualized environment like Hyper-V, a virtual box. The number of Host running in the cluster will be highly restricted to the server’s CPU and memory capacity.

Traditionally on-premise environments are set up using multiple physical nodes. The alternative way of setting up a swarm environment is by using hosted environments like Azure or AWS. We’ll create an ansible script for creating a swarm cluster by a manager node and two worker nodes.

To proceed with this first create a file named ” playbook.ymlin the swarm-deploy directory and add the following:

  - name: Init Swarm Master
    hosts: masters
    become: true
    gather_facts: False
    remote_user: ubuntu
    tasks:
      - name: Swarm Init
        command: sudo usermod -aG docker {{remote_user}}
        command: docker swarm init --advertise-addr {{ inventory_hostname }}- name: Get Worker Token
        command: docker swarm join-token worker -q
        register: worker_token- name: Show Worker Token
        debug: var=worker_token.stdout- name: Master Token
        command: docker swarm join-token manager -q
        register: master_token- name: Show Master Token
        debug: var=master_token.stdout- name: Join Swarm Cluster
    hosts: workers
    become: true
    remote_user: ubuntu
    gather_facts: False
    vars:
      token: "{{ hostvars[groups['masters'][0]]['worker_token']['stdout'] }}"
      master: "{{ hostvars[groups['masters'][0]]['inventory_hostname'] }}"
    tasks:
      - name: Join Swarm Cluster as a Worker
        command: sudo usermod -aG docker {{remote_user}}
        command: sudo docker swarm join --token {{ token }} {{ master }}:2377
        register: worker- name: Show Results
        debug: var=worker.stdout- name: Show Errors
        debug: var=worker.stderr

Create a new directory ” inventorywithin that create a file named ” hosts “. Change the public IP and key-file-path which you will get after running the terraform apply command.

[masters]52.51.138.1 ansible_user=ubuntu ansible_private_key_file=/path-to-your-keyfile/docker-key.pem[workers]34.240.19.111 ansible_user=ubuntu ansible_private_key_file=/path-to-your-keyfile/docker-key.pem
52.208.83.236 ansible_user=ubuntu ansible_private_key_file=/path-to-your-keyfile/docker-key.p

Step-6 :

All the configuration files and scripts are been successfully updated. Further, run the following commands to deploy three instances by using terraform and to create a swarm cluster using ansible in those instances.

$ terraform init
$ terraform plan

By this, the Terraform has successfully initialized.

$ terraform apply
Apply complete! Resources:4 added, 0 changed, 0 destroyed.

Outputs:

master public_ip = [ IP ]

worker_public_ip = [ IP ]

worker2_public_ip = [ IP ]

$ ansible-playbook -i inventory/hosts playbook.yml

Our swarm cluster is perfectly ready. Simultaneously let’s check the cluster using ssh in the manager node.

$ ssh -i your_key_file.pem ubuntu@manager_public_ip
$ sudo docker node ls

That’s all! by this sudo docker node ls Command will show the status and availability as ready and active respectively with the manager status as a leader by leader election strategy.

Conclusion:

The Terraform Docker swarm environment includes one or more manager nodes. To deploy an application on the Docker Swarm cluster we submit a request in the form of service to a manager node for performing the action.

PREVENT YOUR SERVER FROM CRASHING!

Never again lose customers to poor server speed! Let us help you.

Our server experts will monitor & maintain your server
24/7 so that it remains lightning fast and secure.

GET STARTED

0 Comments

Submit a Comment

Your email address will not be published. Required fields are marked *

Never again lose customers to poor
server speed! Let us help you.