23.DevOps: How to install Ansible on Ubuntu [Linux] VM ?

 

ansible-logo.png

In this blog, I would like to demonstrate  “Installing Ansible on Ubuntu VM”.

At the End of this blog you can see the demonstrated Video.

Let us follow the below steps:

Step 1:
To get Ansible for Ubuntu is to add the project’s PPA (personal package archive) to ubuntu system.
We can add the Ansible PPA by typing the following command:

$sudo apt-add-repository ppa:ansible/ansible

=== Screen output ====>
vskumar@ubuntu:~$
vskumar@ubuntu:~$ sudo apt-add-repository ppa:ansible/ansible
[sudo] password for vskumar:
Ansible is a radically simple IT automation platform that makes your applications and systems easier to deploy.
Avoid writing scripts or custom code to deploy and update your applications— automate in a language that
approaches plain English, using SSH, with no agents to install on remote systems.

http://ansible.com/
More info: https://launchpad.net/~ansible/+archive/ubuntu/ansible
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmpzhb6yoiy/secring.gpg’ created
gpg: keyring `/tmp/tmpzhb6yoiy/pubring.gpg’ created
gpg: requesting key 7BB9C367 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpzhb6yoiy/trustdb.gpg: trustdb created
gpg: key 7BB9C367: public key “Launchpad PPA for Ansible, Inc.” imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
OK
vskumar@ubuntu:~$
========= Added Ansible to PPA ===>
Step 2:
Now, let us refresh ubuntu [VM] system package index, so that it is aware of the packages available in the PPA.
Then, we can install the software.
We need to follow the below commands:
$sudo apt-get update
$sudo apt-get install ansible
==== Update package=======>
vskumar@ubuntu:~$ sudo apt-get update
Get:1 http://ppa.launchpad.net/ansible/ansible/ubuntu xenial InRelease [18.0 kB]
Hit:2 https://download.docker.com/linux/ubuntu xenial InRelease
Hit:3 http://archive.ubuntu.com/ubuntu xenial InRelease
Hit:4 http://ppa.launchpad.net/webupd8team/java/ubuntu xenial InRelease
Get:5 http://ppa.launchpad.net/ansible/ansible/ubuntu xenial/main amd64 Packages [540 B]
Ign:6 https://pkg.jenkins.io/debian-stable binary/ InRelease
Get:7 http://ppa.launchpad.net/ansible/ansible/ubuntu xenial/main i386 Packages [540 B]
Hit:8 https://pkg.jenkins.io/debian-stable binary/ Release
Get:10 http://ppa.launchpad.net/ansible/ansible/ubuntu xenial/main Translation-en [344 B]
Fetched 19.5 kB in 2s (7,857 B/s)
Reading package lists… Done
vskumar@ubuntu:~$
===== Updated =====>

Step 3:
Now, let us install Ansible as below:
==== Installing Ansible =====>
vskumar@ubuntu:~$ sudo apt-get install ansible
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following additional packages will be installed:
python-ecdsa python-httplib2 python-jinja2 python-markupsafe python-paramiko
sshpass
Suggested packages:
python-jinja2-doc
The following NEW packages will be installed:
ansible python-ecdsa python-httplib2 python-jinja2 python-markupsafe
python-paramiko sshpass
0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded.
Need to get 3,001 kB of archives.
After this operation, 24.1 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-markupsafe amd64 0.23-2build2 [15.5 kB]
Get:2 http://ppa.launchpad.net/ansible/ansible/ubuntu xenial/main amd64 ansible all 2.4.3.0-1ppa~xenial [2,690 kB]
Get:3 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-jinja2 all 2.8-1 [109 kB]
Get:4 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-ecdsa all 0.13-2 [34.0 kB]
Get:5 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-paramiko all 1.16.0-1 [109 kB]
Get:6 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-httplib2 all 0.9.1+dfsg-1 [34.2 kB]
Get:7 http://archive.ubuntu.com/ubuntu xenial/universe amd64 sshpass amd64 1.05-1 [10.5 kB]
Fetched 3,001 kB in 9s (306 kB/s)
Selecting previously unselected package python-markupsafe.
(Reading database … 218383 files and directories currently installed.)
Preparing to unpack …/python-markupsafe_0.23-2build2_amd64.deb …
Unpacking python-markupsafe (0.23-2build2) …
Selecting previously unselected package python-jinja2.
Preparing to unpack …/python-jinja2_2.8-1_all.deb …
Unpacking python-jinja2 (2.8-1) …
Selecting previously unselected package python-ecdsa.
Preparing to unpack …/python-ecdsa_0.13-2_all.deb …
Unpacking python-ecdsa (0.13-2) …
Selecting previously unselected package python-paramiko.
Preparing to unpack …/python-paramiko_1.16.0-1_all.deb …
Unpacking python-paramiko (1.16.0-1) …
Selecting previously unselected package python-httplib2.
Preparing to unpack …/python-httplib2_0.9.1+dfsg-1_all.deb …
Unpacking python-httplib2 (0.9.1+dfsg-1) …
Selecting previously unselected package sshpass.
Preparing to unpack …/sshpass_1.05-1_amd64.deb …
Unpacking sshpass (1.05-1) …
Selecting previously unselected package ansible.
Preparing to unpack …/ansible_2.4.3.0-1ppa~xenial_all.deb …
Unpacking ansible (2.4.3.0-1ppa~xenial) …
Processing triggers for man-db (2.7.5-1) …
Setting up python-markupsafe (0.23-2build2) …
Setting up python-jinja2 (2.8-1) …
Setting up python-ecdsa (0.13-2) …
Setting up python-paramiko (1.16.0-1) …
Setting up python-httplib2 (0.9.1+dfsg-1) …
Setting up sshpass (1.05-1) …
Setting up ansible (2.4.3.0-1ppa~xenial) …
vskumar@ubuntu:~$
=== Ansible installation is done! ====>

Step 4:
Let us add the below python properties  also:

sudo apt-get install python-software-properties
== Installing python properties =======>
vskumar@ubuntu:/etc/ansible$ sudo apt-get install python-software-properties
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following additional packages will be installed:
python-apt python-pycurl
Suggested packages:
python-apt-dbg python-apt-doc libcurl4-gnutls-dev python-pycurl-dbg
python-pycurl-doc
The following NEW packages will be installed:
python-apt python-pycurl python-software-properties
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 202 kB of archives.
After this operation, 927 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-apt amd64 1.1.0~beta1build1 [139 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-pycurl amd64 7.43.0-1ubuntu1 [43.3 kB]
Get:3 http://archive.ubuntu.com/ubuntu xenial/universe amd64 python-software-properties all 0.96.20 [20.1 kB]
Fetched 202 kB in 1s (181 kB/s)
Selecting previously unselected package python-apt.
(Reading database … 220895 files and directories currently installed.)
Preparing to unpack …/python-apt_1.1.0~beta1build1_amd64.deb …
Unpacking python-apt (1.1.0~beta1build1) …
Selecting previously unselected package python-pycurl.
Preparing to unpack …/python-pycurl_7.43.0-1ubuntu1_amd64.deb …
Unpacking python-pycurl (7.43.0-1ubuntu1) …
Selecting previously unselected package python-software-properties.
Preparing to unpack …/python-software-properties_0.96.20_all.deb …
Unpacking python-software-properties (0.96.20) …
Setting up python-apt (1.1.0~beta1build1) …
Setting up python-pycurl (7.43.0-1ubuntu1) …
Setting up python-software-properties (0.96.20) …
vskumar@ubuntu:/etc/ansible$
===== Installed python properties ======>

Step 5:
Let us check the version:
=== Checking ANSIBLE Version ===>
vskumar@ubuntu:~$ ansible –version
ansible 2.4.3.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u’/home/vskumar/.ansible/plugins/modules’, u’/usr/share/ansible/plugins/modules’]
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.12 (default, Dec 4 2017, 14:50:18) [GCC 5.4.0 20160609]
vskumar@ubuntu:~$
=============================>
It means from the above display it is confirmed ansible is available.

Step 6:
The ansible is on the below dir:

======= Check List of files ===>
vskumar@ubuntu:~$ ls -lha /etc/ansible
total 48K
drwxr-xr-x 4 root root 4.0K Mar 6 08:52 .
drwxr-xr-x 142 root root 12K Mar 6 05:59 ..
-rw-r–r– 1 root root 19K Jan 31 15:21 ansible.cfg
drwxr-xr-x 2 root root 4.0K Mar 6 08:59 group_vars
-rw-r–r– 1 root root 1.2K Mar 6 08:20 hosts
drwxr-xr-x 2 root root 4.0K Jan 31 19:46 roles
vskumar@ubuntu:~$
========================>

Step 7:
Always it is better we need to have backup of the above files in a folder.
Now let me copy all of them as below:
Make a backup of all the files as below :
== Making backup ====>

vskumar@ubuntu:~$ sudo cp -R /etc/ansible ansplatform1

vskumar@ubuntu:~$ cd ansplatform1
vskumar@ubuntu:~/ansplatform1$ ls
ansible.cfg group_vars hosts roles
vskumar@ubuntu:~/ansplatform1$
===== Backup files ====>

Step 8:
In the above dir, let us modify ansible.cfg
to have the below line uncommented:
inventory = hosts
====Modifying ansible.cfg ====>
vskumar@ubuntu:~/ansplatform1$ sudo vim ansible.cfg
vskumar@ubuntu:~/ansplatform1$
======>

You can see part of the file as below :
=== Part of config file to update ====>
vskumar@ubuntu:/etc/ansible$ ls
ansible.cfg group_vars hosts roles
vskumar@ubuntu:/etc/ansible$ vim ansible
vskumar@ubuntu:/etc/ansible$
vskumar@ubuntu:/etc/ansible$ vim ansible.cfg
vskumar@ubuntu:/etc/ansible$

Updated line:
inventory = /etc/ansible/hosts

== Updated area only ===>

Step 9:

Configuring Ansible Hosts:
Ansible keeps track of all of the servers.
It knows about them through a “hosts” file.
We need to set up this file first, before we can begin to
communicate with our other computers.
Now let us see the current content of hosts file:
Using : $sudo cat /etc/ansible/hosts

====== The default Contents of hosts file ===>
vskumar@ubuntu:~$ sudo cat /etc/ansible/hosts
# This is the default ansible ‘hosts’ file.
#
# It should live in /etc/ansible/hosts
#
# – Comments begin with the ‘#’ character
# – Blank lines are ignored
# – Groups of hosts are delimited by [header] elements
# – You can enter hostnames or ip addresses
# – A hostname/ip can be a member of multiple groups

# Ex 1: Ungrouped hosts, specify before any group headers.

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10

# Ex 2: A collection of hosts belonging to the ‘webservers’ group

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts following a pattern you can specify
# them like this:

## www[001:006].example.com

# Ex 3: A collection of database servers in the ‘dbservers’ group

## [dbservers]
##
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57

# Here’s another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com

vskumar@ubuntu:~$
==================>

We can see a file that has a lot of example configurations,
none of them will actually work for us since these hosts are made up.
So to start with, let’s make sure they all are commented out on the
lines in this file by adding a “#” before each line.

We will keep these examples in the file only as they were to help us with
configuration.

If we want to implement more complex scenarios in the future these can be reused.

After making sure all of these lines are commented,
we can start adding our hosts in the hosts file.
To do our lab exercise;
Now, we need to identify our local hosts.
You can check your laptop or desktop ip as one host.
Another host you consider your ubuntu VM, where the current Ansible is configured.
For now, let us work with two hosts only.
In my systems:
To identify my ubuntu host1:
====== ifconfig =====>

vskumar@ubuntu:~$ ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:06:95:ca:2d
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

ens33 Link encap:Ethernet HWaddr 00:0c:29:f8:40:61
inet addr:192.168.116.129 Bcast:192.168.116.255 Mask:255.255.255.0
inet6 addr: fe80::2fed:4aa:a6:34ad/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3621 errors:0 dropped:0 overruns:0 frame:0
TX packets:1342 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5111534 (5.1 MB) TX bytes:112090 (112.0 KB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:530 errors:0 dropped:0 overruns:0 frame:0
TX packets:530 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:47656 (47.6 KB) TX bytes:47656 (47.6 KB)

vskumar@ubuntu:~$
=======================>
I need to consider  my base ubuntu VM is as ‘192.168.116.129’
Hence my host1=192.168.116.129 from ens33
You can also check your VM IP.

Now, let me check my local host [laptop] ip:

====== IPCONFIG info from Laptop CMD =====>
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::197c:6a85:f86:a3e4%20
IPv4 Address. . . . . . . . . . . : 192.168.137.1
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
======================>
Let me check the ip connection from my Ubuntu VM.
=== Testing laptop ip from VM ====>
vskumar@ubuntu:~$ ping 192.168.137.1
PING 192.168.137.1 (192.168.137.1) 56(84) bytes of data.
64 bytes from 192.168.137.1: icmp_seq=1 ttl=128 time=3.89 ms
64 bytes from 192.168.137.1: icmp_seq=2 ttl=128 time=1.15 ms
64 bytes from 192.168.137.1: icmp_seq=3 ttl=128 time=1.19 ms
64 bytes from 192.168.137.1: icmp_seq=4 ttl=128 time=1.38 ms
64 bytes from 192.168.137.1: icmp_seq=5 ttl=128 time=1.15 ms
64 bytes from 192.168.137.1: icmp_seq=6 ttl=128 time=1.26 ms
64 bytes from 192.168.137.1: icmp_seq=7 ttl=128 time=1.13 ms
64 bytes from 192.168.137.1: icmp_seq=8 ttl=128 time=1.13 ms
64 bytes from 192.168.137.1: icmp_seq=9 ttl=128 time=1.39 ms
64 bytes from 192.168.137.1: icmp_seq=10 ttl=128 time=1.29 ms
64 bytes from 192.168.137.1: icmp_seq=11 ttl=128 time=1.26 ms
64 bytes from 192.168.137.1: icmp_seq=12 ttl=128 time=1.14 ms
64 bytes from 192.168.137.1: icmp_seq=13 ttl=128 time=1.22 ms
64 bytes from 192.168.137.1: icmp_seq=14 ttl=128 time=1.37 ms
64 bytes from 192.168.137.1: icmp_seq=15 ttl=128 time=1.14 ms
^C
— 192.168.137.1 ping statistics —
15 packets transmitted, 15 received, 0% packet loss, time 14032ms
rtt min/avg/max/mdev = 1.134/1.411/3.899/0.672 ms
vskumar@ubuntu:~$
==========>
Now, I consider my host2 = 192.168.137.1

Let me ping my VM from Laptop CMD:
==== Pinging Ubuntu IP from CMD prompt =====>
C:\Users\Toshiba>ping 192.168.116.129

Pinging 192.168.116.129 with 32 bytes of data:
Reply from 192.168.116.129: bytes=32 time=2ms TTL=64
Reply from 192.168.116.129: bytes=32 time<1ms TTL=64
Reply from 192.168.116.129: bytes=32 time<1ms TTL=64
Reply from 192.168.116.129: bytes=32 time<1ms TTL=64

Ping statistics for 192.168.116.129:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 2ms, Average = 0ms

C:\Users\Toshiba>
====== Replied VM ====>

It means both hosts are working fine.
Now, below block we should add to our hosts file to connect them:

[servers]
host1 ansible_ssh_host=192.168.116.129
host2 ansible_ssh_host=192.168.137.1
We can consider two groups from these two hosts.
Let me check the files as below:
==== List the current files ====>

vskumar@ubuntu:/etc/ansible$ ls -l
total 28
-rw-r–r– 1 root root 19155 Jan 31 15:21 ansible.cfg
-rw-r–r– 1 root root 1016 Jan 31 15:21 hosts
drwxr-xr-x 2 root root 4096 Jan 31 19:46 roles
vskumar@ubuntu:/etc/ansible$
===============================>

Now, let me update the host file.
=== After adding the content of hosts file ===>
vskumar@ubuntu:/etc/ansible$ sudo vim hosts
[sudo] password for vskumar:
Sorry, try again.
[sudo] password for vskumar:
vskumar@ubuntu:/etc/ansible$
vskumar@ubuntu:/etc/ansible$ tail -10 hosts

# Here’s another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com

[servers]
host1 ansible_ssh_host=192.168.116.129
host2 ansible_ssh_host=192.168.137.1
vskumar@ubuntu:/etc/ansible$
== You can see the lst 3 lines of the hosts file ===>

We also need to add the group name as below in the hosts file.

[group_name]
alias ansible_ssh_host=your_server_ip

Here, the group_name is an organizational tag that you will refer to any servers listed
under it with one word.
The alias is just a name to refer to that server.
Now let me add the above lines in hosts above the servers line as below.
[ansible_test1]
alias ansible_ssh_host=192.168.116.129
===== Hosts updated – latest ===>
vskumar@ubuntu:/etc/ansible$ sudo vim hosts
vskumar@ubuntu:/etc/ansible$
vskumar@ubuntu:/etc/ansible$ tail -10 hosts
# leading 0s:

## db-[99:101]-node.example.com
[ansible_test1]
alias ansible_ssh_host=192.168.116.129

[servers]
host1 ansible_ssh_host=192.168.116.129
host2 ansible_ssh_host=192.168.137.1

vskumar@ubuntu:/etc/ansible$
==============================>

Now let me goto ansible dir:
======>
vskumar@ubuntu:~$ cd /etc/ansible
vskumar@ubuntu:/etc/ansible$
======>

Assuming in our Ansible test scenario,
we are imagining that we have two servers we are going to control with Ansible.
These servers are accessible from the Ansible server by typing:
$ssh root@your_server_ip

Means as:
$ssh root@192.168.116.129

==============>
vskumar@ubuntu:/etc/ansible$ ssh root@192.168.116.129
ssh: connect to host 192.168.116.129 port 22: Connection refused
vskumar@ubuntu:/etc/ansible$
==============>
TROUBLE SHOOT THE HOSTS:
=== Trouble shoot ===>
vskumar@ubuntu:/etc/ansible$ ansible -m ping all
host1 | UNREACHABLE! => {
“changed”: false,
“msg”: “Failed to connect to the host via ssh: ssh: connect to host 192.168.116.129 port 22: Connection refused\r\n”,
“unreachable”: true
}
alias | UNREACHABLE! => {
“changed”: false,
“msg”: “Failed to connect to the host via ssh: ssh: connect to host 192.168.116.129 port 22: Connection refused\r\n”,
“unreachable”: true
}
host2 | UNREACHABLE! => {
“changed”: false,
“msg”: “Failed to connect to the host via ssh: \r\n ****USAGE WARNING****\r\n\r\nThis is a private computer system. This computer system, including all\r\nrelated equipment, networks, and network devices (specifically including\r\nInternet access) are provided only for authorized use. This computer system\r\nmay be monitored for all lawful purposes, including to ensure that its use\r\nis authorized, for management of the system, to facilitate protection against\r\nunauthorized access, and to verify security procedures, survivability, and\r\noperational security. Monitoring includes active attacks by authorized entities\r\nto test or verify the security of this system. During monitoring, information\r\nmay be examined, recorded, copied and used for authorized purposes. All\r\ninformation, including personal information, placed or sent over this system\r\nmay be monitored.\r\n\r\nUse of this computer system, authorized or unauthorized, constitutes consent\r\nto monitoring of this system. Unauthorized use may subject you to criminal\r\nprosecution. Evidence of unauthorized use collected during monitoring may be\r\nused for administrative, criminal, or other adverse action. Use of this system\r\nconstitutes consent to monitoring for these purposes.\r\n\r\n\r\nPermission denied (publickey,password,keyboard-interactive).\r\n”,
“unreachable”: true
}
vskumar@ubuntu:/etc/ansible$
===============>
The reason for the above error is;
With our current settings, we tried to connect to any of these hosts with Ansible,
the command failed.
This is because your SSH key is embedded for the root user on the remote systems
and Ansible will by default try to connect as your current user.
A connection attempt will get the above error.

To rectify it;
We can create a file that tells all of the servers in the “servers” group to connect
using the root user.

To do this, we will create a directory in the Ansible configuration structure called group_vars.
Let us use the below dir commands:
$sudo mkdir /etc/ansible/group_vars

========================>
vskumar@ubuntu:/etc/ansible$ sudo mkdir /etc/ansible/group_vars
vskumar@ubuntu:/etc/ansible$ ls -l
total 32
-rw-r–r– 1 root root 19155 Jan 31 15:21 ansible.cfg
drwxr-xr-x 2 root root 4096 Mar 6 08:52 group_vars
-rw-r–r– 1 root root 1158 Mar 6 08:20 hosts
drwxr-xr-x 2 root root 4096 Jan 31 19:46 roles
vskumar@ubuntu:/etc/ansible$
=================>
Within this folder, we can create YAML-formatted files for each group we want to configure.
By using below command:
$sudo vim /etc/ansible/group_vars/servers
We can put our configuration in here. YAML files start with “—“, so make sure you don’t forget that part.

Below Code:

ansible_ssh_user: root

==========>
udo vim /etc/ansible/group_vars/servers
vskumar@ubuntu:/etc/ansible$ cat /etc/ansible/group_vars/servers


ansible_ssh_user: root
vskumar@ubuntu:/etc/ansible$
=======================>

NOTE:
If you want to specify configuration details for every server, regardless of group association, you can put those details in a file at: 

/etc/ansible/group_vars/all.

Individual hosts can be configured by creating files under a directory at: /etc/ansible/host_vars.

Assuming this helped you to configure your Ansible.

Please leave your positive comment for others also to follow.

You can see next blog on ssh setup and usage from the below url:

https://vskumar.blog/2018/05/26/27-devopsworking-with-ssh-for-ansible-usage/

I have made a video for Ansible installation using Ubuntu 18.04 VM:

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s