Every time that I do a clean install on my machine it takes a few hours till I get to point where I was before formatting it, install all packages, select themes, icons, fonts, install IDEs, extensions and so on. After doing it a few times I came to the conclusion that I would save time by spending time automating this chore, and as a result, I could tinker a little more with my system and not worry about spending a weekend re-installing everything (which have happened more time that I'd like to remember).

So after a few attempts using python and bash I ended with many files and keep everything organized and concise turned out to be more tedious than the setup itself. So there comes Ansible. It is an enterprise-graded software used to automate tasks. It has A LOT OF features and it can be really helpful if you're a sysadmin but for now we're going to focuson Ansible Pull and Playbooks . As better described:

[Ansible-Pull] is used to up a remote copy of ansible on each managed node, each set to run via cron and update playbook source via a source repository. This inverts the default push architecture of Ansible into a pull architecture, which has near-limitless scaling potential. Playbooks are Ansible’s configuration, deployment, and orchestration language. They can describe a policy you want your remote systems to enforce, or a set of steps in a general IT process. (source)

The goal is to pull and run a playbook remotely using a git repository. The playbook will describe the tasks needed to setup our machine from scratch.
But first lets tinker a bit a with playbooks locally with ansible-playbook, to do so we need to add localhost to ansible's hosts list. Add it to /etc/ansible/hosts:

[all]
localhost

As an experiment we're going to write a asks to install vim. Currently, I'm using Fedora thus we going to use dnf modeule to install packages, but if you're using another distribution look for a equivalent module like apt module for Ubuntu. The playbook to install is quite simple:

# main.yaml
- hosts: all
  tasks:
     - name: install vim
       dnf:
         name: vim
         state: latest
host
it is required and it has to match our hosts otherwise the playbook won't run.
taks
it is the list of tasks that the playbook will perform, in this case will be dnf install vim.

To run a playbook use the command ansible-playbook commando to run main.yml direct from disk, do to so just run the following command:

sudo ansible-playbook --connection=local main.yml

After a few seconds, vim will be installed on your machine.

PLAY [all] *************************************************************

TASK [Gathering Facts] *************************************************
ok: [localhost]

TASK [install vim] *****************************************************
ok: [localhost]

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

This is the first step, next part we shall create a more complex playbook and setup repository to run it remotely using ansible-pull.