In this article I will demonstrate how to provision multiple virtual machines with the help of Ansible automation (Ansible role), this will also include the provision of a standard Azure load balancer with a public IP address. So the Ansible script should be able to perform the below tasks automatically.
- Provision of an NSG (Network security group)
- Provision 2 virtual machines
- Provision of a standards load balancer
- Provision of a public IP address for the load balancer
- Install Nginx package on both machines
In this article, I will not describe Ansible installation or Ansible role, for this please read my earlier post.
https://www.techiescorner.in/ansible-play-book-and-role-tutorial/
Before provision virtual machines a VNET, subnet, and NSG are required, the playbook to provision these resources also included in this tutorial.
First, create a directory named “roles” for Ansible to lookup for the playbooks. Inside the roles create a role for Nginx servers. I have named the role name “nginx-server-prov”.
Create an Ansible Role
MacBook-Pro:roles $ ansible-galaxy init nginx-server-prov - Role nginx-server-prov was created successfully
The created ngix-server-prov contains the following folders, this is where we will write our playbooks.
MacBook-Pro:roles $ tree . . └── nginx-server-prov ├── README.md ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml 9 directories, 8 files
Create playbooks for vnet, subnet, and NSG
Create a new playbook to provision a VNET (vnet.yaml) in the tasks folder and add the below code.
--- - name: Create a virtual network azure_rm_virtualnetwork: resource_group: "{{resource_group_name}}" name: "vnet-{{env}}" location: "{{resource_group_location}}" address_prefixes_cidr: - "{{resource_vnet_octate}}.1.0.0/16" tags: - vnet-stage
The code which is in the {} are variable so declare the variable in the var/main.yaml file as follows.
--- # vars file for nginx-server-prov resource_group_name: "Techies_Devops" resource_group_location: "East US" resource_vnet_octate: "60" env: "test"
Next. create a playbook (nsg.yaml) to create an NSG in the tasks folder and add the below code.
--- # Create a security group - name: Configuring nginx NSG Rules azure_rm_securitygroup: resource_group: "{{resource_group_name}}" name: "nsg-{{env}}-{{resource_nsg_string}}" purge_rules: yes rules: - name: 'http' protocol: Tcp destination_port_range: 80 access: Allow priority: 101 direction: Inbound
Add the variable to the same var/main.yaml file. I will add a complete variable file at the end.
Next, create a playbook to provision a subnet (subnet.yaml) under the tasks folder and add the below code.
--- - name: Create a subnet for nginx servers nsg azure_rm_subnet: resource_group: "{{resource_group_name}}" virtual_network_name: "vnet-{{env}}" name: "subnet-{{env}}-nginx" address_prefix_cidr: "{{resource_vnet_octate}}.1.2.0/24" security_group: name: "nsg-{{env}}-nginx" resource_group: "{{resource_group_name}}" tags: - nginx
Before going to provision the virtual machines we can provision VNET, NSG, and subnet first, for this add the below code in the main.yaml file.
--- # tasks file for nginx-server-prov - import_tasks: vnet.yaml - import_tasks: nsg.yaml - import_tasks: subnet.yaml
To call an ansible role create a site file outside the Roles directory. I have created a file
site_nginx.yaml and included the role as follows.
--- - name: Deploying the resources hosts: localhost roles: - {role: nginx-server-prov}
Now we are good to execute the below command to provision the resources.
MacBook-Pro:Temp$ ansible-playbook site_nginx.yaml [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [Deploying the resources] ************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************** ok: [localhost] TASK [nginx-server-prov : Create a virtual network] ***************************************************************************************************************** changed: [localhost] TASK [nginx-server-prov : Configuring nginx NSG Rules] ************************************************************************************************************** changed: [localhost] TASK [nginx-server-prov : Create a subnet for nginx servers nsg] **************************************************************************************************** changed: [localhost] PLAY RECAP ********************************************************************************************************************************************************** localhost : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Log in to the Azure portal and make sure that the resource provisioned successfully.
Next, we have to provision virtual machines for the Nginx server.