Automate dockerization of webserver using Ansible

What is Docker?

Docker is a set of platform as a service products that use OS-level virtualization to deliver software in packages called containers. Containers are isolated from one another and bundle their own software, libraries and configuration files; they can communicate with each other through well-defined channels

So, What are we going to deploy here?

We are going to write a playbook that’s gonna perform the following tasks:-

🔅 Configure Docker
🔅 Start and enable Docker services
🔅 Pull the httpd server image from the Docker Hub
🔅 Run the httpd container and expose it to the public
🔅 Copy the html code in /var/www/html directory and start the web server

Firstly check if ansible is installed or not

ansible --version

Next create a ansible.cfg file with the following content:

[defaults]
inventory=inventory
host_key_checking=False
command_warnings=False

Create the inventory containing the IP of the managed node in the same directory as of ansible.cfg file.

<IP of managed node> ansible_ssh_user=root ansible_ssh_pass=password

Once Ansible is successfully configured, we can go on with creating the ansible playbook: —

---
- name: Setup docker on managed node
hosts: all
tasks:
- name: Configure docker repo
yum_repository:
name: docker
description: Yum repo for docker
baseurl: https://download.docker.com/linux/centos/7/x86_64/stable/
gpgcheck: no
- name: Install docker
command: yum install docker-ce --nobest -y
- name: Install python3
package:
name: python3
state: present
- name: Install docker SDK
pip:
name: docker-py
- name: Start and enable docker service
service:
name: docker
state: started
enabled: yes
- name: Pull docker image
docker_image:
name: httpd
source: pull
- name: Create workspace directory
file:
path: /root/Task10/web
state: directory
- name: Copy webpage content
copy:
content: "<h1>This webpage is configured inside a docker container deployed using Ansible.</h1>"
dest: /root/Task10/web/index.html
- name: Allow port through firewall
firewalld:
port: 8081/tcp
permanent: yes
immediate: yes
state: enabled
- name: Run a docker container
docker_container:
name: webos
image: httpd
state: present
exposed_ports:
- 80/tcp
- 80/udp
published_ports:
- 0.0.0.0:8081:80/tcp
- 0.0.0.0:8081:80/udp
volumes:
- /root/Task10/web/:/usr/local/apache2/htdocs/

Let’s deploy the playbook now —

ansible-playbook <playbook_name>.yml

So, let’s check whether the webserver has been containerized or not —

http://<IP of managed node>:8081

Deployment successful !!

THNAK YOU!!