AWSLearn how to create a sipXcom-based AMI

This is Part 2 of the blog series that will teach you how to deploy sipXcom in AWS DevOps style. In Part 1 of the blog series we learn how to provision a minimal CentOS machine with Ansible-AWS. We launched a CentOS prepared EC2 instance that we will now use to create our own sipXcom AMI. So let’s get started:

Step 1. Connect to AWS console and gather needed facts for Ansible.

Under Services – EC2 – Running Instance – menu we will see something like:

centOS picture

Click on your newly created instance and collect “instance_id” and “public_ip”:

AWS

In our demo: instance_id = i-8b3a21b5 and public_ip = 52.210.220.252

Step 2. Configure Ansible to use gathered information from the above step

pwd

~/Ansible_AWS_SipXcom

I like to keep ansible.cfg and inventory.ini in the current path.

[code lang=”bash”]
ls -l
-rw-rw-r– 1 mihai mihai 55 Aug 23 11:31 ansible.cfg
drwxrwxr-x 2 mihai mihai 4096 Sep 2 13:02 files
-rw-rw-r– 1 mihai mihai 51 Aug 24 08:54 inventory.ini
-rw-rw-r– 1 mihai mihai 725 Sep 2 12:49 provision.yml
-rw-rw-r– 1 mihai mihai 811 Sep 2 12:44 sipxcom_template.yml

cat ansible.cfg
[defaults]
hostfile = inventory.ini
remote_user = root
[/code]

We next need to add an AWS group to our inventory.ini where we will define the public_ip of the newly created CentOS template

[code lang=”bash”]
cat inventory.ini
[aws]
52.210.220.252 ansible_ssh_private_key_file=~/.ssh/devops-key.pem
[/code]

Note the need of private key to connect to AWS instance. We have generated this key in Part 1 under AWS console — key pair — devops-key.

Next we will add instance_id in the files/info.yml

[code lang=”bash”]
cd files
cat info.yml
standard_ami: ami-edb9069e
sipxcom_ami: ami-e3f1d694
tiny_instance: t1.micro
free_instance: t2.micro
large_instance: m4.large
ssh_keyname: devops-key
Inst_id: i-8b3a21b5
template_id:
secgroup_id: sg-9a-**********
[/code]

Step 3. Make a new Ansible playbook to create sipXcom template

First let’s download sipxcom.repo that we will use to install sipXcom
pwd
~/Ansible_AWS_SipXcom/files

[code lang=”bash”]
wget http://download.sipxcom.org/pub/sipXecs/16.02/sipxecs-16.02.0-centos.repo && mv sipxecs*sipxcom.repo
[/code]

[code lang=”bash”]
ls -l
-rw-rw-r– 1 mihai mihai 101 Aug 30 20:45 awscreds.yml
-rw-rw-r– 1 mihai mihai 209 Sep 2 13:11 info.yml
-rw-rw-r– 1 mihai mihai 161 Mar 21 09:24 sipxcom.repo

cd ..
[/code]

pwd
~/Ansible_AWS_SipXcom

Now we will create an ansible playbook called sipxcom_template.yml with the following content:

[code lang=”xml”]
cat sipxcom_template.yml

– hosts: aws # connect to the aws hosts defined in inventory.ini as root
remote_user: root
gather_facts: yes
connection: ssh
tasks:
– name: Copy sipxcom.repo in /etc/yum.repos.d
copy: src=files/sipxcom.repo dest=/etc/yum.repos.d/sipxcom.repo
– name: Installing sipxcom. Go get a coffee. It will take a while
yum: name=sipxcom state=present # install sipXcom repo after we’ve copy it

– hosts: localhost #execute locally AWS api commands section to create sipxcom AMI
connection: local
remote_user: devops
gather_facts: no
vars_files:
– files/awscreds.yml
– files/info.yml
tasks:
– name: Basic provisioning of sipXcom AMI
ec2_ami: # Note we are using ec2_ami module
aws_access_key: "{{ aws_id }}"
aws_secret_key: "{{ aws_key }}"
region: "{{ aws_region }}"
instance_id: "{{ inst_id }}"
wait: no
name: sipXcom_AMI
tags:
Name: sipXcom_16.02
Service: sipXcom_UC_server
register: instance
– name: Print the results
debug: var=instance
[/code]

Step 4. Execute ansible-playbook command and visualize the newly created sipXcom template

pwd
~/Ansible_AWS_SipXcom/

[code lang=”bash”]
ansible-playbook sipxcom_template.yml
[/code]

PLAY [aws] *********************************************************************

TASK [setup] *******************************************************************
ok: [52.210.220.252]

TASK [Copy sipxcom.repo in /etc/yum.repos.d] ***********************************
changed: [52.210.220.252]

TASK [Installing sipxcom. Go get a coffee. It will take a while] ********************************************************
changed: [52.210.220.252]

PLAY [localhost] ***************************************************************

TASK [Basic provisioning of sipXcom AMI] ***************************************
changed: [localhost]

TASK [Print the results] *******************************************************
ok: [localhost] => {
“instance”: {
“architecture”: “x86_64”,
“block_device_mapping”: {
“/dev/sda1”: {
“delete_on_termination”: false,
“encrypted”: false,
“size”: 8,
“snapshot_id”: “snap-dc188531”,
“volume_type”: “standard”
}
},
“changed”: true,
“creationDate”: “2016-09-02T10:52:49.000Z”,
“description”: null,
“hypervisor”: “xen”,
“image_id”: “ami-a8681adb”,
“is_public”: false,
“location”: “541233277246/sipXcom_AMI”,
“msg”: “AMI creation operation complete”,
“ownerId”: “541233277246”,
“root_device_name”: “/dev/sda1”,
“root_device_type”: “ebs”,
“state”: “available”,
“tags”: {},
“virtualization_type”: “hvm”
}
}

PLAY RECAP *********************************************************************
52.210.220.252 : ok=3 changed=2 unreachable=0 failed=0
localhost : ok=2 changed=1 unreachable=0 failed=0

Now let’s see our new shiny sipXcom based AMI.

Connect to AWS console and under AMI sub-menu:
AMI

You should have an entry like this:
sipxcom

Stay tuned for Part 3 where we will create an EC2 instance from sipXcom template and configure newly launched server

In case you missed it, in Part 1 of the blog series we learn how to provision a minimal CentOS machine with Ansible-AWS.