mirror of
https://github.com/freeipa/ansible-freeipa.git
synced 2026-05-13 21:12:02 +00:00
Compare commits
14 Commits
v1.14.2
...
validate_e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22700620c6 | ||
|
|
e8688d4cf5 | ||
|
|
d540be425a | ||
|
|
c1d7ed1df6 | ||
|
|
0fc8ddf450 | ||
|
|
012f0deb00 | ||
|
|
f27b0e3011 | ||
|
|
8b4b22dd00 | ||
|
|
91c4b83311 | ||
|
|
6925503a10 | ||
|
|
0da0b22ae7 | ||
|
|
f5f454915c | ||
|
|
8581b79eba | ||
|
|
a9602431ce |
@@ -20,4 +20,9 @@ rules:
|
|||||||
max: 160
|
max: 160
|
||||||
# Disabled rules
|
# Disabled rules
|
||||||
indentation: disable
|
indentation: disable
|
||||||
comments: disable
|
comments:
|
||||||
|
min-spaces-from-content: 1
|
||||||
|
comments-indentation: disable
|
||||||
|
octal-values:
|
||||||
|
forbid-implicit-octal: true
|
||||||
|
forbid-explicit-octal: true
|
||||||
|
|||||||
@@ -8,8 +8,12 @@ The group module allows to ensure presence and absence of groups and members of
|
|||||||
|
|
||||||
The group module is as compatible as possible to the Ansible upstream `ipa_group` module, but additionally offers to add users to a group and also to remove users from a group.
|
The group module is as compatible as possible to the Ansible upstream `ipa_group` module, but additionally offers to add users to a group and also to remove users from a group.
|
||||||
|
|
||||||
## Note
|
|
||||||
Ensuring presence (adding) of several groups with mixed types (`external`, `nonposix` and `posix`) requires a fix in FreeIPA. The module implements a workaround to automatically use `client` context if the fix is not present in the target node FreeIPA and if more than one group is provided to the task using the `groups` parameter. If `ipaapi_context` is forced to be `server`, the module will fail in this case.
|
Notes
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Ensuring presence (adding) of several groups with mixed types (`external`, `nonposix` and `posix`) requires a fix in FreeIPA. The module implements a workaround to automatically use `client` context if the fix is not present in the target node FreeIPA and if more than one group is provided to the task using the `groups` parameter. If `ipaapi_context` is forced to be `server`, the module will fail in this case.
|
||||||
|
* Using `externalmember` or `idoverrideuser` is only supported with `ipaapi_context: server`. With 'client' context, module execution will fail.
|
||||||
|
|
||||||
|
|
||||||
Features
|
Features
|
||||||
@@ -213,7 +217,7 @@ Example playbook to add members from a trusted realm to an external group:
|
|||||||
---
|
---
|
||||||
- name: Playbook to handle groups.
|
- name: Playbook to handle groups.
|
||||||
hosts: ipaserver
|
hosts: ipaserver
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
- name: Create an external group and add members from a trust to it.
|
- name: Create an external group and add members from a trust to it.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
@@ -276,6 +280,7 @@ Example playbook to ensure groups are absent:
|
|||||||
state: absent
|
state: absent
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Variables
|
Variables
|
||||||
=========
|
=========
|
||||||
|
|
||||||
@@ -299,8 +304,8 @@ Variable | Description | Required
|
|||||||
`service` | List of service name strings assigned to this group. Only usable with IPA versions 4.7 and up. | no
|
`service` | List of service name strings assigned to this group. Only usable with IPA versions 4.7 and up. | no
|
||||||
`membermanager_user` | List of member manager users assigned to this group. Only usable with IPA versions 4.8.4 and up. | no
|
`membermanager_user` | List of member manager users assigned to this group. Only usable with IPA versions 4.8.4 and up. | no
|
||||||
`membermanager_group` | List of member manager groups assigned to this group. Only usable with IPA versions 4.8.4 and up. | no
|
`membermanager_group` | List of member manager groups assigned to this group. Only usable with IPA versions 4.8.4 and up. | no
|
||||||
`externalmember` \| `ipaexternalmember` \| `external_member`| List of members of a trusted domain in DOM\\name or name@domain form. | no
|
`externalmember` \| `ipaexternalmember` \| `external_member`| List of members of a trusted domain in DOM\\name or name@domain form. Requires "server" context. | no
|
||||||
`idoverrideuser` | List of user ID overrides to manage. Only usable with IPA versions 4.8.7 and up.| no
|
`idoverrideuser` | List of user ID overrides to manage. Only usable with IPA versions 4.8.7 and up. Requires "server" context. | no
|
||||||
`rename` \| `new_name` | Rename the user object to the new name string. Only usable with `state: renamed`. | no
|
`rename` \| `new_name` | Rename the user object to the new name string. Only usable with `state: renamed`. | no
|
||||||
`action` | Work on group or member level. It can be on of `member` or `group` and defaults to `group`. | no
|
`action` | Work on group or member level. It can be on of `member` or `group` and defaults to `group`. | no
|
||||||
`state` | The state to ensure. It can be one of `present`, `absent` or `renamed`, default: `present`. | yes
|
`state` | The state to ensure. It can be one of `present`, `absent` or `renamed`, default: `present`. | yes
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ Supported Distributions
|
|||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
* RHEL/CentOS 7.4+
|
* RHEL/CentOS 7.4+
|
||||||
* Fedora 26+
|
* Fedora 40+
|
||||||
* Ubuntu
|
* Ubuntu
|
||||||
* Debian 10+ (ipaclient only, no server or replica!)
|
* Debian 10+ (ipaclient only, no server or replica!)
|
||||||
|
|
||||||
@@ -125,7 +125,7 @@ ansible-freeipa/plugins/module_utils to ~/.ansible/plugins/
|
|||||||
|
|
||||||
**RPM package**
|
**RPM package**
|
||||||
|
|
||||||
There are RPM packages available for Fedora 29+. These are installing the roles and modules into the global Ansible directories for `roles`, `plugins/modules` and `plugins/module_utils` in the `/usr/share/ansible` directory. Therefore is it possible to use the roles and modules without adapting the names like it is done in the example playbooks.
|
There are RPM packages available for Fedora. These are installing the roles and modules into the global Ansible directories for `roles`, `plugins/modules` and `plugins/module_utils` in the `/usr/share/ansible` directory. Therefore is it possible to use the roles and modules without adapting the names like it is done in the example playbooks.
|
||||||
|
|
||||||
**Ansible Galaxy**
|
**Ansible Galaxy**
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM quay.io/centos/centos:stream10-development
|
FROM quay.io/centos/centos:stream10
|
||||||
ENV container=podman
|
ENV container=podman
|
||||||
|
|
||||||
RUN rm -fv /var/cache/dnf/metadata_lock.pid; \
|
RUN rm -fv /var/cache/dnf/metadata_lock.pid; \
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
- ip_address: 8.8.8.8
|
- ip_address: 8.8.8.8
|
||||||
- ip_address: 8.8.4.4
|
- ip_address: 8.8.4.4
|
||||||
port: 52
|
port: 52
|
||||||
#serial: 1234
|
# serial: 1234
|
||||||
refresh: 3600
|
refresh: 3600
|
||||||
retry: 900
|
retry: 900
|
||||||
expire: 1209600
|
expire: 1209600
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
dest: "{{ ansible_facts['env'].HOME }}/password.txt"
|
dest: "{{ ansible_facts['env'].HOME }}/password.txt"
|
||||||
owner: "{{ ansible_user }}"
|
owner: "{{ ansible_user }}"
|
||||||
group: "{{ ansible_user }}"
|
group: "{{ ansible_user }}"
|
||||||
mode: 0600
|
mode: "0600"
|
||||||
- name: Ensure symmetric vault exists with password from file.
|
- name: Ensure symmetric vault exists with password from file.
|
||||||
ipavault:
|
ipavault:
|
||||||
ipaadmin_password: SomeADMINpassword
|
ipaadmin_password: SomeADMINpassword
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
dest: "{{ ansible_facts['env'].HOME }}/public.pem"
|
dest: "{{ ansible_facts['env'].HOME }}/public.pem"
|
||||||
owner: "{{ ansible_user }}"
|
owner: "{{ ansible_user }}"
|
||||||
group: "{{ ansible_user }}"
|
group: "{{ ansible_user }}"
|
||||||
mode: 0600
|
mode: "0600"
|
||||||
- name: Ensure asymmetric vault exists with public key from file.
|
- name: Ensure asymmetric vault exists with public key from file.
|
||||||
ipavault:
|
ipavault:
|
||||||
ipaadmin_password: SomeADMINpassword
|
ipaadmin_password: SomeADMINpassword
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ __all__ = ["DEBUG_COMMAND_ALL", "DEBUG_COMMAND_LIST",
|
|||||||
"paths", "tasks", "get_credentials_if_valid", "Encoding",
|
"paths", "tasks", "get_credentials_if_valid", "Encoding",
|
||||||
"DNSName", "getargspec", "certificate_loader",
|
"DNSName", "getargspec", "certificate_loader",
|
||||||
"write_certificate_list", "boolean", "template_str",
|
"write_certificate_list", "boolean", "template_str",
|
||||||
"urlparse", "normalize_sshpubkey"]
|
"urlparse", "normalize_sshpubkey", "Email"]
|
||||||
|
|
||||||
DEBUG_COMMAND_ALL = 0b1111
|
DEBUG_COMMAND_ALL = 0b1111
|
||||||
# Print the while command list:
|
# Print the while command list:
|
||||||
@@ -116,6 +116,7 @@ try:
|
|||||||
from ipalib.krb_utils import get_credentials_if_valid
|
from ipalib.krb_utils import get_credentials_if_valid
|
||||||
from ipapython.dnsutil import DNSName
|
from ipapython.dnsutil import DNSName
|
||||||
from ipapython import kerberos
|
from ipapython import kerberos
|
||||||
|
from ipapython.ipavalidate import Email
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from ipalib.x509 import Encoding
|
from ipalib.x509 import Encoding
|
||||||
@@ -589,6 +590,20 @@ def ensure_fqdn(name, domain):
|
|||||||
return name
|
return name
|
||||||
|
|
||||||
|
|
||||||
|
def convert_to_sid(items):
|
||||||
|
"""Convert all items to SID, if possible."""
|
||||||
|
def get_sid(data):
|
||||||
|
try:
|
||||||
|
return get_trusted_domain_object_sid(data)
|
||||||
|
except ipalib_errors.NotFound:
|
||||||
|
return data
|
||||||
|
if items is None:
|
||||||
|
return None
|
||||||
|
if not isinstance(items, (list, tuple)):
|
||||||
|
items = [items]
|
||||||
|
return [get_sid(item) for item in items]
|
||||||
|
|
||||||
|
|
||||||
def api_get_realm():
|
def api_get_realm():
|
||||||
return api.env.realm
|
return api.env.realm
|
||||||
|
|
||||||
@@ -903,6 +918,13 @@ def get_trusted_domain_sid_from_name(dom_name):
|
|||||||
return unicode(sid) if sid is not None else None
|
return unicode(sid) if sid is not None else None
|
||||||
|
|
||||||
|
|
||||||
|
def get_trusted_domain_object_sid(object_name):
|
||||||
|
"""Given an object name, returns de object SID."""
|
||||||
|
domain_validator = __get_domain_validator()
|
||||||
|
sid = domain_validator.get_trusted_domain_object_sid(object_name)
|
||||||
|
return unicode(sid) if sid is not None else None
|
||||||
|
|
||||||
|
|
||||||
class IPAParamMapping(Mapping):
|
class IPAParamMapping(Mapping):
|
||||||
"""
|
"""
|
||||||
Provides IPA API mapping to playbook parameters or computed values.
|
Provides IPA API mapping to playbook parameters or computed values.
|
||||||
|
|||||||
@@ -344,7 +344,7 @@ config:
|
|||||||
|
|
||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa, ipalib_errors
|
IPAAnsibleModule, compare_args_ipa, ipalib_errors, Email
|
||||||
|
|
||||||
|
|
||||||
def config_show(module):
|
def config_show(module):
|
||||||
@@ -515,6 +515,13 @@ def main():
|
|||||||
msg="Argument '%s' must be between %d and %d."
|
msg="Argument '%s' must be between %d and %d."
|
||||||
% (arg, minimum, maximum))
|
% (arg, minimum, maximum))
|
||||||
|
|
||||||
|
# verify email domain
|
||||||
|
emaildomain = params.get("ipadefaultemaildomain", None)
|
||||||
|
if emaildomain:
|
||||||
|
if not Email("test@{0}".format(emaildomain)):
|
||||||
|
ansible_module.fail_json(
|
||||||
|
msg="Invalid 'emaildomain' value: %s" % emaildomain)
|
||||||
|
|
||||||
changed = False
|
changed = False
|
||||||
exit_args = {}
|
exit_args = {}
|
||||||
|
|
||||||
|
|||||||
@@ -113,13 +113,14 @@ options:
|
|||||||
externalmember:
|
externalmember:
|
||||||
description:
|
description:
|
||||||
- List of members of a trusted domain in DOM\\name or name@domain form.
|
- List of members of a trusted domain in DOM\\name or name@domain form.
|
||||||
|
Requires "server" context.
|
||||||
required: false
|
required: false
|
||||||
type: list
|
type: list
|
||||||
elements: str
|
elements: str
|
||||||
aliases: ["ipaexternalmember", "external_member"]
|
aliases: ["ipaexternalmember", "external_member"]
|
||||||
idoverrideuser:
|
idoverrideuser:
|
||||||
description:
|
description:
|
||||||
- User ID overrides to add
|
- User ID overrides to add. Requires "server" context.
|
||||||
required: false
|
required: false
|
||||||
type: list
|
type: list
|
||||||
elements: str
|
elements: str
|
||||||
@@ -188,13 +189,14 @@ options:
|
|||||||
externalmember:
|
externalmember:
|
||||||
description:
|
description:
|
||||||
- List of members of a trusted domain in DOM\\name or name@domain form.
|
- List of members of a trusted domain in DOM\\name or name@domain form.
|
||||||
|
Requires "server" context.
|
||||||
required: false
|
required: false
|
||||||
type: list
|
type: list
|
||||||
elements: str
|
elements: str
|
||||||
aliases: ["ipaexternalmember", "external_member"]
|
aliases: ["ipaexternalmember", "external_member"]
|
||||||
idoverrideuser:
|
idoverrideuser:
|
||||||
description:
|
description:
|
||||||
- User ID overrides to add
|
- User ID overrides to add. Requires "server" context.
|
||||||
required: false
|
required: false
|
||||||
type: list
|
type: list
|
||||||
elements: str
|
elements: str
|
||||||
@@ -297,6 +299,7 @@ EXAMPLES = """
|
|||||||
posix: yes
|
posix: yes
|
||||||
|
|
||||||
# Create an external group and add members from a trust to it.
|
# Create an external group and add members from a trust to it.
|
||||||
|
# Module will fail if running under 'client' context.
|
||||||
- ipagroup:
|
- ipagroup:
|
||||||
ipaadmin_password: SomeADMINpassword
|
ipaadmin_password: SomeADMINpassword
|
||||||
name: extgroup
|
name: extgroup
|
||||||
@@ -327,7 +330,8 @@ RETURN = """
|
|||||||
from ansible.module_utils._text import to_text
|
from ansible.module_utils._text import to_text
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa, gen_add_del_lists, \
|
IPAAnsibleModule, compare_args_ipa, gen_add_del_lists, \
|
||||||
gen_add_list, gen_intersection_list, api_check_param
|
gen_add_list, gen_intersection_list, api_check_param, \
|
||||||
|
convert_to_sid
|
||||||
from ansible.module_utils import six
|
from ansible.module_utils import six
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
unicode = str
|
unicode = str
|
||||||
@@ -562,21 +566,29 @@ def main():
|
|||||||
# The simple solution is to switch to client context for ensuring
|
# The simple solution is to switch to client context for ensuring
|
||||||
# several groups simply if the user was not explicitly asking for
|
# several groups simply if the user was not explicitly asking for
|
||||||
# the server context no matter if mixed types are used.
|
# the server context no matter if mixed types are used.
|
||||||
context = None
|
context = ansible_module.params_get("ipaapi_context")
|
||||||
if state == "present" and groups is not None and len(groups) > 1 \
|
if state == "present" and groups is not None and len(groups) > 1 \
|
||||||
and not FIX_6741_DEEPCOPY_OBJECTCLASSES:
|
and not FIX_6741_DEEPCOPY_OBJECTCLASSES:
|
||||||
_context = ansible_module.params_get("ipaapi_context")
|
if context is None:
|
||||||
if _context is None:
|
|
||||||
context = "client"
|
context = "client"
|
||||||
ansible_module.debug(
|
ansible_module.debug(
|
||||||
"Switching to client context due to an unfixed issue in "
|
"Switching to client context due to an unfixed issue in "
|
||||||
"your IPA version: https://pagure.io/freeipa/issue/9349")
|
"your IPA version: https://pagure.io/freeipa/issue/9349")
|
||||||
elif _context == "server":
|
elif context == "server":
|
||||||
ansible_module.fail_json(
|
ansible_module.fail_json(
|
||||||
msg="Ensuring several groups with server context is not "
|
msg="Ensuring several groups with server context is not "
|
||||||
"supported by your IPA version: "
|
"supported by your IPA version: "
|
||||||
"https://pagure.io/freeipa/issue/9349")
|
"https://pagure.io/freeipa/issue/9349")
|
||||||
|
|
||||||
|
if (
|
||||||
|
(externalmember is not None
|
||||||
|
or idoverrideuser is not None)
|
||||||
|
and context == "client"
|
||||||
|
):
|
||||||
|
ansible_module.fail_json(
|
||||||
|
msg="Cannot use externalmember in client context."
|
||||||
|
)
|
||||||
|
|
||||||
# Use groups if names is None
|
# Use groups if names is None
|
||||||
if groups is not None:
|
if groups is not None:
|
||||||
names = groups
|
names = groups
|
||||||
@@ -676,6 +688,23 @@ def main():
|
|||||||
# Make sure group exists
|
# Make sure group exists
|
||||||
res_find = find_group(ansible_module, name)
|
res_find = find_group(ansible_module, name)
|
||||||
|
|
||||||
|
# external members must de handled as SID
|
||||||
|
externalmember = convert_to_sid(externalmember)
|
||||||
|
|
||||||
|
# idoverrides need to be compared through SID
|
||||||
|
idoverrideuser_sid = convert_to_sid(idoverrideuser)
|
||||||
|
res_idoverrideuser_sid = convert_to_sid(
|
||||||
|
(res_find or {}).get("member_idoverrideuser", []))
|
||||||
|
idoverride_set = dict(
|
||||||
|
list(zip(idoverrideuser_sid or [], idoverrideuser or [])) +
|
||||||
|
list(
|
||||||
|
zip(
|
||||||
|
res_idoverrideuser_sid or [],
|
||||||
|
(res_find or {}).get("member_idoverrideuser", [])
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
user_add, user_del = [], []
|
user_add, user_del = [], []
|
||||||
group_add, group_del = [], []
|
group_add, group_del = [], []
|
||||||
service_add, service_del = [], []
|
service_add, service_del = [], []
|
||||||
@@ -723,11 +752,12 @@ def main():
|
|||||||
res_find = {}
|
res_find = {}
|
||||||
|
|
||||||
# if we just created/modified the group, update res_find
|
# if we just created/modified the group, update res_find
|
||||||
res_find.setdefault("objectclass", [])
|
classes = list(res_find.setdefault("objectclass", []))
|
||||||
if external and not is_external_group(res_find):
|
if external and not is_external_group(res_find):
|
||||||
res_find["objectclass"].append("ipaexternalgroup")
|
classes.append("ipaexternalgroup")
|
||||||
if posix and not is_posix_group(res_find):
|
if posix and not is_posix_group(res_find):
|
||||||
res_find["objectclass"].append("posixgroup")
|
classes.append("posixgroup")
|
||||||
|
res_find["objectclass"] = classes
|
||||||
|
|
||||||
member_args = gen_member_args(
|
member_args = gen_member_args(
|
||||||
user, group, service, externalmember, idoverrideuser
|
user, group, service, externalmember, idoverrideuser
|
||||||
@@ -752,11 +782,19 @@ def main():
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# There are multiple ways to name an AD User, and any
|
||||||
|
# can be used in idoverrides, so we create the add/del
|
||||||
|
# lists based on SID, and then use the given user name
|
||||||
|
# to the idoverride.
|
||||||
(idoverrides_add,
|
(idoverrides_add,
|
||||||
idoverrides_del) = gen_add_del_lists(
|
idoverrides_del) = gen_add_del_lists(
|
||||||
idoverrideuser,
|
idoverrideuser_sid, res_idoverrideuser_sid)
|
||||||
res_find.get("member_idoverrideuser")
|
idoverrides_add = [
|
||||||
)
|
idoverride_set[sid] for sid in set(idoverrides_add)
|
||||||
|
]
|
||||||
|
idoverrides_del = [
|
||||||
|
idoverride_set[sid] for sid in set(idoverrides_del)
|
||||||
|
]
|
||||||
|
|
||||||
membermanager_user_add, membermanager_user_del = \
|
membermanager_user_add, membermanager_user_del = \
|
||||||
gen_add_del_lists(
|
gen_add_del_lists(
|
||||||
@@ -790,7 +828,10 @@ def main():
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
idoverrides_add = gen_add_list(
|
idoverrides_add = gen_add_list(
|
||||||
idoverrideuser, res_find.get("member_idoverrideuser"))
|
idoverrideuser_sid, res_idoverrideuser_sid)
|
||||||
|
idoverrides_add = [
|
||||||
|
idoverride_set[sid] for sid in set(idoverrides_add)
|
||||||
|
]
|
||||||
|
|
||||||
membermanager_user_add = gen_add_list(
|
membermanager_user_add = gen_add_list(
|
||||||
membermanager_user,
|
membermanager_user,
|
||||||
@@ -829,7 +870,10 @@ def main():
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
idoverrides_del = gen_intersection_list(
|
idoverrides_del = gen_intersection_list(
|
||||||
idoverrideuser, res_find.get("member_idoverrideuser"))
|
idoverrideuser_sid, res_idoverrideuser_sid)
|
||||||
|
idoverrides_del = [
|
||||||
|
idoverride_set[sid] for sid in set(idoverrides_del)
|
||||||
|
]
|
||||||
|
|
||||||
membermanager_user_del = gen_intersection_list(
|
membermanager_user_del = gen_intersection_list(
|
||||||
membermanager_user, res_find.get("membermanager_user"))
|
membermanager_user, res_find.get("membermanager_user"))
|
||||||
@@ -872,7 +916,7 @@ def main():
|
|||||||
if len(externalmember_del) > 0:
|
if len(externalmember_del) > 0:
|
||||||
del_member_args["ipaexternalmember"] = \
|
del_member_args["ipaexternalmember"] = \
|
||||||
externalmember_del
|
externalmember_del
|
||||||
elif externalmember or external:
|
elif externalmember:
|
||||||
ansible_module.fail_json(
|
ansible_module.fail_json(
|
||||||
msg="Cannot add external members to a "
|
msg="Cannot add external members to a "
|
||||||
"non-external group."
|
"non-external group."
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ Supported Distributions
|
|||||||
|
|
||||||
* RHEL/CentOS 7.6+
|
* RHEL/CentOS 7.6+
|
||||||
* CentOS Stream 8+
|
* CentOS Stream 8+
|
||||||
* Fedora 26+
|
* Fedora 40+
|
||||||
* Ubuntu 16.04 and 18.04
|
* Ubuntu 16.04 and 18.04
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Supported Distributions
|
|||||||
|
|
||||||
* RHEL/CentOS 7.4+
|
* RHEL/CentOS 7.4+
|
||||||
* CentOS Stream 8+
|
* CentOS Stream 8+
|
||||||
* Fedora 26+
|
* Fedora 40+
|
||||||
* Ubuntu
|
* Ubuntu
|
||||||
* Debian
|
* Debian
|
||||||
|
|
||||||
|
|||||||
@@ -152,7 +152,7 @@
|
|||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
src: "{{ ipaadmin_keytab }}"
|
src: "{{ ipaadmin_keytab }}"
|
||||||
dest: "{{ keytab_temp.path }}"
|
dest: "{{ keytab_temp.path }}"
|
||||||
mode: 0600
|
mode: "0600"
|
||||||
delegate_to: "{{ result_ipaclient_test.servers[0] }}"
|
delegate_to: "{{ result_ipaclient_test.servers[0] }}"
|
||||||
when: ipaadmin_keytab is defined
|
when: ipaadmin_keytab is defined
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,3 @@
|
|||||||
ipaclient_configure_dns_resolver:
|
ipaclient_configure_dns_resolver:
|
||||||
state: absent
|
state: absent
|
||||||
when: ipaclient_cleanup_dns_resolver | bool
|
when: ipaclient_cleanup_dns_resolver | bool
|
||||||
|
|
||||||
#- name: Remove IPA client package
|
|
||||||
# ansible.builtin.package:
|
|
||||||
# name: "{{ ipaclient_packages }}"
|
|
||||||
# state: absent
|
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
# defaults file for ipaclient
|
|
||||||
# vars/Fedora-25.yml
|
|
||||||
---
|
|
||||||
ipaclient_packages: [ "ipa-client", "libselinux-python" ]
|
|
||||||
#ansible_python_interpreter: '/usr/bin/python2'
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# defaults file for ipaclient
|
|
||||||
# vars/Fedora-26.yml
|
|
||||||
---
|
|
||||||
ipaclient_packages: [ "ipa-client", "libselinux-python" ]
|
|
||||||
#ansible_python_interpreter: '/usr/bin/python2'
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# defaults file for ipaclient
|
|
||||||
# vars/RedHat-7.3.yml
|
|
||||||
---
|
|
||||||
ipaclient_packages: [ "ipa-client", "ipa-admintools", "libselinux-python" ]
|
|
||||||
#ansible_python_interpreter: '/usr/bin/python2'
|
|
||||||
@@ -2,4 +2,3 @@
|
|||||||
# vars/RedHat-7
|
# vars/RedHat-7
|
||||||
---
|
---
|
||||||
ipaclient_packages: [ "ipa-client", "libselinux-python" ]
|
ipaclient_packages: [ "ipa-client", "libselinux-python" ]
|
||||||
#ansible_python_interpreter: '/usr/bin/python2'
|
|
||||||
|
|||||||
@@ -2,4 +2,3 @@
|
|||||||
# vars/default.yml
|
# vars/default.yml
|
||||||
---
|
---
|
||||||
ipaclient_packages: [ "ipa-client", "python3-libselinux" ]
|
ipaclient_packages: [ "ipa-client", "python3-libselinux" ]
|
||||||
#ansible_python_interpreter: '/usr/bin/python3'
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Supported Distributions
|
|||||||
|
|
||||||
* RHEL/CentOS 7.6+
|
* RHEL/CentOS 7.6+
|
||||||
* CentOS Stream 8+
|
* CentOS Stream 8+
|
||||||
* Fedora 26+
|
* Fedora 40+
|
||||||
* Ubuntu 16.04 and 18.04
|
* Ubuntu 16.04 and 18.04
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ ipareplica_no_ui_redirect: no
|
|||||||
ipaclient_mkhomedir: no
|
ipaclient_mkhomedir: no
|
||||||
ipaclient_force_join: no
|
ipaclient_force_join: no
|
||||||
ipaclient_no_ntp: no
|
ipaclient_no_ntp: no
|
||||||
#ipaclient_ssh_trust_dns: no
|
# ipaclient_ssh_trust_dns: no
|
||||||
#ipaclient_no_ssh: no
|
# ipaclient_no_ssh: no
|
||||||
#ipaclient_no_sshd: no
|
# ipaclient_no_sshd: no
|
||||||
#ipaclient_no_dns_sshfp: no
|
# ipaclient_no_dns_sshfp: no
|
||||||
ipaclient_ssh_trust_dns: no
|
ipaclient_ssh_trust_dns: no
|
||||||
### certificate system ###
|
### certificate system ###
|
||||||
ipareplica_skip_schema_check: no
|
ipareplica_skip_schema_check: no
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
# defaults file for ipareplica
|
|
||||||
# vars/Fedora-25.yml
|
|
||||||
---
|
|
||||||
ipareplica_packages: [ "ipa-server", "libselinux-python" ]
|
|
||||||
ipareplica_packages_dns: [ "ipa-server-dns" ]
|
|
||||||
ipareplica_packages_adtrust: [ "ipa-server-trust-ad" ]
|
|
||||||
ipareplica_packages_firewalld: [ "firewalld" ]
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# defaults file for ipareplica
|
|
||||||
# vars/Fedora-26.yml
|
|
||||||
---
|
|
||||||
ipareplica_packages: [ "ipa-server", "libselinux-python" ]
|
|
||||||
ipareplica_packages_dns: [ "ipa-server-dns" ]
|
|
||||||
ipareplica_packages_adtrust: [ "ipa-server-trust-ad" ]
|
|
||||||
ipareplica_packages_firewalld: [ "firewalld" ]
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# defaults file for ipareplica
|
|
||||||
# vars/Fedora-27.yml
|
|
||||||
---
|
|
||||||
ipareplica_packages: [ "ipa-server", "libselinux-python" ]
|
|
||||||
ipareplica_packages_dns: [ "ipa-server-dns" ]
|
|
||||||
ipareplica_packages_adtrust: [ "ipa-server-trust-ad" ]
|
|
||||||
ipareplica_packages_firewalld: [ "firewalld" ]
|
|
||||||
@@ -25,7 +25,7 @@ Supported Distributions
|
|||||||
|
|
||||||
* RHEL/CentOS 7.6+
|
* RHEL/CentOS 7.6+
|
||||||
* CentOS Stream 8+
|
* CentOS Stream 8+
|
||||||
* Fedora 26+
|
* Fedora 40+
|
||||||
* Ubuntu 16.04 and 18.04
|
* Ubuntu 16.04 and 18.04
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,10 +16,10 @@ ipaserver_random_serial_numbers: false
|
|||||||
### client ###
|
### client ###
|
||||||
ipaclient_mkhomedir: no
|
ipaclient_mkhomedir: no
|
||||||
ipaclient_no_ntp: no
|
ipaclient_no_ntp: no
|
||||||
#ipaclient_ssh_trust_dns: no
|
# ipaclient_ssh_trust_dns: no
|
||||||
#ipaclient_no_ssh: no
|
# ipaclient_no_ssh: no
|
||||||
#ipaclient_no_sshd: no
|
# ipaclient_no_sshd: no
|
||||||
#ipaclient_no_dns_sshfp: no
|
# ipaclient_no_dns_sshfp: no
|
||||||
### certificate system ###
|
### certificate system ###
|
||||||
ipaserver_external_ca: no
|
ipaserver_external_ca: no
|
||||||
### dns ###
|
### dns ###
|
||||||
|
|||||||
@@ -54,8 +54,3 @@
|
|||||||
# 1 means that uninstall failed because IPA server was not configured
|
# 1 means that uninstall failed because IPA server was not configured
|
||||||
failed_when: uninstall.rc != 0 and uninstall.rc != 1
|
failed_when: uninstall.rc != 0 and uninstall.rc != 1
|
||||||
changed_when: uninstall.rc == 0
|
changed_when: uninstall.rc == 0
|
||||||
|
|
||||||
#- name: Remove IPA server packages
|
|
||||||
# ansible.builtin.package:
|
|
||||||
# name: "{{ ipaserver_packages }}"
|
|
||||||
# state: absent
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
# defaults file for ipaserver
|
|
||||||
# vars/Fedora-25.yml
|
|
||||||
---
|
|
||||||
ipaserver_packages: [ "ipa-server", "libselinux-python" ]
|
|
||||||
ipaserver_packages_dns: [ "ipa-server-dns" ]
|
|
||||||
ipaserver_packages_adtrust: [ "ipa-server-trust-ad" ]
|
|
||||||
ipaserver_packages_firewalld: [ "firewalld" ]
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# defaults file for ipaserver
|
|
||||||
# vars/Fedora-26.yml
|
|
||||||
---
|
|
||||||
ipaserver_packages: [ "ipa-server", "libselinux-python" ]
|
|
||||||
ipaserver_packages_dns: [ "ipa-server-dns" ]
|
|
||||||
ipaserver_packages_adtrust: [ "ipa-server-trust-ad" ]
|
|
||||||
ipaserver_packages_firewalld: [ "firewalld" ]
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# defaults file for ipaserver
|
|
||||||
# vars/Fedora-27.yml
|
|
||||||
---
|
|
||||||
ipaserver_packages: [ "ipa-server", "libselinux-python" ]
|
|
||||||
ipaserver_packages_dns: [ "ipa-server-dns" ]
|
|
||||||
ipaserver_packages_adtrust: [ "ipa-server-trust-ad" ]
|
|
||||||
ipaserver_packages_firewalld: [ "firewalld" ]
|
|
||||||
@@ -25,7 +25,7 @@ Supported Distributions
|
|||||||
|
|
||||||
* RHEL/CentOS 7.6+
|
* RHEL/CentOS 7.6+
|
||||||
* CentOS Stream 8+
|
* CentOS Stream 8+
|
||||||
* Fedora 26+
|
* Fedora 40+
|
||||||
|
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
|
|||||||
@@ -109,7 +109,7 @@
|
|||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: /etc/sssd/pki
|
path: /etc/sssd/pki
|
||||||
state: directory
|
state: directory
|
||||||
mode: 0711
|
mode: "0711"
|
||||||
|
|
||||||
- name: Ensure /etc/sssd/pki/sssd_auth_ca_db.pem is absent
|
- name: Ensure /etc/sssd/pki/sssd_auth_ca_db.pem is absent
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ Supported Distributions
|
|||||||
|
|
||||||
* RHEL/CentOS 7.6+
|
* RHEL/CentOS 7.6+
|
||||||
* CentOS Stream 8+
|
* CentOS Stream 8+
|
||||||
* Fedora 26+
|
* Fedora 40+
|
||||||
|
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
|
|||||||
@@ -201,7 +201,7 @@
|
|||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: /etc/sssd/pki
|
path: /etc/sssd/pki
|
||||||
state: directory
|
state: directory
|
||||||
mode: 0711
|
mode: "0711"
|
||||||
|
|
||||||
- name: Ensure /etc/sssd/pki/sssd_auth_ca_db.pem is absent
|
- name: Ensure /etc/sssd/pki/sssd_auth_ca_db.pem is absent
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: "/root/ca-less-test"
|
path: "/root/ca-less-test"
|
||||||
state: directory
|
state: directory
|
||||||
mode: 0775
|
mode: "0775"
|
||||||
|
|
||||||
- name: Copy CA certificate
|
- name: Copy CA certificate
|
||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: "/root/ca-less-test"
|
path: "/root/ca-less-test"
|
||||||
state: directory
|
state: directory
|
||||||
mode: 0775
|
mode: "0775"
|
||||||
|
|
||||||
- name: Copy CA certificate
|
- name: Copy CA certificate
|
||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
dest: "/root/host.csr"
|
dest: "/root/host.csr"
|
||||||
content: "{{ host_req.stdout }}"
|
content: "{{ host_req.stdout }}"
|
||||||
mode: 0644
|
mode: "0644"
|
||||||
|
|
||||||
# TESTS
|
# TESTS
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
dest: "/root/user.csr"
|
dest: "/root/user.csr"
|
||||||
content: "{{ user_req.stdout }}"
|
content: "{{ user_req.stdout }}"
|
||||||
mode: 0644
|
mode: "0644"
|
||||||
|
|
||||||
# TESTS
|
# TESTS
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,16 @@
|
|||||||
ipaapi_context: "{{ ipa_context | default(omit) }}"
|
ipaapi_context: "{{ ipa_context | default(omit) }}"
|
||||||
emaildomain: ipa.test
|
emaildomain: ipa.test
|
||||||
|
|
||||||
|
- name: Ensure the default e-mail domain cannot be set to an invalid email domain.
|
||||||
|
ipaconfig:
|
||||||
|
ipaadmin_password: SomeADMINpassword
|
||||||
|
ipaapi_context: "{{ ipa_context | default(omit) }}"
|
||||||
|
emaildomain: invalid@emaildomain
|
||||||
|
register: invalid_emaildomain
|
||||||
|
failed_when:
|
||||||
|
invalid_emaildomain.changed
|
||||||
|
or not (invalid_emaildomain.failed and "Invalid 'emaildomain' value:" in invalid_emaildomain.msg)
|
||||||
|
|
||||||
- name: Set default shell to '/bin/sh'
|
- name: Set default shell to '/bin/sh'
|
||||||
ipaconfig:
|
ipaconfig:
|
||||||
ipaadmin_password: SomeADMINpassword
|
ipaadmin_password: SomeADMINpassword
|
||||||
|
|||||||
@@ -7,6 +7,10 @@
|
|||||||
# ipa_api_version: The installed FreeIPA API version.
|
# ipa_api_version: The installed FreeIPA API version.
|
||||||
#
|
#
|
||||||
---
|
---
|
||||||
|
- name: Ensure minimal facts are available
|
||||||
|
ansible.builtin.setup:
|
||||||
|
gather_subset: dns
|
||||||
|
|
||||||
- name: Retrieving FreeIPA version.
|
- name: Retrieving FreeIPA version.
|
||||||
ansible.builtin.shell:
|
ansible.builtin.shell:
|
||||||
cmd: 'ipa --version | sed -n "s/VERSION: \([^,]*\).*API_VERSION: \([^,]*\).*/\1\\n\2/p"'
|
cmd: 'ipa --version | sed -n "s/VERSION: \([^,]*\).*API_VERSION: \([^,]*\).*/\1\\n\2/p"'
|
||||||
@@ -15,20 +19,31 @@
|
|||||||
- name: Verify if host is an IPA server or client.
|
- name: Verify if host is an IPA server or client.
|
||||||
ansible.builtin.shell:
|
ansible.builtin.shell:
|
||||||
cmd: |
|
cmd: |
|
||||||
echo SomeADMINpassword | kinit -c {{ krb5ccname }} admin
|
echo SomeADMINpassword | kinit -c {{ krb5ccname }} admin >/dev/null
|
||||||
RESULT=$(KRB5CCNAME={{ krb5ccname }} ipa server-show `hostname` && echo SERVER || echo CLIENT)
|
RESULT=$(KRB5CCNAME={{ krb5ccname }} ipa server-show `hostname` >/dev/null && echo SERVER || echo CLIENT)
|
||||||
kdestroy -A -c {{ krb5ccname }}
|
kdestroy -A -c {{ krb5ccname }} >/dev/null
|
||||||
echo $RESULT
|
echo $RESULT
|
||||||
vars:
|
vars:
|
||||||
krb5ccname: "__check_ipa_host_is_client_or_server__"
|
krb5ccname: "__check_ipa_host_is_client_or_server__"
|
||||||
register: output
|
register: check_client
|
||||||
|
|
||||||
|
- name: Verify if AD tests are possible
|
||||||
|
ansible.builtin.shell:
|
||||||
|
cmd: |
|
||||||
|
echo SomeADMINpassword | kinit -c {{ krb5ccname }} admin > /dev/null
|
||||||
|
RESULT=$(KRB5CCNAME={{ krb5ccname }} ipa server-find --all | grep "Enabled server roles")
|
||||||
|
kdestroy -A -c {{ krb5ccname }} > /dev/null
|
||||||
|
echo $RESULT
|
||||||
|
vars:
|
||||||
|
krb5ccname: "__check_ipa_host_is_client_or_server__"
|
||||||
|
register: check_ad_support
|
||||||
|
|
||||||
- name: Set FreeIPA facts.
|
- name: Set FreeIPA facts.
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
ipa_version: "{{ ipa_cmd_version.stdout_lines[0] }}"
|
ipa_version: "{{ ipa_cmd_version.stdout_lines[0] }}"
|
||||||
ipa_api_version: "{{ ipa_cmd_version.stdout_lines[1] }}"
|
ipa_api_version: "{{ ipa_cmd_version.stdout_lines[1] }}"
|
||||||
ipa_host_is_client: "{{ (output.stdout_lines[-1] == 'CLIENT') | bool }}"
|
ipa_host_is_client: "{{ (check_client.stdout_lines[-1] == 'CLIENT') | bool }}"
|
||||||
trust_test_is_supported: no
|
trust_test_is_supported: "{{ 'AD trust agent' in check_ad_support.stdout }}"
|
||||||
|
|
||||||
- name: Ensure ipaserver_domain is set
|
- name: Ensure ipaserver_domain is set
|
||||||
when: ipaserver_domain is not defined
|
when: ipaserver_domain is not defined
|
||||||
@@ -42,3 +57,8 @@
|
|||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
ipaserver_domain: "ipa.test"
|
ipaserver_domain: "ipa.test"
|
||||||
when: "'fqdn' not in ansible_facts"
|
when: "'fqdn' not in ansible_facts"
|
||||||
|
|
||||||
|
- name: Ensure ipaserver_realm is set
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
ipaserver_realm: "{{ ipaserver_domain | upper }}"
|
||||||
|
when: ipaserver_realm is not defined
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
become: true
|
become: true
|
||||||
vars:
|
vars:
|
||||||
ipaserver_external_cert_files_from_controller: "{{ groups.ipaserver[0] + '-chain.crt' }}"
|
ipaserver_external_cert_files_from_controller: "{{ groups.ipaserver[0] + '-chain.crt' }}"
|
||||||
#ipaserver_external_ca_file: "{{ groups.ipaserver[0] + '-cacert.asc' }}"
|
# ipaserver_external_ca_file: "{{ groups.ipaserver[0] + '-cacert.asc' }}"
|
||||||
|
|
||||||
roles:
|
roles:
|
||||||
- role: ipaserver
|
- role: ipaserver
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
become: true
|
become: true
|
||||||
vars:
|
vars:
|
||||||
ipaserver_external_cert_files: "/root/chain.crt"
|
ipaserver_external_cert_files: "/root/chain.crt"
|
||||||
#ipaserver_external_ca_file: "cacert.asc"
|
# ipaserver_external_ca_file: "cacert.asc"
|
||||||
|
|
||||||
pre_tasks:
|
pre_tasks:
|
||||||
- name: Copy "{{ groups.ipaserver[0] + '-chain.crt' }}" to /root/chain.crt on node
|
- name: Copy "{{ groups.ipaserver[0] + '-chain.crt' }}" to /root/chain.crt on node
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
- name: Test group
|
- name: Test group
|
||||||
hosts: "{{ ipa_test_host | default('ipaserver') }}"
|
hosts: "{{ ipa_test_host | default('ipaserver') }}"
|
||||||
become: true
|
become: false
|
||||||
gather_facts: true
|
gather_facts: false
|
||||||
module_defaults:
|
module_defaults:
|
||||||
ipauser:
|
ipauser:
|
||||||
ipaadmin_password: SomeADMINpassword
|
ipaadmin_password: SomeADMINpassword
|
||||||
@@ -10,6 +10,9 @@
|
|||||||
ipagroup:
|
ipagroup:
|
||||||
ipaadmin_password: SomeADMINpassword
|
ipaadmin_password: SomeADMINpassword
|
||||||
ipaapi_context: "{{ ipa_context | default(omit) }}"
|
ipaapi_context: "{{ ipa_context | default(omit) }}"
|
||||||
|
ipaservice:
|
||||||
|
ipaadmin_password: SomeADMINpassword
|
||||||
|
ipaapi_context: "{{ ipa_context | default(omit) }}"
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
# setup
|
# setup
|
||||||
@@ -51,6 +54,16 @@
|
|||||||
register: result
|
register: result
|
||||||
failed_when: not result.changed or result.failed
|
failed_when: not result.changed or result.failed
|
||||||
|
|
||||||
|
- name: Ensure test service HTTP is present
|
||||||
|
ipaservice:
|
||||||
|
name: "{{ 'HTTP/' + fqdn_at_domain }}"
|
||||||
|
notify: Cleanup http service
|
||||||
|
|
||||||
|
- name: Ensure test service LDAP is present
|
||||||
|
ipaservice:
|
||||||
|
name: "{{ 'ldap/' + fqdn_at_domain }}"
|
||||||
|
notify: Cleanup ldap service
|
||||||
|
|
||||||
# TESTS
|
# TESTS
|
||||||
|
|
||||||
- name: Ensure group1 is present
|
- name: Ensure group1 is present
|
||||||
@@ -298,11 +311,11 @@
|
|||||||
register: result
|
register: result
|
||||||
failed_when: result.changed or result.failed
|
failed_when: result.changed or result.failed
|
||||||
|
|
||||||
#- ipagroup:
|
# - ipagroup:
|
||||||
# name: group1
|
# name: group1
|
||||||
# user:
|
# user:
|
||||||
# - user7
|
# - user7
|
||||||
# action: member
|
# action: member
|
||||||
|
|
||||||
- name: Ensure user user7 is absent in group group1
|
- name: Ensure user user7 is absent in group group1
|
||||||
ipagroup:
|
ipagroup:
|
||||||
@@ -437,3 +450,16 @@
|
|||||||
state: absent
|
state: absent
|
||||||
register: result
|
register: result
|
||||||
failed_when: not result.changed or result.failed
|
failed_when: not result.changed or result.failed
|
||||||
|
|
||||||
|
# ansible-lint is complaining on the use of 'when' and requiring
|
||||||
|
# the use of handlers.
|
||||||
|
handlers:
|
||||||
|
- name: Cleanup http service
|
||||||
|
ipaservice:
|
||||||
|
name: "{{ 'HTTP/' + fqdn_at_domain }}"
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- name: Cleanup ldap service
|
||||||
|
ipaservice:
|
||||||
|
name: "{{ 'ldap/' + fqdn_at_domain }}"
|
||||||
|
state: absent
|
||||||
|
|||||||
73
tests/group/test_group_ad_users.yml
Normal file
73
tests/group/test_group_ad_users.yml
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
---
|
||||||
|
- name: Test group AD external members idempotence
|
||||||
|
hosts: ipaserver
|
||||||
|
become: false
|
||||||
|
gather_facts: false
|
||||||
|
module_defaults:
|
||||||
|
ipagroup:
|
||||||
|
ipaadmin_password: SomeADMINpassword
|
||||||
|
ipaapi_context: server # external_member requires 'server' context
|
||||||
|
|
||||||
|
vars:
|
||||||
|
ad_user: "{{ test_ad_user | default('AD\\aduser') }}"
|
||||||
|
alt_user: "{{ test_alt_user | default('aduser@ad.ipa.test') }}"
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Include tasks ../env_freeipa_facts.yml
|
||||||
|
ansible.builtin.include_tasks: ../env_freeipa_facts.yml
|
||||||
|
|
||||||
|
- name: Ensure test group is absent.
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- name: Execute group tests if trust test environment is supported
|
||||||
|
when: trust_test_is_supported | default(false)
|
||||||
|
block:
|
||||||
|
- name: Ensure external group, with AD users, is present.
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
external: true
|
||||||
|
external_member: "{{ ad_user }}"
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
|
- name: Ensure external group, with AD users, is present, again
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
external: true
|
||||||
|
external_member: "{{ ad_user }}"
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
|
- name: Ensure external group, with alternate name AD users, is present
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
external: true
|
||||||
|
external_member: "{{ alt_user }}"
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
|
- name: Ensure external_member is absent
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
external_member: "{{ ad_user }}"
|
||||||
|
action: member
|
||||||
|
state: absent
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
|
- name: Ensure external_member is absent, again
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
external_member: "{{ alt_user }}"
|
||||||
|
action: member
|
||||||
|
state: absent
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
|
always:
|
||||||
|
- name: Cleanup environment.
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
state: absent
|
||||||
@@ -4,6 +4,9 @@
|
|||||||
become: no
|
become: no
|
||||||
gather_facts: no
|
gather_facts: no
|
||||||
|
|
||||||
|
vars:
|
||||||
|
ad_user: "{{ test_ad_user | default('AD\\aduser') }}"
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
- name: Include FreeIPA facts.
|
- name: Include FreeIPA facts.
|
||||||
ansible.builtin.include_tasks: ../env_freeipa_facts.yml
|
ansible.builtin.include_tasks: ../env_freeipa_facts.yml
|
||||||
@@ -18,6 +21,16 @@
|
|||||||
failed_when: not (result.failed and result.msg is regex("No module named '*ipaserver'*"))
|
failed_when: not (result.failed and result.msg is regex("No module named '*ipaserver'*"))
|
||||||
when: ipa_host_is_client
|
when: ipa_host_is_client
|
||||||
|
|
||||||
|
- name: Ensuref fail if externalmember is used in client context.
|
||||||
|
ipagroup:
|
||||||
|
ipaadmin_password: SomeADMINpassword
|
||||||
|
ipaapi_context: client
|
||||||
|
name: ThisShouldNotWork
|
||||||
|
external_member: "{{ ad_user }}"
|
||||||
|
external: true
|
||||||
|
register: result
|
||||||
|
failed_when: not (result.failed and result.msg == "Cannot use externalmember in client context.")
|
||||||
|
|
||||||
# Import basic module tests, and execute with ipa_context set to 'client'.
|
# Import basic module tests, and execute with ipa_context set to 'client'.
|
||||||
# If ipaclients is set, it will be executed using the client, if not,
|
# If ipaclients is set, it will be executed using the client, if not,
|
||||||
# ipaserver will be used.
|
# ipaserver will be used.
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
---
|
---
|
||||||
- name: Find trust
|
- name: Test groups with external members
|
||||||
hosts: ipaserver
|
hosts: "{{ ipa_test_host | default('ipaserver') }}"
|
||||||
become: false
|
become: false
|
||||||
gather_facts: false
|
gather_facts: false
|
||||||
module_defaults:
|
module_defaults:
|
||||||
ipagroup:
|
ipagroup:
|
||||||
ipaadmin_password: SomeADMINpassword
|
ipaadmin_password: SomeADMINpassword
|
||||||
ipaapi_context: "{{ ipa_context | default(omit) }}"
|
ipaapi_context: server # external_member requires 'server' context
|
||||||
|
|
||||||
|
vars:
|
||||||
|
ad_user: "{{ test_ad_user | default('AD\\aduser') }}"
|
||||||
|
alt_user: "{{ test_alt_user | default('aduser@ad.ipa.test') }}"
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
|
|
||||||
@@ -24,86 +28,121 @@
|
|||||||
when: trust_test_is_supported | default(false)
|
when: trust_test_is_supported | default(false)
|
||||||
block:
|
block:
|
||||||
|
|
||||||
- name: Add nonposix group.
|
- name: Ensure nonposix group is present
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup
|
name: extgroup
|
||||||
nonposix: true
|
nonposix: true
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
- name: Set group to be external
|
- name: Ensure nonposix group is present, again
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
nonposix: true
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
|
- name: Ensure nonposix group is external
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup
|
name: extgroup
|
||||||
external: true
|
external: true
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
- name: Add AD users to group
|
- name: Ensure nonposix group has AD users
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup
|
name: extgroup
|
||||||
external_member: "AD\\Domain Users"
|
external_member: "{{ ad_user }}"
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
- name: Add AD users to group, again
|
- name: Ensure nonposix group has AD users, again
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup
|
name: extgroup
|
||||||
external_member: "AD\\Domain Users"
|
external_member: "{{ ad_user }}"
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or result.changed
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
- name: Remove external group
|
- name: Ensure nonposix group is absent.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup
|
name: extgroup
|
||||||
state: absent
|
state: absent
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
- name: Add nonposix, external group, with AD users.
|
- name: Ensure nonposix group is absent, again.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup
|
name: extgroup
|
||||||
nonposix: true
|
state: absent
|
||||||
external: true
|
|
||||||
external_member: "AD\\Domain Users"
|
|
||||||
register: result
|
|
||||||
failed_when: result.failed or not result.changed
|
|
||||||
|
|
||||||
- name: Add nonposix, external group, with AD users, again.
|
|
||||||
ipagroup:
|
|
||||||
name: extgroup
|
|
||||||
nonposix: true
|
|
||||||
external: true
|
|
||||||
external_member: "AD\\Domain Users"
|
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or result.changed
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
- name: Remove group
|
- name: Ensure external group is present, with AD users.
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
external: true
|
||||||
|
external_member: "{{ ad_user }}"
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
|
- name: Ensure external group is present, with AD alternate users.
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
external: true
|
||||||
|
external_member: "{{ alt_user }}"
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
|
- name: Ensure external group is present, with AD users, again.
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
external: true
|
||||||
|
external_member: "{{ ad_user }}"
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
|
- name: Ensure external group is absent
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup
|
name: extgroup
|
||||||
state: absent
|
state: absent
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
- name: Add nonposix group.
|
- name: Ensure external group is absent, again
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
state: absent
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
|
- name: Ensure nonposix group is present.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup
|
name: extgroup
|
||||||
nonposix: true
|
nonposix: true
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
- name: Set group to be external, and add users.
|
- name: Ensure group is external, and has AD users.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup
|
name: extgroup
|
||||||
external: true
|
external: true
|
||||||
external_member: "AD\\Domain Users"
|
external_member: "{{ ad_user }}"
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
- name: Set group to be external, and add users, again.
|
- name: Ensure group is external, and has AD alternate users.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup
|
name: extgroup
|
||||||
external: true
|
external: true
|
||||||
external_member: "AD\\Domain Users"
|
external_member: "{{ alt_user }}"
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
|
- name: Ensure group is external, and has AD users, again.
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup
|
||||||
|
external: true
|
||||||
|
external_member: "{{ ad_user }}"
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or result.changed
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
@@ -117,7 +156,7 @@
|
|||||||
- name: Ensure external group members are present
|
- name: Ensure external group members are present
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup_members
|
name: extgroup_members
|
||||||
external_member: "AD\\Domain Users"
|
external_member: "{{ ad_user }}"
|
||||||
action: member
|
action: member
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
@@ -125,7 +164,7 @@
|
|||||||
- name: Ensure external group members are present, again
|
- name: Ensure external group members are present, again
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup_members
|
name: extgroup_members
|
||||||
external_member: "AD\\Domain Users"
|
external_member: "{{ ad_user }}"
|
||||||
action: member
|
action: member
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or result.changed
|
failed_when: result.failed or result.changed
|
||||||
@@ -133,16 +172,25 @@
|
|||||||
- name: Ensure external group members are absent
|
- name: Ensure external group members are absent
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup_members
|
name: extgroup_members
|
||||||
external_member: "AD\\Domain Users"
|
external_member: "{{ ad_user }}"
|
||||||
action: member
|
action: member
|
||||||
state: absent
|
state: absent
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
|
- name: Ensure external group alternate members are absent
|
||||||
|
ipagroup:
|
||||||
|
name: extgroup_members
|
||||||
|
external_member: "{{ alt_user }}"
|
||||||
|
action: member
|
||||||
|
state: absent
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
- name: Ensure external group members are absent, again
|
- name: Ensure external group members are absent, again
|
||||||
ipagroup:
|
ipagroup:
|
||||||
name: extgroup_members
|
name: extgroup_members
|
||||||
external_member: "AD\\Domain Users"
|
external_member: "{{ ad_user }}"
|
||||||
action: member
|
action: member
|
||||||
state: absent
|
state: absent
|
||||||
register: result
|
register: result
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
---
|
---
|
||||||
- name: Test group
|
- name: Test group idoverrideuser
|
||||||
hosts: ipaserver
|
hosts: ipaserver
|
||||||
become: yes
|
become: false
|
||||||
gather_facts: yes
|
gather_facts: false
|
||||||
|
module_defaults:
|
||||||
|
ipagroup:
|
||||||
|
ipaadmin_password: SomeADMINpassword
|
||||||
|
ipaidoverrideuser:
|
||||||
|
ipaadmin_password: SomeADMINpassword
|
||||||
|
|
||||||
vars:
|
vars:
|
||||||
ad_user: "{{ test_ad_user | default('AD\\aduser') }}"
|
ad_user: "{{ test_ad_user | default('AD\\aduser') }}"
|
||||||
ad_domain: "{{ test_ad_domain | default('ad.ipa.test') }}"
|
alt_user: "{{ test_alt_user | default('aduser@ad.ipa.test') }}"
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
- name: Include tasks ../env_freeipa_facts.yml
|
- name: Include tasks ../env_freeipa_facts.yml
|
||||||
@@ -15,38 +20,42 @@
|
|||||||
- name: Execute tests if ipa_verison >= 4.8.7 and trust test environment is supported
|
- name: Execute tests if ipa_verison >= 4.8.7 and trust test environment is supported
|
||||||
when: ipa_version is version("4.8.7", ">=") and trust_test_is_supported | default(false)
|
when: ipa_version is version("4.8.7", ">=") and trust_test_is_supported | default(false)
|
||||||
block:
|
block:
|
||||||
- name: Create idoverrideuser.
|
- name: Ensure test idoverrideuser is present
|
||||||
ansible.builtin.shell: |
|
ipaidoverrideuser:
|
||||||
kinit -c idoverride_cache admin <<< SomeADMINpassword
|
idview: "Default Trust View"
|
||||||
ipa idoverrideuser-add "Default Trust View" {{ ad_user }}
|
anchor: "{{ ad_user }}"
|
||||||
kdestroy -A -q -c idoverride_cache
|
register: result
|
||||||
|
failed_when: result.failed and "no modifications to be performed" not in result.msg
|
||||||
|
|
||||||
- name: Remove testing groups.
|
- name: Ensure test groups are absent
|
||||||
ipagroup:
|
ipagroup:
|
||||||
ipaadmin_password: SomeADMINpassword
|
|
||||||
name:
|
name:
|
||||||
- idovergroup
|
- idovergroup
|
||||||
state: absent
|
state: absent
|
||||||
|
|
||||||
- name: Add group with idoverrideuser.
|
- name: Ensure group with idoverrideuser is present.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
ipaadmin_password: SomeADMINpassword
|
|
||||||
name: idovergroup
|
name: idovergroup
|
||||||
idoverrideuser: "{{ ad_user }}"
|
idoverrideuser: "{{ ad_user }}"
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
- name: Add group with idoverrideuser, again.
|
- name: Ensure group with idoverrideuser is present, again.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
ipaadmin_password: SomeADMINpassword
|
|
||||||
name: idovergroup
|
name: idovergroup
|
||||||
idoverrideuser: "{{ ad_user }}"
|
idoverrideuser: "{{ ad_user }}"
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or result.changed
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
- name: Remove idoverrideuser member.
|
- name: Ensure group with alternative idoverrideuser is present.
|
||||||
|
ipagroup:
|
||||||
|
name: idovergroup
|
||||||
|
idoverrideuser: "{{ alt_user }}"
|
||||||
|
register: result
|
||||||
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
|
- name: Ensure idoverrideuser member is absent.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
ipaadmin_password: SomeADMINpassword
|
|
||||||
name: idovergroup
|
name: idovergroup
|
||||||
idoverrideuser: "{{ ad_user }}"
|
idoverrideuser: "{{ ad_user }}"
|
||||||
action: member
|
action: member
|
||||||
@@ -54,9 +63,8 @@
|
|||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
- name: Remove idoverrideuser member, again.
|
- name: Ensure idoverrideuser member is absent, again.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
ipaadmin_password: SomeADMINpassword
|
|
||||||
name: idovergroup
|
name: idovergroup
|
||||||
idoverrideuser: "{{ ad_user }}"
|
idoverrideuser: "{{ ad_user }}"
|
||||||
action: member
|
action: member
|
||||||
@@ -64,7 +72,7 @@
|
|||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or result.changed
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
- name: Add idoverrideuser member.
|
- name: Ensure idoverrideuser member is present.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
ipaadmin_password: SomeADMINpassword
|
ipaadmin_password: SomeADMINpassword
|
||||||
name: idovergroup
|
name: idovergroup
|
||||||
@@ -73,7 +81,7 @@
|
|||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or not result.changed
|
failed_when: result.failed or not result.changed
|
||||||
|
|
||||||
- name: Add idoverrideuser member, again.
|
- name: Ensure idoverrideuser member is present, again.
|
||||||
ipagroup:
|
ipagroup:
|
||||||
ipaadmin_password: SomeADMINpassword
|
ipaadmin_password: SomeADMINpassword
|
||||||
name: idovergroup
|
name: idovergroup
|
||||||
@@ -82,24 +90,17 @@
|
|||||||
register: result
|
register: result
|
||||||
failed_when: result.failed or result.changed
|
failed_when: result.failed or result.changed
|
||||||
|
|
||||||
- name: Cleanup idoverrideuser member.
|
|
||||||
ipagroup:
|
|
||||||
ipaadmin_password: SomeADMINpassword
|
|
||||||
name: idovergroup
|
|
||||||
idoverrideuser: "{{ ad_user }}"
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: Remove testing groups.
|
|
||||||
ipagroup:
|
|
||||||
ipaadmin_password: SomeADMINpassword
|
|
||||||
name:
|
|
||||||
- idovergroup
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
always:
|
always:
|
||||||
|
- name: Remove testing groups.
|
||||||
|
ipagroup:
|
||||||
|
ipaadmin_password: SomeADMINpassword
|
||||||
|
name:
|
||||||
|
- idovergroup
|
||||||
|
state: absent
|
||||||
|
|
||||||
- name: Remove idoverrideuser.
|
- name: Remove idoverrideuser.
|
||||||
ansible.builtin.shell:
|
ipaidoverrideuser:
|
||||||
cmd: |
|
idview: "Default Trust View"
|
||||||
kinit -c idoverride_cache admin <<< SomeADMINpassword
|
anchor: "{{ ad_user }}"
|
||||||
ipa idoverrideuser-del "Default Trust View" {{ ad_user }}
|
continue: true
|
||||||
kdestroy -A -q -c idoverride_cache
|
state: absent
|
||||||
|
|||||||
@@ -191,35 +191,35 @@
|
|||||||
|
|
||||||
# disabled can only be checked with enabled hosts, all hosts above are
|
# disabled can only be checked with enabled hosts, all hosts above are
|
||||||
# not enabled.
|
# not enabled.
|
||||||
#- name: Hosts host1..host6 disabled
|
# - name: Hosts host1..host6 disabled
|
||||||
# ipahost:
|
# ipahost:
|
||||||
# ipaadmin_password: SomeADMINpassword
|
# ipaadmin_password: SomeADMINpassword
|
||||||
# ipaapi_context: "{{ ipa_context | default(omit) }}"
|
# ipaapi_context: "{{ ipa_context | default(omit) }}"
|
||||||
# name:
|
# name:
|
||||||
# - "{{ host1_fqdn }}"
|
# - "{{ host1_fqdn }}"
|
||||||
# - "{{ host2_fqdn }}"
|
# - "{{ host2_fqdn }}"
|
||||||
# - "{{ host3_fqdn }}"
|
# - "{{ host3_fqdn }}"
|
||||||
# - "{{ host4_fqdn }}"
|
# - "{{ host4_fqdn }}"
|
||||||
# - "{{ host5_fqdn }}"
|
# - "{{ host5_fqdn }}"
|
||||||
# - "{{ host6_fqdn }}"
|
# - "{{ host6_fqdn }}"
|
||||||
# state: disabled
|
# state: disabled
|
||||||
# register: result
|
# register: result
|
||||||
# failed_when: not result.changed or result.failed
|
# failed_when: not result.changed or result.failed
|
||||||
#
|
#
|
||||||
#- name: Hosts host1..host6 disabled again
|
# - name: Hosts host1..host6 disabled again
|
||||||
# ipahost:
|
# ipahost:
|
||||||
# ipaadmin_password: SomeADMINpassword
|
# ipaadmin_password: SomeADMINpassword
|
||||||
# ipaapi_context: "{{ ipa_context | default(omit) }}"
|
# ipaapi_context: "{{ ipa_context | default(omit) }}"
|
||||||
# name:
|
# name:
|
||||||
# - "{{ host1_fqdn }}"
|
# - "{{ host1_fqdn }}"
|
||||||
# - "{{ host2_fqdn }}"
|
# - "{{ host2_fqdn }}"
|
||||||
# - "{{ host3_fqdn }}"
|
# - "{{ host3_fqdn }}"
|
||||||
# - "{{ host4_fqdn }}"
|
# - "{{ host4_fqdn }}"
|
||||||
# - "{{ host5_fqdn }}"
|
# - "{{ host5_fqdn }}"
|
||||||
# - "{{ host6_fqdn }}"
|
# - "{{ host6_fqdn }}"
|
||||||
# state: disabled
|
# state: disabled
|
||||||
# register: result
|
# register: result
|
||||||
# failed_when: result.changed or result.failed
|
# failed_when: result.changed or result.failed
|
||||||
|
|
||||||
- name: Hosts host1..host6 absent
|
- name: Hosts host1..host6 absent
|
||||||
ipahost:
|
ipahost:
|
||||||
|
|||||||
@@ -16,7 +16,8 @@
|
|||||||
ipaidoverrideuser:
|
ipaidoverrideuser:
|
||||||
ipaadmin_password: SomeADMINpassword
|
ipaadmin_password: SomeADMINpassword
|
||||||
ipaapi_context: server
|
ipaapi_context: server
|
||||||
name: ThisShouldNotWork
|
idview: ThisShouldNotWork
|
||||||
|
anchor: ThisShouldNotWork
|
||||||
register: result
|
register: result
|
||||||
failed_when: not (result.failed and result.msg is regex("No module named '*ipaserver'*"))
|
failed_when: not (result.failed and result.msg is regex("No module named '*ipaserver'*"))
|
||||||
when: ipa_host_is_client
|
when: ipa_host_is_client
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
first: pinky
|
first: pinky
|
||||||
last: Acme
|
last: Acme
|
||||||
initials: pa
|
initials: pa
|
||||||
#password: foo2
|
# password: foo2
|
||||||
principal: pa
|
principal: pa
|
||||||
random: yes
|
random: yes
|
||||||
street: PinkyStreet
|
street: PinkyStreet
|
||||||
@@ -73,8 +73,8 @@
|
|||||||
# sshpubkey
|
# sshpubkey
|
||||||
userauthtype: password,radius,otp
|
userauthtype: password,radius,otp
|
||||||
userclass: PinkyUserClass
|
userclass: PinkyUserClass
|
||||||
#radius: "http://some.link/"
|
# radius: "http://some.link/"
|
||||||
#radiususer: PinkyRadiusUser
|
# radiususer: PinkyRadiusUser
|
||||||
departmentnumber: "1234"
|
departmentnumber: "1234"
|
||||||
employeenumber: "0815"
|
employeenumber: "0815"
|
||||||
employeetype: "PinkyExmployeeType"
|
employeetype: "PinkyExmployeeType"
|
||||||
@@ -82,8 +82,8 @@
|
|||||||
# certificate
|
# certificate
|
||||||
noprivate: yes
|
noprivate: yes
|
||||||
nomembers: false
|
nomembers: false
|
||||||
#issuer: PinkyIssuer
|
# issuer: PinkyIssuer
|
||||||
#subject: PinkySubject
|
# subject: PinkySubject
|
||||||
register: result
|
register: result
|
||||||
failed_when: not result.changed or result.failed
|
failed_when: not result.changed or result.failed
|
||||||
|
|
||||||
|
|||||||
@@ -190,7 +190,7 @@
|
|||||||
first: pinky
|
first: pinky
|
||||||
last: Acme
|
last: Acme
|
||||||
initials: pa
|
initials: pa
|
||||||
#password: foo2
|
# password: foo2
|
||||||
principal: pa
|
principal: pa
|
||||||
random: yes
|
random: yes
|
||||||
street: PinkyStreet
|
street: PinkyStreet
|
||||||
@@ -207,8 +207,8 @@
|
|||||||
# sshpubkey
|
# sshpubkey
|
||||||
userauthtype: password,radius,otp
|
userauthtype: password,radius,otp
|
||||||
userclass: PinkyUserClass
|
userclass: PinkyUserClass
|
||||||
#radius: "http://some.link/"
|
# radius: "http://some.link/"
|
||||||
#radiususer: PinkyRadiusUser
|
# radiususer: PinkyRadiusUser
|
||||||
departmentnumber: "1234"
|
departmentnumber: "1234"
|
||||||
employeenumber: "0815"
|
employeenumber: "0815"
|
||||||
employeetype: "PinkyExmployeeType"
|
employeetype: "PinkyExmployeeType"
|
||||||
@@ -216,8 +216,8 @@
|
|||||||
# certificate
|
# certificate
|
||||||
noprivate: yes
|
noprivate: yes
|
||||||
nomembers: false
|
nomembers: false
|
||||||
#issuer: PinkyIssuer
|
# issuer: PinkyIssuer
|
||||||
#subject: PinkySubject
|
# subject: PinkySubject
|
||||||
register: result
|
register: result
|
||||||
failed_when: not result.changed or result.failed
|
failed_when: not result.changed or result.failed
|
||||||
|
|
||||||
@@ -234,7 +234,7 @@
|
|||||||
first: pinky
|
first: pinky
|
||||||
last: Acme
|
last: Acme
|
||||||
initials: pa
|
initials: pa
|
||||||
#password: foo2
|
# password: foo2
|
||||||
principal: pa
|
principal: pa
|
||||||
random: yes
|
random: yes
|
||||||
street: PinkyStreet
|
street: PinkyStreet
|
||||||
@@ -251,8 +251,8 @@
|
|||||||
# sshpubkey
|
# sshpubkey
|
||||||
userauthtype: password,radius,otp
|
userauthtype: password,radius,otp
|
||||||
userclass: PinkyUserClass
|
userclass: PinkyUserClass
|
||||||
#radius: "http://some.link/"
|
# radius: "http://some.link/"
|
||||||
#radiususer: PinkyRadiusUser
|
# radiususer: PinkyRadiusUser
|
||||||
departmentnumber: "1234"
|
departmentnumber: "1234"
|
||||||
employeenumber: "0815"
|
employeenumber: "0815"
|
||||||
employeetype: "PinkyExmployeeType"
|
employeetype: "PinkyExmployeeType"
|
||||||
@@ -260,8 +260,8 @@
|
|||||||
# certificate
|
# certificate
|
||||||
noprivate: yes
|
noprivate: yes
|
||||||
nomembers: false
|
nomembers: false
|
||||||
#issuer: PinkyIssuer
|
# issuer: PinkyIssuer
|
||||||
#subject: PinkySubject
|
# subject: PinkySubject
|
||||||
register: result
|
register: result
|
||||||
failed_when: result.changed or result.failed
|
failed_when: result.changed or result.failed
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
src: "{{ playbook_dir }}/{{ item }}"
|
src: "{{ playbook_dir }}/{{ item }}"
|
||||||
dest: "{{ ansible_facts['env'].HOME }}/{{ item }}"
|
dest: "{{ ansible_facts['env'].HOME }}/{{ item }}"
|
||||||
mode: 0644
|
mode: "0644"
|
||||||
with_items:
|
with_items:
|
||||||
- A_private.pem
|
- A_private.pem
|
||||||
- A_public.pem
|
- A_public.pem
|
||||||
|
|||||||
Reference in New Issue
Block a user