Overview

One of cool things that Ansible can do is to clone a git repository and that’s what we’ll be talking about in this article - how to clone a git repository with Ansible.

This enables us to have an automated solution for various setup processes(ie, downloading and setting up a dev environment on a remote location, need of download a script that needs to execute after the git repo is cloned, etc… ).

Now let’s go through the process and see what we need in order to achieve this.

Requirements:

  • Ansible installed
  • Git installed
  • Python 3 or newer
  • Sudo user access

Clone a Git repository with Ansible

The code template we’ll be using is the following:

---
- hosts: all
  become: true
  tasks:
  - name: Ensure that git is installed
    dnf:
      name: git
      state: present

  - name: Clone the Git repository
    git:
      repo: https://github.com/user/repo.git
      dest: /path/to/destination
      clone: yes

I run Fedora, so that’s why I’m using the dnf module in the code. You need to change to the packager manager you’re using or you can exclude this block of code entirely, it’s up to you.

One important note for the git repo destination path - Ansible will not create the directory and place the git files in the newly created folders as the git tool does automatically. It will throw an error that the destination is not empty and that it requires an empty directory.

So, in order to successfully clone a git repository with Ansible, we need to create a new empty directory and set the full path of the directory as a destination path in Ansible.

pic 1 - setup

Clone a repository on a local machine

Let’s first check out how to clone a git repository on a localhost. For an example, I’ll be cloning one of my github repos to my Fedora laptop. The code will look like this:

---
- hosts: localhost
  become: true
  tasks:
  - name: Ensure that git is installed
    dnf:
      name: git
      state: present

  - name: Clone the Git repository
    git:
      repo: https://github.com/markonisic/wp-deploy
      dest: /home/markon/Documents/Ansible_Git_Clone/GIT_REPO/
      clone: yes

Clone a git repository with ansible

And when I run the playbook this should be the end result:

Clone a git repository with ansible

In the command I executed, I added arguments for the user and for Ansible to prompt for the sudo password.

And in the directory I created for the destination path, a git repo is cloned.

Clone a repository to a remote destination

Now that we know how to clone a git repository with Ansible on a local machine, let’s see if it works on a remote machine, meaning we now want to clone a git repo with Ansible to a remote server.

The code I’ll be testing:

---
- hosts: all
  become: true
  tasks:
  - name: Ensure that git is installed
    dnf:
      name: git
      state: present

  - name: Clone the Git repository
    git:
      repo: https://github.com/markonisic/wp-deploy
      dest: /home/markon/git-repo
      clone: yes

Clone a git repository with ansible

The code is pretty similar. The difference here is that we need to create an inventory file and within the file to define our remote machine and add couple of more arguments on our Ansible command in order to use the inventory and execute the playbook remotely.

[remote-machine]
192.168.122.113

The command we need to run:

ansible-playbook -u markon -k -K -i inventory git_clone.yml

In the command I added the “-k” option to provide Ansible with the SSH password and with the “-i” to define the inventory file which Ansible needs to use and reads the IP address of the remote machine.

Again, after you execute the playbook, this should be end result.

Clone a git repository with ansible

Summary

Let’s review what we covered in this article - we discovered that we are able to clone a git repository with Ansible, allowing us to automate the process. We also that learned that Ansible is capable of cloning a git repo locally and remotely as well which gives multiple case scenarios to use this feature.

Thank your for taking time to read the article, hope you find it interesting.