Install and Run Mongodb using Ansible
Tags: ansible, devops, mongodb
Published: 2021-08-23 11:22:31

#Introduction
As a person who has to do several on-premise deployments, at a place where docker is not accepted yet, I have had several issues installing mongodb. Even if I am installing it in the same environment, or upgrading it, I face several problems regarding permissions, ownerships, lockfiles etc. 
In this article I will share an automated way through which you can install mongodb (version 4.2). Yes, we will be using ansible.

##Pre-requisites
You need to have [ansible](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) installed on your system.

##Hosts
When you run an ansible-playbook command, you may or may not mention the host file which has the all the required host information. Lets create a new file named mongo-hosts and enter name of all the servers on which you need mongodb installed
### mongo-hosts
```
[local]
localhost       ansible_connection=local

[mongo-server-1]
XX.YY.ZZ.AA   ansible_connection=ssh  ansible_user=user

[mongo-server-2]
XX.YY.ZZ.BB   ansible_connection=ssh ansible_user=user

[mongo-servers:children]
local
mongo-server-1
mongo-server-2

```
We have mentioned all the instances, with their connection type and username. 
Here you can see that I have grouped all the servers at the end. So anywhere mongo-servers is mentioned in playbook,All the child instances will be considered. 


##Playbook - mongo-playbook.yml
```
- hosts: mongo-servers
  become: true
  serial: 1

  tasks:
    - name: Install aptitude using apt
      apt:
        name: aptitude
        state: latest
        update_cache: yes

    - name: Import public key
      apt_key:
        url: 'https://www.mongodb.org/static/pgp/server-4.2.asc'
        state: present

    - name: Add repository
      apt_repository:
        filename: '/etc/apt/sources.list.d/mongodb-org-4.2.list'
        repo: 'deb https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse'
        state: present
        update_cache: yes

    - name: Install mongoDB
      apt:
        name: mongodb-org
        state: present
        update_cache: yes

    - name: Ensure mongodb is running and and enabled to start automatically on reboots
      service:
        name: mongod
        enabled: yes
        state: started

```
So here as we can see 
* hosts represent the instances on which this playbook will run. 
* [become](https://docs.ansible.com/ansible/latest/user_guide/become.html) parameter is a privilege escalation setting as some commands we would only be able to run if the user is sudo. **Note:** These commands are only possible if the user through which ansible logs into the server is a sudo user.
* [serial](https://docs.ansible.com/ansible/latest/user_guide/playbooks_strategies.html) parameter is for controlling how the playbook will be executed. In our case, this would mean that we are going to run the playbook on all the servers serially. 
* tasks are the steps that ansible will take on each server. These are the commands that we generally run to install mongodb manually. 


## Execution: 
```
ansible-playbook mongo-playbook.yml -vvvv -i ./mongo-hosts 
```
-vvvv is used to run the ansible playbook in verbose mode. 
If we dont mention the hosts file(using i flag) , ansible-playbook will pick from the default one. In case of Ubuntu, that is /var/ansible/hosts 


And thats it! This is a really basic case which only touches a simple installation. Let me know if you need examples of more complex ones (Primary,secondary,arbiter or the same using docker)