×
Community Blog Automating Cloud Infrastructure with Ansible

Automating Cloud Infrastructure with Ansible

In this article, we will discuss about automation, how Ansible influences automation in cloud computing, and how to implement it on Alibaba Cloud ECS.

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.

  1. 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.
  2. 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.
  3. 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.

  1. Starting, stopping, deleting and restarting instance in the specified region
  2. Fetching and gathering facts about the instance in the specified region
  3. 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:

1

Executing the playbook is as follows:

[root@ogslab3 Alibaba]# ansible-playbook starting.yml

2

After running the playbook, the status of the ECS is as follows:

3

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:

4

Ansible output is as follows:

5

After running the playbook, the status of the instance in ecs console is as follows:

6

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:

7

8

9

10

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.

11

After releasing the instance, it will not be reflected in the console.

12

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,

13

The disk named testing have been created is reflected in the console.

14

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.

15

16

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.

1 2 1
Share on

Alibaba Clouder

2,605 posts | 747 followers

You may also like

Comments

Raja_KT March 20, 2019 at 4:44 pm

Nice sharing. Examples are good and we can copy and paste the codes.