When writing Ansible roles I occasionally want a way to just run a role from the command line, without having to muck about with a playbook. I’ve seen similar requests on the mailing lists and on irc.

I’ve thrown together a quick wrapper that will allow you (and me!) to do exactly that, called ansible-role. The --help output looks like this:

usage: ansible-role [-h] [--verbose] [--gather] [--no-gather]
                    [--extra-vars EXTRA_VARS] [-i INVENTORY] [--hosts HOSTS]
                    [--sudo] [--become] [--user USER]
                    role

positional arguments:
  role

optional arguments:
  -h, --help            show this help message and exit
  --verbose, -v
  --gather, -g
  --no-gather, -G
  --extra-vars EXTRA_VARS, -e EXTRA_VARS

Inventory:
  -i INVENTORY, --inventory INVENTORY
  --hosts HOSTS, -H HOSTS

Identity:
  --sudo, -s
  --become, -b
  --user USER, -u USER

Example

If you have a role roles/testrole that contains the following in tasks/main.yml:

- name: figure out who I am
  command: whoami
  register: whoami

- name: show who I am
  debug:
    msg: "I am {{whoami.stdout}}"

You could run it like this:

$ ansible-role testrole -i localhost,

Which would get you:

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [localhost -> localhost]

TASK [testrole : figure out who I am] ******************************************
changed: [localhost -> localhost]

TASK [testrole : show who I am] ************************************************
ok: [localhost -> localhost] => {
    "changed": false, 
    "msg": "I am lars"
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0   

You can use the -b (formerly -s) flag to enable privilege escalation via sudo:

$ ansible-role testrole -i localhost, -s

Which will work as expected:

TASK [testrole : show who I am] ************************************************
ok: [localhost -> localhost] => {
    "changed": false, 
    "msg": "I am root"
}

The ansible-role command does not currently provide proxy arguments for all of the options supported by ansible-playbook, but hopefully it supports enough to be useful. If you have bug reports or pull requests, feel free to leave them on the GitHub repository.