Blame SOURCES/ansible-freeipa-0.1.8-Add-missing-attributes-to-ipasudorule_rhbz#1788168,1788035,1788024.patch

d9912c
From dc0a5585fb036fbeba2200564e26c478465afeec Mon Sep 17 00:00:00 2001
d9912c
From: Rafael Guterres Jeffman <rjeffman@redhat.com>
d9912c
Date: Tue, 31 Dec 2019 11:04:49 -0300
d9912c
Subject: [PATCH] Add missing attributes to ipasudorule.
d9912c
d9912c
This patch adds the following attributes to ipasudorule:
d9912c
d9912c
    - order
d9912c
    - sudooption
d9912c
    - runasuser
d9912c
    - runasgroup
d9912c
d9912c
It also fixes behavior of sudocmd assigned to the the sudorule, with the
d9912c
adittion of the attributes:
d9912c
d9912c
    - allow_sudocmds
d9912c
    - deny_sudocmds
d9912c
    - allow_sudocmdgroups
d9912c
    - deny_sudocmdgroups
d9912c
d9912c
README-sudorule and tests have been updated to comply with the changes.
d9912c
---
d9912c
 README-sudorule.md                            |  14 +-
d9912c
 ...sure-sudorule-does-not-have-sudooption.yml |  14 +
d9912c
 .../ensure-sudorule-has-sudooption.yml        |  13 +
d9912c
 .../ensure-sudorule-is-present-with-order.yml |  12 +
d9912c
 .../sudorule/ensure-sudorule-is-present.yml   |   2 +
d9912c
 .../ensure-sudorule-runasuser-is-absent.yml   |  14 +
d9912c
 .../ensure-sudorule-runasuser-is-present.yml  |  13 +
d9912c
 .../ensure-sudorule-sudocmd-is-absent.yml     |   7 +-
d9912c
 .../ensure-sudorule-sudocmd-is-present.yml    |   7 +-
d9912c
 plugins/modules/ipasudorule.py                | 353 +++++++++++++-----
d9912c
 tests/sudorule/test_sudorule.yml              | 204 +++++++---
d9912c
 11 files changed, 504 insertions(+), 149 deletions(-)
d9912c
 create mode 100644 playbooks/sudorule/ensure-sudorule-does-not-have-sudooption.yml
d9912c
 create mode 100644 playbooks/sudorule/ensure-sudorule-has-sudooption.yml
d9912c
 create mode 100644 playbooks/sudorule/ensure-sudorule-is-present-with-order.yml
d9912c
 create mode 100644 playbooks/sudorule/ensure-sudorule-runasuser-is-absent.yml
d9912c
 create mode 100644 playbooks/sudorule/ensure-sudorule-runasuser-is-present.yml
d9912c
d9912c
diff --git a/README-sudorule.md b/README-sudorule.md
d9912c
index bb3498b..50c73ad 100644
d9912c
--- a/README-sudorule.md
d9912c
+++ b/README-sudorule.md
d9912c
@@ -68,7 +68,7 @@ Example playbook to make sure sudocmds are present in Sudo Rule:
d9912c
   - ipasudorule:
d9912c
       ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
-      cmd:
d9912c
+      allow_sudocmd:
d9912c
       - /sbin/ifconfig
d9912c
       action: member
d9912c
 ```
d9912c
@@ -87,7 +87,7 @@ Example playbook to make sure sudocmds are not present in Sudo Rule:
d9912c
   - ipasudorule:
d9912c
       ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
-      cmd:
d9912c
+      allow_sudocmd:
d9912c
       - /sbin/ifconfig
d9912c
       action: member
d9912c
       state: absent
d9912c
@@ -130,8 +130,14 @@ Variable | Description | Required
d9912c
 `hostgroup` | List of host group name strings assigned to this sudorule. | no
d9912c
 `user` | List of user name strings assigned to this sudorule. | no
d9912c
 `group` | List of user group name strings assigned to this sudorule. | no
d9912c
-`cmd` | List of sudocmd name strings assigned to this sudorule. | no
d9912c
-`cmdgroup` | List of sudocmd group name strings assigned wto this sudorule. | no
d9912c
+`allow_sudocmd` | List of sudocmd name strings assigned to the allow group of this sudorule. | no
d9912c
+`deny_sudocmd` | List of sudocmd name strings assigned to the deny group of this sudorule. | no
d9912c
+`allow_sudocmdgroup` | List of sudocmd groups name strings assigned to the allow group of this sudorule. | no
d9912c
+`deny_sudocmdgroup` | List of sudocmd groups name strings assigned to the deny group of this sudorule. | no
d9912c
+`sudooption` \| `option` | List of options to the sudorule | no
d9912c
+`order` | Integer to order the sudorule | no
d9912c
+`runasuser` | List of users for Sudo to execute as. | no
d9912c
+`runasgroup` | List of groups for Sudo to execute as. | no
d9912c
 `action` | Work on sudorule or member level. It can be on of `member` or `sudorule` and defaults to `sudorule`. | no
d9912c
 `state` | The state to ensure. It can be one of `present`, `absent`, `enabled` or `disabled`, default: `present`. | no
d9912c
 
d9912c
diff --git a/playbooks/sudorule/ensure-sudorule-does-not-have-sudooption.yml b/playbooks/sudorule/ensure-sudorule-does-not-have-sudooption.yml
d9912c
new file mode 100644
d9912c
index 0000000..1307044
d9912c
--- /dev/null
d9912c
+++ b/playbooks/sudorule/ensure-sudorule-does-not-have-sudooption.yml
d9912c
@@ -0,0 +1,14 @@
d9912c
+---
d9912c
+- name: Tests
d9912c
+  hosts: ipaserver
d9912c
+  become: true
d9912c
+  gather_facts: false
d9912c
+
d9912c
+  tasks:
d9912c
+  # Ensure sudooption is absent in sudorule
d9912c
+  - ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      sudooption: "!root"
d9912c
+      action: member
d9912c
+      state: absent
d9912c
diff --git a/playbooks/sudorule/ensure-sudorule-has-sudooption.yml b/playbooks/sudorule/ensure-sudorule-has-sudooption.yml
d9912c
new file mode 100644
d9912c
index 0000000..1f32b9a
d9912c
--- /dev/null
d9912c
+++ b/playbooks/sudorule/ensure-sudorule-has-sudooption.yml
d9912c
@@ -0,0 +1,13 @@
d9912c
+---
d9912c
+- name: Tests
d9912c
+  hosts: ipaserver
d9912c
+  become: true
d9912c
+  gather_facts: false
d9912c
+
d9912c
+  tasks:
d9912c
+  # Ensure sudooption is present in sudorule
d9912c
+  - ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      sudooption: "!root"
d9912c
+      action: member
d9912c
diff --git a/playbooks/sudorule/ensure-sudorule-is-present-with-order.yml b/playbooks/sudorule/ensure-sudorule-is-present-with-order.yml
d9912c
new file mode 100644
d9912c
index 0000000..9a3c2b2
d9912c
--- /dev/null
d9912c
+++ b/playbooks/sudorule/ensure-sudorule-is-present-with-order.yml
d9912c
@@ -0,0 +1,12 @@
d9912c
+---
d9912c
+- name: Tests
d9912c
+  hosts: ipaserver
d9912c
+  become: true
d9912c
+  gather_facts: false
d9912c
+
d9912c
+  tasks:
d9912c
+  # Ensure sudorule is present with the given order.
d9912c
+  - ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      order: 2
d9912c
diff --git a/playbooks/sudorule/ensure-sudorule-is-present.yml b/playbooks/sudorule/ensure-sudorule-is-present.yml
d9912c
index 5b8f32b..89041af 100644
d9912c
--- a/playbooks/sudorule/ensure-sudorule-is-present.yml
d9912c
+++ b/playbooks/sudorule/ensure-sudorule-is-present.yml
d9912c
@@ -9,4 +9,6 @@
d9912c
       ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
       description: A test sudo rule.
d9912c
+      allow_sudocmd: /bin/ls
d9912c
+      deny_sudocmd: /bin/vim
d9912c
       state: present
d9912c
diff --git a/playbooks/sudorule/ensure-sudorule-runasuser-is-absent.yml b/playbooks/sudorule/ensure-sudorule-runasuser-is-absent.yml
d9912c
new file mode 100644
d9912c
index 0000000..56612f1
d9912c
--- /dev/null
d9912c
+++ b/playbooks/sudorule/ensure-sudorule-runasuser-is-absent.yml
d9912c
@@ -0,0 +1,14 @@
d9912c
+---
d9912c
+- name: Tests
d9912c
+  hosts: ipaserver
d9912c
+  become: true
d9912c
+  gather_facts: false
d9912c
+
d9912c
+  tasks:
d9912c
+  # Ensure sudorule is present with the given order.
d9912c
+  - ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      runasuser: admin
d9912c
+      action: member
d9912c
+      state: absent
d9912c
diff --git a/playbooks/sudorule/ensure-sudorule-runasuser-is-present.yml b/playbooks/sudorule/ensure-sudorule-runasuser-is-present.yml
d9912c
new file mode 100644
d9912c
index 0000000..8af49b9
d9912c
--- /dev/null
d9912c
+++ b/playbooks/sudorule/ensure-sudorule-runasuser-is-present.yml
d9912c
@@ -0,0 +1,13 @@
d9912c
+---
d9912c
+- name: Tests
d9912c
+  hosts: ipaserver
d9912c
+  become: true
d9912c
+  gather_facts: false
d9912c
+
d9912c
+  tasks:
d9912c
+  # Ensure sudorule is present with the given order.
d9912c
+  - ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      runasuser: admin
d9912c
+      action: member
d9912c
diff --git a/playbooks/sudorule/ensure-sudorule-sudocmd-is-absent.yml b/playbooks/sudorule/ensure-sudorule-sudocmd-is-absent.yml
d9912c
index 942d0b5..328242a 100644
d9912c
--- a/playbooks/sudorule/ensure-sudorule-sudocmd-is-absent.yml
d9912c
+++ b/playbooks/sudorule/ensure-sudorule-sudocmd-is-absent.yml
d9912c
@@ -8,8 +8,13 @@
d9912c
   - ipasudorule:
d9912c
       ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
-      cmd:
d9912c
+      allow_sudocmd:
d9912c
       - /sbin/ifconfig
d9912c
+      deny_sudocmd:
d9912c
       - /usr/bin/vim
d9912c
+      allow_sudocmdgroup:
d9912c
+      - devops
d9912c
+      deny_sudocmdgroup:
d9912c
+      - users
d9912c
       action: member
d9912c
       state: absent
d9912c
diff --git a/playbooks/sudorule/ensure-sudorule-sudocmd-is-present.yml b/playbooks/sudorule/ensure-sudorule-sudocmd-is-present.yml
d9912c
index 61fcbb0..55acd61 100644
d9912c
--- a/playbooks/sudorule/ensure-sudorule-sudocmd-is-present.yml
d9912c
+++ b/playbooks/sudorule/ensure-sudorule-sudocmd-is-present.yml
d9912c
@@ -8,7 +8,12 @@
d9912c
   - ipasudorule:
d9912c
       ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
-      cmd:
d9912c
+      allow_sudocmd:
d9912c
       - /sbin/ifconfig
d9912c
+      deny_sudocmd:
d9912c
       - /usr/bin/vim
d9912c
+      allow_sudocmdgroup:
d9912c
+      - devops
d9912c
+      deny_sudocmdgroup:
d9912c
+      - users
d9912c
       action: member
d9912c
diff --git a/plugins/modules/ipasudorule.py b/plugins/modules/ipasudorule.py
d9912c
index c21f247..285a946 100644
d9912c
--- a/plugins/modules/ipasudorule.py
d9912c
+++ b/plugins/modules/ipasudorule.py
d9912c
@@ -79,18 +79,43 @@
d9912c
     description: Host category the sudo rule applies to.
d9912c
     required: false
d9912c
     choices: ["all"]
d9912c
-  cmd:
d9912c
-    description: List of sudocmds assigned to this sudorule.
d9912c
+  allow_sudocmd:
d9912c
+    description: List of allowed sudocmds assigned to this sudorule.
d9912c
     required: false
d9912c
     type: list
d9912c
-  cmdgroup:
d9912c
-    description: List of sudocmd groups assigned to this sudorule.
d9912c
+  allow_sudocmdgroup:
d9912c
+    description: List of allowed sudocmd groups assigned to this sudorule.
d9912c
+    required: false
d9912c
+    type: list
d9912c
+  deny_sudocmd:
d9912c
+    description: List of denied sudocmds assigned to this sudorule.
d9912c
+    required: false
d9912c
+    type: list
d9912c
+  deny_sudocmdgroup:
d9912c
+    description: List of denied sudocmd groups assigned to this sudorule.
d9912c
     required: false
d9912c
     type: list
d9912c
   cmdcategory:
d9912c
-    description: Cammand category the sudo rule applies to
d9912c
+    description: Command category the sudo rule applies to
d9912c
     required: false
d9912c
     choices: ["all"]
d9912c
+  order:
d9912c
+    description: Order to apply this rule.
d9912c
+    required: false
d9912c
+    type: int
d9912c
+  sudooption:
d9912c
+    description:
d9912c
+    required: false
d9912c
+    type: list
d9912c
+    aliases: ["options"]
d9912c
+  runasuser:
d9912c
+    description: List of users for Sudo to execute as.
d9912c
+    required: false
d9912c
+    type: list
d9912c
+  runasgroup:
d9912c
+    description: List of groups for Sudo to execute as.
d9912c
+    required: false
d9912c
+    type: list
d9912c
   action:
d9912c
     description: Work on sudorule or member level
d9912c
     default: sudorule
d9912c
@@ -111,13 +136,13 @@
d9912c
 
d9912c
 # Ensure sudocmd is present in Sudo Rule
d9912c
 - ipasudorule:
d9912c
-  ipaadmin_password: pass1234
d9912c
-  name: testrule1
d9912c
-  cmd:
d9912c
-  - /sbin/ifconfig
d9912c
-  - /usr/bin/vim
d9912c
-  action: member
d9912c
-  state: absent
d9912c
+    ipaadmin_password: pass1234
d9912c
+    name: testrule1
d9912c
+    allow_sudocmd:
d9912c
+      - /sbin/ifconfig
d9912c
+      - /usr/bin/vim
d9912c
+    action: member
d9912c
+    state: absent
d9912c
 
d9912c
 # Ensure host server is present in Sudo Rule
d9912c
 - ipasudorule:
d9912c
@@ -160,7 +185,7 @@
d9912c
 from ansible.module_utils.basic import AnsibleModule
d9912c
 from ansible.module_utils.ansible_freeipa_module import temp_kinit, \
d9912c
     temp_kdestroy, valid_creds, api_connect, api_command, compare_args_ipa, \
d9912c
-    module_params_get
d9912c
+    module_params_get, gen_add_del_lists
d9912c
 
d9912c
 
d9912c
 def find_sudorule(module, name):
d9912c
@@ -180,14 +205,26 @@ def find_sudorule(module, name):
d9912c
         return None
d9912c
 
d9912c
 
d9912c
-def gen_args(ansible_module):
d9912c
-    arglist = ['description', 'usercategory', 'hostcategory', 'cmdcategory',
d9912c
-               'runasusercategory', 'runasgroupcategory', 'nomembers']
d9912c
+def gen_args(description, usercat, hostcat, cmdcat, runasusercat,
d9912c
+             runasgroupcat, order, nomembers):
d9912c
     _args = {}
d9912c
-    for arg in arglist:
d9912c
-        value = module_params_get(ansible_module, arg)
d9912c
-        if value is not None:
d9912c
-            _args[arg] = value
d9912c
+
d9912c
+    if description is not None:
d9912c
+        _args['description'] = description
d9912c
+    if usercat is not None:
d9912c
+        _args['usercategory'] = usercat
d9912c
+    if hostcat is not None:
d9912c
+        _args['hostcategory'] = hostcat
d9912c
+    if cmdcat is not None:
d9912c
+        _args['cmdcategory'] = cmdcat
d9912c
+    if runasusercat is not None:
d9912c
+        _args['ipasudorunasusercategory'] = runasusercat
d9912c
+    if runasgroupcat is not None:
d9912c
+        _args['ipasudorunasgroupcategory'] = runasgroupcat
d9912c
+    if order is not None:
d9912c
+        _args['sudoorder'] = order
d9912c
+    if nomembers is not None:
d9912c
+        _args['nomembers'] = nomembers
d9912c
 
d9912c
     return _args
d9912c
 
d9912c
@@ -212,13 +249,21 @@ def main():
d9912c
             hostgroup=dict(required=False, type='list', default=None),
d9912c
             user=dict(required=False, type='list', default=None),
d9912c
             group=dict(required=False, type='list', default=None),
d9912c
-            cmd=dict(required=False, type="list", default=None),
d9912c
+            allow_sudocmd=dict(required=False, type="list", default=None),
d9912c
+            deny_sudocmd=dict(required=False, type="list", default=None),
d9912c
+            allow_sudocmdgroup=dict(required=False, type="list", default=None),
d9912c
+            deny_sudocmdgroup=dict(required=False, type="list", default=None),
d9912c
             cmdcategory=dict(required=False, type="str", default=None,
d9912c
                              choices=["all"]),
d9912c
             runasusercategory=dict(required=False, type="str", default=None,
d9912c
                                    choices=["all"]),
d9912c
             runasgroupcategory=dict(required=False, type="str", default=None,
d9912c
                                     choices=["all"]),
d9912c
+            runasuser=dict(required=False, type="list", default=None),
d9912c
+            runasgroup=dict(required=False, type="list", default=None),
d9912c
+            order=dict(type="int", required=False, aliases=['sudoorder']),
d9912c
+            sudooption=dict(required=False, type='list', default=None,
d9912c
+                            aliases=["options"]),
d9912c
             action=dict(type="str", default="sudorule",
d9912c
                         choices=["member", "sudorule"]),
d9912c
             # state
d9912c
@@ -256,8 +301,16 @@ def main():
d9912c
     hostgroup = module_params_get(ansible_module, "hostgroup")
d9912c
     user = module_params_get(ansible_module, "user")
d9912c
     group = module_params_get(ansible_module, "group")
d9912c
-    cmd = module_params_get(ansible_module, 'cmd')
d9912c
-    cmdgroup = module_params_get(ansible_module, 'cmdgroup')
d9912c
+    allow_sudocmd = module_params_get(ansible_module, 'allow_sudocmd')
d9912c
+    allow_sudocmdgroup = module_params_get(ansible_module,
d9912c
+                                           'allow_sudocmdgroup')
d9912c
+    deny_sudocmd = module_params_get(ansible_module, 'deny_sudocmd')
d9912c
+    deny_sudocmdgroup = module_params_get(ansible_module,
d9912c
+                                          'deny_sudocmdgroup')
d9912c
+    sudooption = module_params_get(ansible_module, "sudooption")
d9912c
+    order = module_params_get(ansible_module, "order")
d9912c
+    runasuser = module_params_get(ansible_module, "runasuser")
d9912c
+    runasgroup = module_params_get(ansible_module, "runasgroup")
d9912c
     action = module_params_get(ansible_module, "action")
d9912c
 
d9912c
     # state
d9912c
@@ -272,28 +325,30 @@ def main():
d9912c
         if action == "member":
d9912c
             invalid = ["description", "usercategory", "hostcategory",
d9912c
                        "cmdcategory", "runasusercategory",
d9912c
-                       "runasgroupcategory", "nomembers"]
d9912c
+                       "runasgroupcategory", "order", "nomembers"]
d9912c
 
d9912c
-            for x in invalid:
d9912c
-                if x in vars() and vars()[x] is not None:
d9912c
+            for arg in invalid:
d9912c
+                if arg in vars() and vars()[arg] is not None:
d9912c
                     ansible_module.fail_json(
d9912c
                         msg="Argument '%s' can not be used with action "
d9912c
-                        "'%s'" % (x, action))
d9912c
+                        "'%s'" % (arg, action))
d9912c
 
d9912c
     elif state == "absent":
d9912c
         if len(names) < 1:
d9912c
             ansible_module.fail_json(msg="No name given.")
d9912c
         invalid = ["description", "usercategory", "hostcategory",
d9912c
                    "cmdcategory", "runasusercategory",
d9912c
-                   "runasgroupcategory", "nomembers"]
d9912c
+                   "runasgroupcategory", "nomembers", "order"]
d9912c
         if action == "sudorule":
d9912c
             invalid.extend(["host", "hostgroup", "user", "group",
d9912c
-                            "cmd", "cmdgroup"])
d9912c
-        for x in invalid:
d9912c
-            if vars()[x] is not None:
d9912c
+                            "runasuser", "runasgroup", "allow_sudocmd",
d9912c
+                            "allow_sudocmdgroup", "deny_sudocmd",
d9912c
+                            "deny_sudocmdgroup", "sudooption"])
d9912c
+        for arg in invalid:
d9912c
+            if vars()[arg] is not None:
d9912c
                 ansible_module.fail_json(
d9912c
                     msg="Argument '%s' can not be used with state '%s'" %
d9912c
-                    (x, state))
d9912c
+                    (arg, state))
d9912c
 
d9912c
     elif state in ["enabled", "disabled"]:
d9912c
         if len(names) < 1:
d9912c
@@ -305,12 +360,14 @@ def main():
d9912c
         invalid = ["description", "usercategory", "hostcategory",
d9912c
                    "cmdcategory", "runasusercategory", "runasgroupcategory",
d9912c
                    "nomembers", "nomembers", "host", "hostgroup",
d9912c
-                   "user", "group", "cmd", "cmdgroup"]
d9912c
-        for x in invalid:
d9912c
-            if vars()[x] is not None:
d9912c
+                   "user", "group", "allow_sudocmd", "allow_sudocmdgroup",
d9912c
+                   "deny_sudocmd", "deny_sudocmdgroup", "runasuser",
d9912c
+                   "runasgroup", "order", "sudooption"]
d9912c
+        for arg in invalid:
d9912c
+            if vars()[arg] is not None:
d9912c
                 ansible_module.fail_json(
d9912c
                     msg="Argument '%s' can not be used with state '%s'" %
d9912c
-                    (x, state))
d9912c
+                    (arg, state))
d9912c
     else:
d9912c
         ansible_module.fail_json(msg="Invalid state '%s'" % state)
d9912c
 
d9912c
@@ -335,7 +392,9 @@ def main():
d9912c
             # Create command
d9912c
             if state == "present":
d9912c
                 # Generate args
d9912c
-                args = gen_args(ansible_module)
d9912c
+                args = gen_args(description, usercategory, hostcategory,
d9912c
+                                cmdcategory, runasusercategory,
d9912c
+                                runasgroupcategory, order, nomembers)
d9912c
                 if action == "sudorule":
d9912c
                     # Found the sudorule
d9912c
                     if res_find is not None:
d9912c
@@ -351,44 +410,42 @@ def main():
d9912c
                         res_find = {}
d9912c
 
d9912c
                     # Generate addition and removal lists
d9912c
-                    host_add = list(
d9912c
-                        set(host or []) -
d9912c
-                        set(res_find.get("member_host", [])))
d9912c
-                    host_del = list(
d9912c
-                        set(res_find.get("member_host", [])) -
d9912c
-                        set(host or []))
d9912c
-                    hostgroup_add = list(
d9912c
-                        set(hostgroup or []) -
d9912c
-                        set(res_find.get("member_hostgroup", [])))
d9912c
-                    hostgroup_del = list(
d9912c
-                        set(res_find.get("member_hostgroup", [])) -
d9912c
-                        set(hostgroup or []))
d9912c
-
d9912c
-                    user_add = list(
d9912c
-                        set(user or []) -
d9912c
-                        set(res_find.get("member_user", [])))
d9912c
-                    user_del = list(
d9912c
-                        set(res_find.get("member_user", [])) -
d9912c
-                        set(user or []))
d9912c
-                    group_add = list(
d9912c
-                        set(group or []) -
d9912c
-                        set(res_find.get("member_group", [])))
d9912c
-                    group_del = list(
d9912c
-                        set(res_find.get("member_group", [])) -
d9912c
-                        set(group or []))
d9912c
-
d9912c
-                    cmd_add = list(
d9912c
-                        set(cmd or []) -
d9912c
-                        set(res_find.get("member_cmd", [])))
d9912c
-                    cmd_del = list(
d9912c
-                        set(res_find.get("member_cmd", [])) -
d9912c
-                        set(cmd or []))
d9912c
-                    cmdgroup_add = list(
d9912c
-                        set(cmdgroup or []) -
d9912c
-                        set(res_find.get("member_cmdgroup", [])))
d9912c
-                    cmdgroup_del = list(
d9912c
-                        set(res_find.get("member_cmdgroup", [])) -
d9912c
-                        set(cmdgroup or []))
d9912c
+                    host_add, host_del = gen_add_del_lists(
d9912c
+                        host, res_find.get('member_host', []))
d9912c
+
d9912c
+                    hostgroup_add, hostgroup_del = gen_add_del_lists(
d9912c
+                        hostgroup, res_find.get('member_hostgroup', []))
d9912c
+
d9912c
+                    user_add, user_del = gen_add_del_lists(
d9912c
+                        user, res_find.get('member_user', []))
d9912c
+
d9912c
+                    group_add, group_del = gen_add_del_lists(
d9912c
+                        group, res_find.get('member_group', []))
d9912c
+
d9912c
+                    allow_cmd_add, allow_cmd_del = gen_add_del_lists(
d9912c
+                        allow_sudocmd,
d9912c
+                        res_find.get('memberallowcmd_sudocmd', []))
d9912c
+
d9912c
+                    allow_cmdgroup_add, allow_cmdgroup_del = gen_add_del_lists(
d9912c
+                        allow_sudocmdgroup,
d9912c
+                        res_find.get('memberallowcmd_sudocmdgroup', []))
d9912c
+
d9912c
+                    deny_cmd_add, deny_cmd_del = gen_add_del_lists(
d9912c
+                        deny_sudocmd,
d9912c
+                        res_find.get('memberdenycmd_sudocmd', []))
d9912c
+
d9912c
+                    deny_cmdgroup_add, deny_cmdgroup_del = gen_add_del_lists(
d9912c
+                        deny_sudocmdgroup,
d9912c
+                        res_find.get('memberdenycmd_sudocmdgroup', []))
d9912c
+
d9912c
+                    sudooption_add, sudooption_del = gen_add_del_lists(
d9912c
+                        sudooption, res_find.get('ipasudoopt', []))
d9912c
+
d9912c
+                    runasuser_add, runasuser_del = gen_add_del_lists(
d9912c
+                        runasuser, res_find.get('ipasudorunas_user', []))
d9912c
+
d9912c
+                    runasgroup_add, runasgroup_del = gen_add_del_lists(
d9912c
+                        runasgroup, res_find.get('ipasudorunas_group', []))
d9912c
 
d9912c
                     # Add hosts and hostgroups
d9912c
                     if len(host_add) > 0 or len(hostgroup_add) > 0:
d9912c
@@ -420,20 +477,59 @@ def main():
d9912c
                                              "group": group_del,
d9912c
                                          }])
d9912c
 
d9912c
-                    # Add commands
d9912c
-                    if len(cmd_add) > 0 or len(cmdgroup_add) > 0:
d9912c
+                    # Add commands allowed
d9912c
+                    if len(allow_cmd_add) > 0 or len(allow_cmdgroup_add) > 0:
d9912c
                         commands.append([name, "sudorule_add_allow_command",
d9912c
-                                         {
d9912c
-                                             "sudocmd": cmd_add,
d9912c
-                                             "sudocmdgroup": cmdgroup_add,
d9912c
-                                         }])
d9912c
-
d9912c
-                    if len(cmd_del) > 0 or len(cmdgroup_del) > 0:
d9912c
+                                         {"sudocmd": allow_cmd_add,
d9912c
+                                          "sudocmdgroup": allow_cmdgroup_add,
d9912c
+                                          }])
d9912c
+
d9912c
+                    if len(allow_cmd_del) > 0 or len(allow_cmdgroup_del) > 0:
d9912c
+                        commands.append([name, "sudorule_remove_allow_command",
d9912c
+                                         {"sudocmd": allow_cmd_del,
d9912c
+                                          "sudocmdgroup": allow_cmdgroup_del
d9912c
+                                          }])
d9912c
+
d9912c
+                    # Add commands denied
d9912c
+                    if len(deny_cmd_add) > 0 or len(deny_cmdgroup_add) > 0:
d9912c
                         commands.append([name, "sudorule_add_deny_command",
d9912c
-                                         {
d9912c
-                                             "sudocmd": cmd_del,
d9912c
-                                             "sudocmdgroup": cmdgroup_del
d9912c
-                                         }])
d9912c
+                                         {"sudocmd": deny_cmd_add,
d9912c
+                                          "sudocmdgroup": deny_cmdgroup_add,
d9912c
+                                          }])
d9912c
+
d9912c
+                    if len(deny_cmd_del) > 0 or len(deny_cmdgroup_del) > 0:
d9912c
+                        commands.append([name, "sudorule_remove_deny_command",
d9912c
+                                         {"sudocmd": deny_cmd_del,
d9912c
+                                          "sudocmdgroup": deny_cmdgroup_del
d9912c
+                                          }])
d9912c
+
d9912c
+                    # Add RunAS Users
d9912c
+                    if len(runasuser_add) > 0:
d9912c
+                        commands.append([name, "sudorule_add_runasuser",
d9912c
+                                         {"user": runasuser_add}])
d9912c
+                    # Remove RunAS Users
d9912c
+                    if len(runasuser_del) > 0:
d9912c
+                        commands.append([name, "sudorule_remove_runasuser",
d9912c
+                                         {"user": runasuser_del}])
d9912c
+
d9912c
+                    # Add RunAS Groups
d9912c
+                    if len(runasgroup_add) > 0:
d9912c
+                        commands.append([name, "sudorule_add_runasgroup",
d9912c
+                                         {"group": runasgroup_add}])
d9912c
+                    # Remove RunAS Groups
d9912c
+                    if len(runasgroup_del) > 0:
d9912c
+                        commands.append([name, "sudorule_remove_runasgroup",
d9912c
+                                         {"group": runasgroup_del}])
d9912c
+
d9912c
+                    # Add sudo options
d9912c
+                    for sudoopt in sudooption_add:
d9912c
+                        commands.append([name, "sudorule_add_option",
d9912c
+                                         {"ipasudoopt": sudoopt}])
d9912c
+
d9912c
+                    # Remove sudo options
d9912c
+                    for sudoopt in sudooption_del:
d9912c
+                        commands.append([name, "sudorule_remove_option",
d9912c
+                                         {"ipasudoopt": sudoopt}])
d9912c
 
d9912c
                 elif action == "member":
d9912c
                     if res_find is None:
d9912c
@@ -456,11 +552,38 @@ def main():
d9912c
                                          }])
d9912c
 
d9912c
                     # Add commands
d9912c
-                    if cmd is not None:
d9912c
+                    if allow_sudocmd is not None \
d9912c
+                       or allow_sudocmdgroup is not None:
d9912c
                         commands.append([name, "sudorule_add_allow_command",
d9912c
-                                         {
d9912c
-                                             "sudocmd": cmd,
d9912c
-                                         }])
d9912c
+                                         {"sudocmd": allow_sudocmd,
d9912c
+                                          "sudocmdgroup": allow_sudocmdgroup,
d9912c
+                                          }])
d9912c
+
d9912c
+                    # Add commands
d9912c
+                    if deny_sudocmd is not None \
d9912c
+                       or deny_sudocmdgroup is not None:
d9912c
+                        commands.append([name, "sudorule_add_deny_command",
d9912c
+                                         {"sudocmd": deny_sudocmd,
d9912c
+                                          "sudocmdgroup": deny_sudocmdgroup,
d9912c
+                                          }])
d9912c
+
d9912c
+                    # Add RunAS Users
d9912c
+                    if runasuser is not None:
d9912c
+                        commands.append([name, "sudorule_add_runasuser",
d9912c
+                                         {"user": runasuser}])
d9912c
+
d9912c
+                    # Add RunAS Groups
d9912c
+                    if runasgroup is not None:
d9912c
+                        commands.append([name, "sudorule_add_runasgroup",
d9912c
+                                         {"group": runasgroup}])
d9912c
+
d9912c
+                    # Add options
d9912c
+                    if sudooption is not None:
d9912c
+                        existing_opts = res_find.get('ipasudoopt', [])
d9912c
+                        for sudoopt in sudooption:
d9912c
+                            if sudoopt not in existing_opts:
d9912c
+                                commands.append([name, "sudorule_add_option",
d9912c
+                                                 {"ipasudoopt": sudoopt}])
d9912c
 
d9912c
             elif state == "absent":
d9912c
                 if action == "sudorule":
d9912c
@@ -487,12 +610,40 @@ def main():
d9912c
                                              "group": group,
d9912c
                                          }])
d9912c
 
d9912c
-                    # Remove commands
d9912c
-                    if cmd is not None:
d9912c
-                        commands.append([name, "sudorule_add_deny_command",
d9912c
-                                         {
d9912c
-                                             "sudocmd": cmd,
d9912c
-                                         }])
d9912c
+                    # Remove allow commands
d9912c
+                    if allow_sudocmd is not None \
d9912c
+                       or allow_sudocmdgroup is not None:
d9912c
+                        commands.append([name, "sudorule_remove_allow_command",
d9912c
+                                         {"sudocmd": allow_sudocmd,
d9912c
+                                          "sudocmdgroup": allow_sudocmdgroup
d9912c
+                                          }])
d9912c
+
d9912c
+                    # Remove deny commands
d9912c
+                    if deny_sudocmd is not None \
d9912c
+                       or deny_sudocmdgroup is not None:
d9912c
+                        commands.append([name, "sudorule_remove_deny_command",
d9912c
+                                         {"sudocmd": deny_sudocmd,
d9912c
+                                          "sudocmdgroup": deny_sudocmdgroup
d9912c
+                                          }])
d9912c
+
d9912c
+                    # Remove RunAS Users
d9912c
+                    if runasuser is not None:
d9912c
+                        commands.append([name, "sudorule_remove_runasuser",
d9912c
+                                         {"user": runasuser}])
d9912c
+
d9912c
+                    # Remove RunAS Groups
d9912c
+                    if runasgroup is not None:
d9912c
+                        commands.append([name, "sudorule_remove_runasgroup",
d9912c
+                                         {"group": runasgroup}])
d9912c
+
d9912c
+                    # Remove options
d9912c
+                    if sudooption is not None:
d9912c
+                        existing_opts = res_find.get('ipasudoopt', [])
d9912c
+                        for sudoopt in sudooption:
d9912c
+                            if sudoopt in existing_opts:
d9912c
+                                commands.append([name,
d9912c
+                                                 "sudorule_remove_option",
d9912c
+                                                 {"ipasudoopt": sudoopt}])
d9912c
 
d9912c
             elif state == "enabled":
d9912c
                 if res_find is None:
d9912c
@@ -530,9 +681,9 @@ def main():
d9912c
                         changed = True
d9912c
                 else:
d9912c
                     changed = True
d9912c
-            except Exception as e:
d9912c
+            except Exception as ex:
d9912c
                 ansible_module.fail_json(msg="%s: %s: %s" % (command, name,
d9912c
-                                                             str(e)))
d9912c
+                                                             str(ex)))
d9912c
             # Get all errors
d9912c
             # All "already a member" and "not a member" failures in the
d9912c
             # result are ignored. All others are reported.
d9912c
@@ -549,8 +700,8 @@ def main():
d9912c
         if len(errors) > 0:
d9912c
             ansible_module.fail_json(msg=", ".join(errors))
d9912c
 
d9912c
-    except Exception as e:
d9912c
-        ansible_module.fail_json(msg=str(e))
d9912c
+    except Exception as ex:
d9912c
+        ansible_module.fail_json(msg=str(ex))
d9912c
 
d9912c
     finally:
d9912c
         temp_kdestroy(ccache_dir, ccache_name)
d9912c
diff --git a/tests/sudorule/test_sudorule.yml b/tests/sudorule/test_sudorule.yml
d9912c
index 88ed90a..25090bb 100644
d9912c
--- a/tests/sudorule/test_sudorule.yml
d9912c
+++ b/tests/sudorule/test_sudorule.yml
d9912c
@@ -16,15 +16,22 @@
d9912c
 
d9912c
   - name: Ensure some sudocmds are available
d9912c
     ipasudocmd:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name:
d9912c
           - /sbin/ifconfig
d9912c
           - /usr/bin/vim
d9912c
       state: present
d9912c
 
d9912c
+  - name: Ensure sudocmdgroup is available
d9912c
+    ipasudocmdgroup:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: test_sudorule
d9912c
+      sudocmd: /usr/bin/vim
d9912c
+      state: present
d9912c
+
d9912c
   - name: Ensure sudorules are absent
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name:
d9912c
       - testrule1
d9912c
       - allusers
d9912c
@@ -34,21 +41,21 @@
d9912c
 
d9912c
   - name: Ensure sudorule is present
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
     register: result
d9912c
     failed_when: not result.changed
d9912c
 
d9912c
   - name: Ensure sudorule is present again
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
     register: result
d9912c
     failed_when: result.changed
d9912c
 
d9912c
   - name: Ensure sudorule is present, runAsUserCategory.
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
       runAsUserCategory: all
d9912c
     register: result
d9912c
@@ -56,7 +63,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule is present, with usercategory 'all'
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allusers
d9912c
       usercategory: all
d9912c
     register: result
d9912c
@@ -64,7 +71,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule is present, with usercategory 'all', again
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allusers
d9912c
       usercategory: all
d9912c
     register: result
d9912c
@@ -72,7 +79,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule is present, with hostategory 'all'
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allhosts
d9912c
       hostcategory: all
d9912c
     register: result
d9912c
@@ -80,7 +87,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule is present, with hostategory 'all', again
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allhosts
d9912c
       hostcategory: all
d9912c
     register: result
d9912c
@@ -88,13 +95,13 @@
d9912c
 
d9912c
   - name: Ensure sudorule is disabled
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
       state: disabled
d9912c
 
d9912c
   - name: Ensure sudorule is disabled, again
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
       state: disabled
d9912c
     register: result
d9912c
@@ -102,7 +109,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule is enabled
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
       state: enabled
d9912c
     register: result
d9912c
@@ -110,37 +117,77 @@
d9912c
 
d9912c
   - name: Ensure sudorule is enabled, again
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
       state: enabled
d9912c
     register: result
d9912c
     failed_when: result.changed
d9912c
 
d9912c
-  - name: Ensure sudorule is present and some sudocmd are a member of it.
d9912c
+  - name: Ensure sudorule is present and some sudocmd are allowed.
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
-      cmd:
d9912c
+      allow_sudocmd:
d9912c
       - /sbin/ifconfig
d9912c
-      - /usr/bin/vim
d9912c
       action: member
d9912c
     register: result
d9912c
     failed_when: not result.changed
d9912c
 
d9912c
-  - name: Ensure sudorule is present and some sudocmd are a member of it, again.
d9912c
+  - name: Ensure sudorule is present and some sudocmd are allowed, again.
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
-      cmd:
d9912c
+      allow_sudocmd:
d9912c
       - /sbin/ifconfig
d9912c
+      action: member
d9912c
+    register: result
d9912c
+    failed_when: result.changed
d9912c
+
d9912c
+  - name: Ensure sudorule is present and some sudocmd are denyed.
d9912c
+    ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      deny_sudocmd:
d9912c
+      - /usr/bin/vim
d9912c
+      action: member
d9912c
+    register: result
d9912c
+    failed_when: not result.changed
d9912c
+
d9912c
+  - name: Ensure sudorule is present and some sudocmd are denyed, again.
d9912c
+    ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      deny_sudocmd:
d9912c
       - /usr/bin/vim
d9912c
       action: member
d9912c
     register: result
d9912c
     failed_when: result.changed
d9912c
 
d9912c
+  - name: Ensure sudorule is present and, sudocmds are absent.
d9912c
+    ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      allow_sudocmd: /sbin/ifconfig
d9912c
+      deny_sudocmd: /usr/bin/vim
d9912c
+      action: member
d9912c
+      state: absent
d9912c
+    register: result
d9912c
+    failed_when: not result.changed
d9912c
+
d9912c
+  - name: Ensure sudorule is present and, sudocmds are absent, again.
d9912c
+    ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      allow_sudocmd: /sbin/ifconfig
d9912c
+      deny_sudocmd: /usr/bin/vim
d9912c
+      action: member
d9912c
+      state: absent
d9912c
+    register: result
d9912c
+    failed_when: result.changed
d9912c
+
d9912c
   - name: Ensure sudorule is present with cmdcategory 'all'.
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allcommands
d9912c
       cmdcategory: all
d9912c
     register: result
d9912c
@@ -148,7 +195,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule is present with cmdcategory 'all', again.
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allcommands
d9912c
       cmdcategory: all
d9912c
     register: result
d9912c
@@ -156,7 +203,7 @@
d9912c
 
d9912c
   - name: Ensure host "{{ groups.ipaserver[0] }}" is present in sudorule.
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
       host: "{{ groups.ipaserver[0] }}"
d9912c
       action: member
d9912c
@@ -165,7 +212,7 @@
d9912c
 
d9912c
   - name: Ensure host "{{ groups.ipaserver[0] }}" is present in sudorule, again.
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
       host: "{{ groups.ipaserver[0] }}"
d9912c
       action: member
d9912c
@@ -190,25 +237,77 @@
d9912c
     register: result
d9912c
     failed_when: result.changed
d9912c
 
d9912c
-  - name: Ensure sudorule sudocmds are absent
d9912c
+  - name: Ensure sudorule is present, with an allow_sudocmdgroup.
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
-      cmd:
d9912c
-      - /sbin/ifconfig
d9912c
-      - /usr/bin/vim
d9912c
+      allow_sudocmdgroup: test_sudorule
d9912c
+      state: present
d9912c
+    register: result
d9912c
+    failed_when: not result.changed
d9912c
+
d9912c
+  - name: Ensure sudorule is present, with an allow_sudocmdgroup, again.
d9912c
+    ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      allow_sudocmdgroup: test_sudorule
d9912c
+      state: present
d9912c
+    register: result
d9912c
+    failed_when: result.changed
d9912c
+
d9912c
+  - name: Ensure sudorule is present, but allow_sudocmdgroup is absent.
d9912c
+    ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      allow_sudocmdgroup: test_sudorule
d9912c
       action: member
d9912c
       state: absent
d9912c
     register: result
d9912c
     failed_when: not result.changed
d9912c
 
d9912c
-  - name: Ensure sudorule sudocmds are absent, again
d9912c
+  - name: Ensure sudorule is present, but allow_sudocmdgroup is absent.
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
-      cmd:
d9912c
-      - /sbin/ifconfig
d9912c
-      - /usr/bin/vim
d9912c
+      allow_sudocmdgroup: test_sudorule
d9912c
+      action: member
d9912c
+      state: absent
d9912c
+    register: result
d9912c
+    failed_when: result.changed
d9912c
+
d9912c
+  - name: Ensure sudorule is present, with an deny_sudocmdgroup.
d9912c
+    ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      deny_sudocmdgroup: test_sudorule
d9912c
+      state: present
d9912c
+    register: result
d9912c
+    failed_when: not result.changed
d9912c
+
d9912c
+  - name: Ensure sudorule is present, with an deny_sudocmdgroup, again.
d9912c
+    ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      deny_sudocmdgroup: test_sudorule
d9912c
+      state: present
d9912c
+    register: result
d9912c
+    failed_when: result.changed
d9912c
+
d9912c
+  - name: Ensure sudorule is present, but deny_sudocmdgroup is absent.
d9912c
+    ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      deny_sudocmdgroup: test_sudorule
d9912c
+      action: member
d9912c
+      state: absent
d9912c
+    register: result
d9912c
+    failed_when: not result.changed
d9912c
+
d9912c
+  - name: Ensure sudorule is present, but deny_sudocmdgroup is absent, again.
d9912c
+    ipasudorule:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: testrule1
d9912c
+      deny_sudocmdgroup: test_sudorule
d9912c
       action: member
d9912c
       state: absent
d9912c
     register: result
d9912c
@@ -216,7 +315,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule is absent
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
       state: absent
d9912c
     register: result
d9912c
@@ -224,7 +323,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule is absent, again.
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: testrule1
d9912c
       state: absent
d9912c
     register: result
d9912c
@@ -232,7 +331,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule allhosts is absent
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allhosts
d9912c
       state: absent
d9912c
     register: result
d9912c
@@ -240,7 +339,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule allhosts is absent, again
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allhosts
d9912c
       state: absent
d9912c
     register: result
d9912c
@@ -248,7 +347,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule allusers is absent
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allusers
d9912c
       state: absent
d9912c
     register: result
d9912c
@@ -256,7 +355,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule allusers is absent, again
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allusers
d9912c
       state: absent
d9912c
     register: result
d9912c
@@ -264,7 +363,7 @@
d9912c
 
d9912c
   - name: Ensure sudorule allcommands is absent
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allcommands
d9912c
       state: absent
d9912c
     register: result
d9912c
@@ -272,8 +371,29 @@
d9912c
 
d9912c
   - name: Ensure sudorule allcommands is absent, again
d9912c
     ipasudorule:
d9912c
-      ipaadmin_password: pass1234
d9912c
+      ipaadmin_password: MyPassword123
d9912c
       name: allcommands
d9912c
       state: absent
d9912c
     register: result
d9912c
     failed_when: result.changed
d9912c
+
d9912c
+  # cleanup
d9912c
+  - name : Ensure sudocmdgroup is absent
d9912c
+    ipasudocmdgroup:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: test_sudorule
d9912c
+      state: absent
d9912c
+
d9912c
+  - name: Ensure hostgroup is absent.
d9912c
+    ipahostgroup:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name: cluster
d9912c
+      state: absent
d9912c
+
d9912c
+  - name: Ensure sudocmds are absent
d9912c
+    ipasudocmd:
d9912c
+      ipaadmin_password: MyPassword123
d9912c
+      name:
d9912c
+      - /sbin/ifconfig
d9912c
+      - /usr/bin/vim
d9912c
+      state: absent