Automating Cloud Infrastructure with Ansible
By Kalapriya Kolappan, Alibaba Cloud Tech Share Author. Tech Share is Alibaba Cloud’s incentive program to encourage the sharing of technical knowledge and best practices within the cloud community.
“You’re either the one that creates the automation or you’re getting automated,” Tom Preston-Werner
For the past few years, we have experienced many disruptions in business trends. This has led to build a constructive way for megatrends associated with emerging technologies and one such thing is ‘AUTOMATION’. On this note, welcome to the decade of automation. We want everything to be done on time. Despite doing all jobs manually, we want our daily routines to get automated. Hence, we want to sharpen our knowledge to avoid doing tasks in the nick of time. This could be achieved by Ansible efficient code which replaces all our day to day activities. Perhaps, we need to have a solution in our local environment to make our life easier. But where to begin?
In this article, we will articulate about the concepts of automation, the benefits of Ansible, and how Ansible influences automation in cloud computing, using Alibaba Cloud Elastic Compute Service (ECS).
Why Automation?
The world is moving towards automation. Automation with Ansible makes organizational operations easier while managing company-wide infrastructure. In this epoch of technology, we’ll mainly focus on a bunch of reasons for why we think automation is a critical part in all IT enhancements.
- Less error-prone: It is very common to mistype, misread, put things in the wrong order, even to add things in that hierarchy. To avoid human error, we make the machine to do the tasks.
- Less time-consuming: Everything takes time from Logging into the console, writing commands to connect to the server. Instead, to avoid being on pins and needles make the machines to do its best. Make it simple and enjoy life.
- Reproducibility: Since everyone are keen to do things in the initial stages of activities but after a while, its human tendency to forget things easier and will miss something when trying to reproduce. These inevitable errors can be replaced when the machine does it.
When it comes to automation there are many options, we need to map to the look around and work accordingly. Everything has its own pros and cons, so strive hard to yield the best out of it.
What Is Ansible?
Ansible is a simple and powerful automation language. It helps to automate, accelerate, collaborate and integrate technologies that we already use. Ansible is used to perform the same set of tasks across different servers from the centralized server where Ansible is installed. One advantage of Ansible is completely agentless. It implies no agent needs to be installed on client systems where you want the automation to be done rather provided only SSH communication between client and server need to be established. Here we have some terms for better understanding. All this automation will be easier when there are hundreds of instance in the specified region.
Here are some common terms used when describing Ansible:
Control node: Machine where Ansible is installed and responsible for servers you are managing
Inventory: File that contains information about the servers
Playbook: The Main gateway for automation is defined in terms of tasks through YAML.
Implementing Ansible Solutions with Alibaba Cloud
Prerequisites
Ansible needs to be installed in your host environment.
Installation of Alibaba Cloud Modules
Alibaba cloud modules need to be installed in the control node. (i.e.) where ansible is installed.
We need the Alibaba cloud modules to be installed in ansible before using ansible with Alibaba. There are two ways to install alicloud provider ensure that ansible is already installed in the server.
sudo pip install ansible_alicloud
sudo pip install ansible_alicloud_module_utils
Modules will get installed in
Configuration file locations:
/etc/ansible ---- ansible.cfg
To ensure check the ansible version with the following command, it points to the currently used configuration file
[*****@***** ansible]# ansible --version
ansible 2.3.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.5 (default, Sep 5 2016, 02:30:38) [GCC 4.8.5 20150623 (Red Hat 4.8.5-9)]
Let’s make our work much more interesting with a technical guide to get started with the following set of activities.
- Starting, stopping, deleting and restarting instance in the specified region
- Fetching and gathering facts about the instance in the specified region
- Creating disk and attaching the disk to a specific instance.
Ansible playbooks are more efficient when automating the same process for a large number of Virtual machines instead of repeating the tasks individually.
Task 1: Starting, Stopping, Deleting and Restarting Instance in the Specified Region
Starting an ECS instance in Alibaba Cloud with Ansible
The first step is to create the playbook for starting the instance. The yaml code is as follows:
Note: Change the alicloud access key and a secret key of your cloud account
The yaml code is as follows:
- name: starting the instance example
hosts: localhost
vars:
alicloud_access_key: "xxxxxxxxx"
alicloud_secret_key:"xxxxxxxx"
alicloud_region: "ap-southeast-1"
instance_ids: "i-t4nelg6lkj5ycajgcaf2"
force: True tasks:
- name: starting instance
alicloud_instance:
alicloud_access_key: "{{ alicloud_access_key }}"
alicloud_secret_key: "{{ alicloud_secret_key }}"
alicloud_region: "{{ alicloud_region }}"
instance_ids: "{{ instance_ids }}"
state: 'running'
The output of the code after running the playbook is as follows:
Before running the code, status of ECS is given below:
Executing the playbook is as follows:
[root@ogslab3 Alibaba]# ansible-playbook starting.yml
After running the playbook, the status of the ECS is as follows:
Stopping an ECS instance in Alibaba cloud with Ansible
An ECS instance in Singapore region is in running state. The state of the ECS can be stopped using Ansible playbook as follows,
The yaml code for playbook is as follows:
- name: basic provisioning example
hosts: localhost
vars:
alicloud_access_key: "xxxxxxx"
alicloud_secret_key: "xxxxx"
alicloud_region: "ap-southeast-1"
instance_ids: "i-t4nelg6lkj5ycajgcaf2"
force: True tasks:
- name: stopping the instance
alicloud_instance:
alicloud_access_key: "{{ alicloud_access_key }}"
alicloud_secret_key: "{{ alicloud_secret_key }}"
alicloud_region: "{{ alicloud_region }}"
instance_ids: "{{ instance_ids }}"
state: 'stopped'
Before executing the code:
Ansible output is as follows:
After running the playbook, the status of the instance in ecs console is as follows:
Restarting an ECS instance in Alibaba cloud with Ansible
The yaml code is as follows (restart playbook):
- name: Restarting an instance
hosts: localhost
vars:
alicloud_access_key: "XXXXXXXXX"
alicloud_secret_key: "XXXXXXXXX"
alicloud_region: "ap-southeast-1"
instance_ids: "i-t4nelg6lkj5ycajgcaf2"
force: True tasks:
- name: Restart
alicloud_instance:
alicloud_access_key: "{{ alicloud_access_key }}"
alicloud_secret_key: "{{ alicloud_secret_key }}"
alicloud_region: "{{ alicloud_region }}"
instance_ids: "{{ instance_ids }}"
state: 'restarted'
force: '{{ force }}'
Compiling the playbook make changes to the ECS instance in the console:
The ecs instance which is up and running will again get restarted in the console.
Terminating an ECS Instance in Alibaba Cloud with Ansible
Playbook for terminating instance in ecs console is given below,
- name: Terminating the instance example
hosts: localhost
vars:
alicloud_access_key: "XXXXXX"
alicloud_secret_key: "xxxxx"
alicloud_region: "ap-southeast-1"
instance_ids: "i-t4n65f71bg34vbhz09if" tasks:
- name: deleting instance
alicloud_instance:
alicloud_access_key: "{{ alicloud_access_key }}"
alicloud_secret_key: "{{ alicloud_secret_key }}"
alicloud_region: "{{ alicloud_region }}"
instance_ids: "{{ instance_ids }}"
force: True
state: 'absent'
register: Deleteresult
- debug: var=deleteresult
While executing this playbook we get the following changes.
After releasing the instance, it will not be reflected in the console.
Task 2: Gathering Facts about an ECS Instance in Alibaba Cloud with Ansible
When we are confused to know about the instance details, you can even fetch information about the instance using the below playbook.
instancefacts.yml - name: fetch instance types example
hosts: localhost
vars:
alicloud_access_key: "XXXXX"
alicloud_secret_key: "XXXXXXX"
alicloud_region: "ap-southeast-1"
alicloud_zone: "ap-southeast-1a" tasks:
- name: Find all instance types in the specified region
alicloud_instance_type_facts:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
register: all_instance_types
- debug: var=all_instance_types
- name: Find all instance types based on the specified zone
alicloud_instance_type_facts:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
alicloud_zone: '{{ alicloud_zone }}'
register: instance_types_by_zone
- debug: var=instance_types_by_zone
- name: Find all instance types based on the specified family names
alicloud_instance_type_facts:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
instance_type_families:
- "ecs.t5"
register: instance_types_by_families
- debug: var=instance_types_by_families
- name: Find all instance types based on the specified ids
alicloud_instance_type_facts:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
instance_type_ids:
- "ecs.t5-lc2m1.nano"
register: instance_types_by_ids
- debug: var=instance_type_ids
From the above playbook, it fetches the instance type as follows,217 types of instances are available.
"instance_types": [
{
"cpu_core_count": 1,
"id": "ecs.t1.xsmall",
"instance_type_family": "ecs.t1",
"memory_size": 0.5
},
{
"cpu_core_count": 1,
"id": "ecs.t1.small",
"instance_type_family": "ecs.t1",
"memory_size": 1.0
}…….
{
"cpu_core_count": 4,
"id": "ecs.sn2ne.xlarge",
"instance_type_family": "ecs.sn2ne",
"memory_size": 16.0
},
The second module of the playbook fetch the types of instances available in the specified zone.
135 types of instance with their specifications are listed below:
"instance_type_ids": [
"ecs.sn2ne.large", "ecs.sn2ne.xlarge",
"ecs.sn2ne.2xlarge", "ecs.sn2ne.4xlarge"….. "ecs.n4.8xlarge"
The third module of the playbook fetch the different types of instances available in the specified family.
Say here ecs.t5 is taken as input, based on the CPU core count 16 varieties of the instance are there in the specified family.
{
"cpu_core_count": 1,
"id": "ecs.t5-lc1m2.small",
"instance_type_family": "ecs.t5",
"memory_size": 2.0
},
{
"cpu_core_count": 2,
"id": "ecs.t5-lc1m2.large",
"instance_type_family": "ecs.t5",
"memory_size": 4.0
},
{
"cpu_core_count": 2,
"id": "ecs.t5-lc1m4.large",
"instance_type_family": "ecs.t5",
"memory_size": 8.0
}
The fourth module of the playbook fetch the different types of instances based on the instance type ids.
Task 3: Creating Disk and Attaching the Disk to a Specific Instance
When additional storage needs to be attached to the instance created, we can create a disk through Ansible.
Creating a disk
The below playbook depicts the way for creating a disk in the specified region.
createdisk.yml
- name: create disk
hosts: localhost
connection: local
vars:
alicloud_access_key: "XXXXXXXX"
alicloud_secret_key: "XXXXXXXXX"
alicloud_region: "ap-southeast-1"
alicloud_zone: "ap-southeast-1b"
disk_name: "Testing"
disk_category: "cloud_efficiency"
size: 50
disk_tags:
- tag_key: create_test_1
tag_value: '0.01'
state: present
tasks:
- name: create disk
alicloud_disk:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
alicloud_zone: '{{ alicloud_zone }}'
disk_name: '{{ disk_name }}'
disk_category: '{{ disk_category }}'
size: '{{ size }}'
disk_tags: '{{ disk_tags }}'
state: '{{ state }}'
register: creatediskresult
- debug: var=creatediskresult
When executing the playbook for creating disk,
The disk named testing have been created is reflected in the console.
Attaching a disk to the instance
This playbook will explain how to attach the disk to the specified instance.
- name: Adding a disk to an ECS instance
hosts: localhost
vars:
state: present
alicloud_access_key: "XXXXXXXXXX"
alicloud_secret_key: "XXXXXXXXX"
alicloud_region: "ap-southeast-1"
alicloud_zone: "ap-southeast-1b"
instance_id: "i-t4nh8623mgcdfbcacqi2"
disk_id: "d-t4n3s6w46jbd5gyxeqwk"
delete_with_instance: no tasks:
- name: Attaching disk
alicloud_disk:
state: '{{ state }}'
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
alicloud_zone: '{{ alicloud_zone }}'
instance_id: '{{ instance_id }}'
disk_id: '{{ disk_id }}'
delete_with_instance: '{{ delete_with_instance }}'
register: attachingdiskresult
- debug: var=attachingdiskresult
The screenshots depicts the output for executing this playbook and getting reflected in the console.
Fetching details about the disk
This playbook describes the details to be gathered about a disk.
- name: fetch disk details example
hosts: localhost
vars:
alicloud_access_key: "XXXXXXXX"
alicloud_secret_key: "XXXXXXXXXX"
alicloud_region: "ap-southeast-1"
alicloud_zone: "ap-southeast-1b" tasks:
- name: Find all disks in the specified region
alicloud_disk_facts:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_zone: "{{ alicloud_zone }}"
alicloud_region: "{{ alicloud_region }}"
register: all_disks
- debug: var=all_disks - name: Find all disks based on the specified ids
alicloud_disk_facts:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_zone: "{{ alicloud_zone }}"
alicloud_region: "{{ alicloud_region }}"
disk_ids:
- "d-t4n3s6w46jbd5gyxeqwk"
- "d-t4n9gyct1a1r21xx4s6v"
register: disks_by_ids
- debug: var=disks_by_ids - name: Find all disks based on the specified names/name-prefixes
alicloud_disk_facts:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_zone: "{{ alicloud_zone }}"
alicloud_region: "{{ alicloud_region }}"
disk_ids:
- "d-t4n3s6w46jbd5gyxeqwk"
- "d-t4n6311wylqzlp9kjr5x"
disk_names:
- "Testing"
register: disks_by_names
- debug: var=disks_by_names
Summary
Thus, we have explored about automation with cloud infrastructure focused mainly on Alibaba Cloud Elastic Compute Service (ECS). We have seen about the following starting, stopping, deleting and restarting instance in the specified region, fetching and gathering facts about the instance in the specified region and creating disk and attaching the disk to a specific instance. For further details about automation cloud refer to the upcoming articles.