# Use Fully Qualified Collection Names
## Rule
All module references MUST use fully qualified collection names (FQCNs). Short names like `copy` or `apt` are ambiguous and may resolve to wrong modules when collections are installed.
## Format
```yaml
# FQCN format: <namespace>.<collection>.<module>
ansible.builtin.copy
ansible.builtin.template
ansible.builtin.apt
community.general.ufw
amazon.aws.ec2_instance
```
## Good Examples
```yaml
- name: Copy configuration file
ansible.builtin.copy:
src: app.conf
dest: /etc/myapp/app.conf
- name: Install packages
ansible.builtin.apt:
name: "{{ packages }}"
state: present
- name: Create EC2 instance
amazon.aws.ec2_instance:
name: web-server
instance_type: t3.medium
- name: Manage firewall rule
community.general.ufw:
rule: allow
port: "443"
```
## Bad Examples
```yaml
# BAD: Short names (ambiguous)
- name: Copy file
copy:
src: app.conf
dest: /etc/myapp/app.conf
- name: Install packages
apt:
name: nginx
- name: Run shell command
shell: echo "hello"
```
## Common FQCNs
| Short Name | FQCN |
|-----------|------|
| copy | ansible.builtin.copy |
| template | ansible.builtin.template |
| file | ansible.builtin.file |
| apt | ansible.builtin.apt |
| yum | ansible.builtin.yum |
| service | ansible.builtin.service |
| shell | ansible.builtin.shell |
| command | ansible.builtin.command |
| debug | ansible.builtin.debug |
| user | ansible.builtin.user |
| group | ansible.builtin.group |
| git | ansible.builtin.git |
| uri | ansible.builtin.uri |
| pip | ansible.builtin.pip |
| set_fact | ansible.builtin.set_fact |
| include_tasks | ansible.builtin.include_tasks |
| import_role | ansible.builtin.import_role |
## Enforcement
- ansible-lint rule: fqcn[action-core], fqcn[action]
- CI pipeline with ansible-lint
- VS Code Ansible extension highlights short names