Question: I'm trying to set up a server with ansible and I'd like to use [this galaxy role](https://github.com/geerlingguy/ansible-role-passenger).

It defines a [template](https://github.com/geerlingguy/ansible-role-passenger/blob/master/templates/passenger.j2) that I'd like to customize, but I don't know how.

Right now I defined the role into `requirements.yml` and I installed it using:

`ansible-galaxy install -r requirements.yml`

which installed the role somewhere on my system.

I tried by recreating the folder tree into my repository where I store my playbooks:

```
roles
  |- ansible-role-passenger
     |- templates
        |- passenger.j2

```

but it does not work. When I run my playbook, ansible uses the `passenger.j2` file from inside the galaxy role.

I think I can fork the galaxy role on github and just edit the file `passenger.j2` like I want, but I don't know if this is there is a "better" way to do it :)

Answer: 
Your findings are unfortunately true. Overriding a hardcoded template in a role from a calling playbook is merely impossible **unless the role's author implemented that as a feature**. Note that this is also true for simple files in the `files` directory.

The best way I have found so far: given that the role contains the default template in `templates/passenger.j2`, add a var in `default/main.yml` such as `passenger_config_template: passenger.j2` and use that var in the role. The user can then override that var in its playbook/inventory and use a different name for the template which will be fetched in an other role or directly in a `templates` directory at playbook level.

You can have a look at a [similar issue](https://github.com/geerlingguy/ansible-role-gitlab/issues/16) and [an accepted PR](https://github.com/geerlingguy/ansible-role-gitlab/pull/89/files) I once made to @geerlingguy on his ansible-role-gitlab. He might consider doing the same thing on his passenger role (or might accept your PR if you propose one).
@Zeitounator response helped me a lot, and I'd like to give more details here (in a comment, the format is too limited), but big thanks to @Zeitounator! :)

To give a concrete example, in your role:

```
roles
`-- passenger
    |-- defaults
    |   `-- main.yml
    |-- tasks
    |   `-- main.yml
    `-- templates
        `-- passenger.j2

```

In the `defaults/main.yml`:

```yaml
passenger_config_template: passenger.j2

```

In the `tasks/main.yml`:

```yaml
- name: Template passenger to /etc/passenger
  ansible.builtin.template:
    src: "{{ passenger_config_template }}"
    dest: /etc/passenger

```

By default, Ansible will try to find the file in the role's directory `templates` for the `ansible.builtin.template` module (and `files` directory for the `ansible.builtin.copy` module)

More about Ansible path resolution: <https://docs.ansible.com/ansible/latest/user_guide/playbook_pathing.html>

Now, in your playbook, to overwrite the default role's template `passenger.j2`, you would have this directory layout:

```
your_ansible_directory
|-- templates
|   `-- passenger.j2  <-- your custom template
|-- ansible.cfg
`-- playbook.yml

```

In the `playbook.yml`:

```yaml
- hosts: your_host
  tasks:
    - ansible.builtin.import_role:
        name: passenger
      vars:
        passenger_config_template: "{{ playbook_dir }}/templates/passenger.j2"

```

Note: I've renamed the role name on purpose to give an example of a good role name: role names shouldn't be prefixed by `ansible-` or `ansible-role-` and should use only `_` (underscore) characters, not `-` (hypen) or `.` (dot) characters.

Read more about role naming:
<https://galaxy.ansible.com/docs/contributing/creating_role.html#role-names>