diff --git a/changelogs/fragments/dnf-fix-plugin-loading.yaml b/changelogs/fragments/dnf-fix-plugin-loading.yaml
new file mode 100644
index 00000000000..ceb4fc17db2
--- /dev/null
+++ b/changelogs/fragments/dnf-fix-plugin-loading.yaml
@@ -0,0 +1,3 @@
+---
+minor_changes:
+  - "dnf module properly load and initialize dnf package manager plugins"
diff --git a/lib/ansible/modules/packaging/os/dnf.py b/lib/ansible/modules/packaging/os/dnf.py
index 48087b67f0f..d8c2e14787e 100644
--- a/lib/ansible/modules/packaging/os/dnf.py
+++ b/lib/ansible/modules/packaging/os/dnf.py
@@ -495,15 +495,11 @@ class DnfModule(YumDnf):
     def _configure_base(self, base, conf_file, disable_gpg_check, installroot='/'):
         """Configure the dnf Base object."""
 
-        if self.enable_plugin and self.disable_plugin:
-            base.init_plugins(self.disable_plugin, self.enable_plugin)
-        elif self.enable_plugin:
-            base.init_plugins(enable_plugins=self.enable_plugin)
-        elif self.disable_plugin:
-            base.init_plugins(self.disable_plugin)
-
         conf = base.conf
 
+        # Read the configuration file
+        conf.read()
+
         # Turn off debug messages in the output
         conf.debuglevel = 0
 
@@ -563,9 +559,6 @@ class DnfModule(YumDnf):
         # Default in dnf upstream is true
         conf.clean_requirements_on_remove = self.autoremove
 
-        # Read the configuration file
-        conf.read()
-
     def _specify_repositories(self, base, disablerepo, enablerepo):
         """Enable and disable repositories matching the provided patterns."""
         base.read_all_repos()
@@ -588,6 +581,12 @@ class DnfModule(YumDnf):
         base = dnf.Base()
         self._configure_base(base, conf_file, disable_gpg_check, installroot)
         self._specify_repositories(base, disablerepo, enablerepo)
+        try:
+            base.init_plugins(set(self.disable_plugin), set(self.enable_plugin))
+            base.pre_configure_plugins()
+            base.configure_plugins()
+        except AttributeError:
+            pass  # older versions of dnf didn't require this and don't have these methods
         try:
             base.fill_sack(load_system_repo='auto')
         except dnf.exceptions.RepoError as e: