mirror of
https://github.com/freeipa/ansible-freeipa.git
synced 2026-05-13 21:12:02 +00:00
Compare commits
38 Commits
v1.14.0
...
validate_e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22700620c6 | ||
|
|
e8688d4cf5 | ||
|
|
d540be425a | ||
|
|
c1d7ed1df6 | ||
|
|
0fc8ddf450 | ||
|
|
012f0deb00 | ||
|
|
f27b0e3011 | ||
|
|
8b4b22dd00 | ||
|
|
91c4b83311 | ||
|
|
6925503a10 | ||
|
|
0da0b22ae7 | ||
|
|
f5f454915c | ||
|
|
8581b79eba | ||
|
|
a9602431ce | ||
|
|
9195494f37 | ||
|
|
81abf6889b | ||
|
|
81906edec6 | ||
|
|
5071653db3 | ||
|
|
df4ec30a51 | ||
|
|
73160a037b | ||
|
|
b7ed9ecfd5 | ||
|
|
a4f608854d | ||
|
|
8e6c5e566d | ||
|
|
431dc8667a | ||
|
|
bc16ccaef7 | ||
|
|
227c95e62e | ||
|
|
5abb515c92 | ||
|
|
1c4b50fa51 | ||
|
|
8fc2de1673 | ||
|
|
8d74fe34ef | ||
|
|
87ad46f7a4 | ||
|
|
4c3f4e6f7d | ||
|
|
489f4d5784 | ||
|
|
29fc03c625 | ||
|
|
651337541a | ||
|
|
e61b8db66c | ||
|
|
2dc1deeb87 | ||
|
|
82a53b9ae4 |
@@ -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
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ FreeIPA versions 4.4.0 and up are supported by the ipaautomountkey module.
|
|||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ FreeIPA versions 4.4.0 and up are supported by the ipaautomountlocation module.
|
|||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ FreeIPA versions 4.4.0 and up are supported by the ipaautomountmap module.
|
|||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
* Some tool to generate a certificate signing request (CSR) might be needed, like `openssl`.
|
* Some tool to generate a certificate signing request (CSR) might be needed, like `openssl`.
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ FreeIPA versions 4.4.0 and up are supported by the ipadnsforwardzone module.
|
|||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -29,7 +33,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FReeIPA version (see above)
|
* Supported FReeIPA version (see above)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ Requirements
|
|||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
|
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -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!)
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
@@ -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**
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ variables:
|
|||||||
ansible_version: "-core >=2.16,<2.17"
|
ansible_version: "-core >=2.16,<2.17"
|
||||||
ansible_latest: "-core"
|
ansible_latest: "-core"
|
||||||
ansible_minimum: "-core <2.16"
|
ansible_minimum: "-core <2.16"
|
||||||
distros: "fedora-latest,c9s,fedora-rawhide"
|
distros: "fedora-latest,c9s,c10s,fedora-rawhide"
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ trigger: none
|
|||||||
pool:
|
pool:
|
||||||
vmImage: 'ubuntu-24.04'
|
vmImage: 'ubuntu-24.04'
|
||||||
|
|
||||||
variables: { distros: "fedora-latest,fedora-rawhide,c9s" }
|
variables: { distros: "fedora-latest,fedora-rawhide,c9s,c10s" }
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ pool:
|
|||||||
|
|
||||||
variables:
|
variables:
|
||||||
# We need to have two sets, as c8s is not supported by all ansible versions
|
# We need to have two sets, as c8s is not supported by all ansible versions
|
||||||
recent_distros: "fedora-latest,fedora-rawhide,c9s"
|
recent_distros: "fedora-latest,fedora-rawhide,c10s,c9s"
|
||||||
distros: "fedora-latest,fedora-rawhide,c9s,c8s"
|
distros: "fedora-latest,fedora-rawhide,c10s,c9s,c8s"
|
||||||
ansible_latest: "-core"
|
ansible_latest: "-core"
|
||||||
ansible_minimum: "-core <2.16"
|
ansible_minimum: "-core <2.16"
|
||||||
ansible_version: "-core >=2.16,<2.17"
|
ansible_version: "-core >=2.16,<2.17"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ pool:
|
|||||||
vmImage: 'ubuntu-20.04'
|
vmImage: 'ubuntu-20.04'
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
distros: "fedora-latest,c9s,c8s,fedora-rawhide"
|
distros: "fedora-latest,c10s,c9s,c8s,fedora-rawhide"
|
||||||
ansible_version: "-core >=2.15,<2.16"
|
ansible_version: "-core >=2.15,<2.16"
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ jobs:
|
|||||||
- script: ansible-galaxy collection install containers.podman
|
- script: ansible-galaxy collection install containers.podman
|
||||||
displayName: Install Ansible Galaxy collections
|
displayName: Install Ansible Galaxy collections
|
||||||
|
|
||||||
- script: infra/image/build.sh -p -s ${{ parameters.distro }}
|
- script: infra/image/build.sh -s ${{ parameters.distro }}
|
||||||
displayName: Build ${{ parameters.distro }} base image
|
displayName: Build ${{ parameters.distro }} base image
|
||||||
env:
|
env:
|
||||||
ANSIBLE_ROLES_PATH: "${PWD}/roles"
|
ANSIBLE_ROLES_PATH: "${PWD}/roles"
|
||||||
|
|||||||
21
infra/azure/templates/variables_c10s.yaml
Normal file
21
infra/azure/templates/variables_c10s.yaml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#
|
||||||
|
# Variables must be defined as comma separated lists.
|
||||||
|
# For easier management of items to enable/disable,
|
||||||
|
# use one test/module on each line, followed by a comma.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# ipa_disabled_modules: >-
|
||||||
|
# dnsconfig,
|
||||||
|
# group,
|
||||||
|
# hostgroup
|
||||||
|
#
|
||||||
|
# If no variables are set, set "empty: true" as at least
|
||||||
|
# one item is needed in the set.
|
||||||
|
---
|
||||||
|
variables:
|
||||||
|
empty: true
|
||||||
|
# ipa_enabled_modules: >-
|
||||||
|
# ipa_enabled_tests: >-
|
||||||
|
# ipa_disabled_modules: >-
|
||||||
|
# ipa_disabled_tests: >-
|
||||||
@@ -15,7 +15,7 @@ valid_distro() {
|
|||||||
usage() {
|
usage() {
|
||||||
local prog="${0##*/}"
|
local prog="${0##*/}"
|
||||||
cat << EOF
|
cat << EOF
|
||||||
usage: ${prog} [-h] [-p] [-n HOSTNAME] [-s] distro
|
usage: ${prog} [-h] [-n HOSTNAME] [-s] distro
|
||||||
${prog} build a container image to test ansible-freeipa.
|
${prog} build a container image to test ansible-freeipa.
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
@@ -41,14 +41,14 @@ cpus="2"
|
|||||||
memory="3g"
|
memory="3g"
|
||||||
quayname="quay.io/ansible-freeipa/upstream-tests"
|
quayname="quay.io/ansible-freeipa/upstream-tests"
|
||||||
deploy_server="N"
|
deploy_server="N"
|
||||||
privileged=""
|
deploy_capabilities="SYS_ADMIN,SYSLOG"
|
||||||
|
capabilities=""
|
||||||
|
|
||||||
while getopts ":hn:ps" option
|
while getopts ":hn:s" option
|
||||||
do
|
do
|
||||||
case "${option}" in
|
case "${option}" in
|
||||||
h) help && exit 0 ;;
|
h) help && exit 0 ;;
|
||||||
n) hostname="${OPTARG}" ;;
|
n) hostname="${OPTARG}" ;;
|
||||||
p) privileged="privileged" ;;
|
|
||||||
s) deploy_server="Y" ;;
|
s) deploy_server="Y" ;;
|
||||||
*) die -u "Invalid option: ${option}" ;;
|
*) die -u "Invalid option: ${option}" ;;
|
||||||
esac
|
esac
|
||||||
@@ -66,6 +66,8 @@ container_check
|
|||||||
|
|
||||||
if [ "${deploy_server}" == "Y" ]
|
if [ "${deploy_server}" == "Y" ]
|
||||||
then
|
then
|
||||||
|
capabilities="${deploy_capabilities}"
|
||||||
|
|
||||||
[ -n "$(command -v "ansible-playbook")" ] || die "ansible-playbook is required to install FreeIPA."
|
[ -n "$(command -v "ansible-playbook")" ] || die "ansible-playbook is required to install FreeIPA."
|
||||||
|
|
||||||
deploy_playbook="${TOPDIR}/playbooks/install-server.yml"
|
deploy_playbook="${TOPDIR}/playbooks/install-server.yml"
|
||||||
@@ -89,7 +91,7 @@ container_create "${name}" "${tag}" \
|
|||||||
"hostname=${hostname}" \
|
"hostname=${hostname}" \
|
||||||
"memory=${memory}" \
|
"memory=${memory}" \
|
||||||
"cpus=${cpus}" \
|
"cpus=${cpus}" \
|
||||||
"${privileged}"
|
"${capabilities:+capabilities=$capabilities}"
|
||||||
container_commit "${name}" "${quayname}:${tag}"
|
container_commit "${name}" "${quayname}:${tag}"
|
||||||
|
|
||||||
if [ "${deploy_server}" == "Y" ]
|
if [ "${deploy_server}" == "Y" ]
|
||||||
|
|||||||
@@ -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; \
|
||||||
@@ -9,7 +9,8 @@ dnf --assumeyes install \
|
|||||||
bash \
|
bash \
|
||||||
systemd \
|
systemd \
|
||||||
procps-ng \
|
procps-ng \
|
||||||
iproute; \
|
iproute \
|
||||||
|
hostname; \
|
||||||
rm -rf /var/cache/dnf/;
|
rm -rf /var/cache/dnf/;
|
||||||
|
|
||||||
RUN (cd /lib/systemd/system/; \
|
RUN (cd /lib/systemd/system/; \
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ container_create() {
|
|||||||
hostname=*) extra_opts+=("--${opt}") ;;
|
hostname=*) extra_opts+=("--${opt}") ;;
|
||||||
cpus=*) extra_opts+=("--${opt}") ;;
|
cpus=*) extra_opts+=("--${opt}") ;;
|
||||||
memory=*) extra_opts+=("--${opt}") ;;
|
memory=*) extra_opts+=("--${opt}") ;;
|
||||||
privileged) extra_opts+=("--${opt}") ;;
|
capabilities=*) extra_opts+=("--cap-add=${opt##*=}") ;;
|
||||||
*) log error "container_create: Invalid option: ${opt}" ;;
|
*) log error "container_create: Invalid option: ${opt}" ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@@ -175,3 +175,23 @@ container_image_list() {
|
|||||||
container_check() {
|
container_check() {
|
||||||
[ -n "$(command -v "podman")" ] || die "podman is required."
|
[ -n "$(command -v "podman")" ] || die "podman is required."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
container_copy() {
|
||||||
|
local name="${1}"
|
||||||
|
local source="${2}"
|
||||||
|
local destination="${3}"
|
||||||
|
|
||||||
|
log info "= Copying ${source} to ${name}:${destination} ="
|
||||||
|
podman cp "${source}" "${name}:${destination}"
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
container_fetch() {
|
||||||
|
local name="${1}"
|
||||||
|
local source="${2}"
|
||||||
|
local destination="${3}"
|
||||||
|
|
||||||
|
log info "= Copying ${name}:${source} to ${destination} ="
|
||||||
|
podman cp "${name}:${source}" "${destination}"
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
requires_ansible: ">=2.15.0"
|
requires_ansible: ">=2.14.0"
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ RETURN = '''
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import (
|
from ansible.module_utils.ansible_freeipa_module import (
|
||||||
IPAAnsibleModule, compare_args_ipa
|
IPAAnsibleModule, compare_args_ipa, ipalib_errors
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -124,7 +124,7 @@ class AutomountMap(IPAAnsibleModule):
|
|||||||
location,
|
location,
|
||||||
{"automountmapname": name, "all": True}
|
{"automountmapname": name, "all": True}
|
||||||
)
|
)
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
return None
|
return None
|
||||||
return response["result"]
|
return response["result"]
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ class AutomountMap(IPAAnsibleModule):
|
|||||||
"""Check if 'name' is an indirect map for 'parentmap'."""
|
"""Check if 'name' is an indirect map for 'parentmap'."""
|
||||||
try:
|
try:
|
||||||
maps = self.ipa_command("automountmap_find", location, {})
|
maps = self.ipa_command("automountmap_find", location, {})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
|
|||||||
@@ -487,6 +487,8 @@ def main():
|
|||||||
|
|
||||||
# revoked
|
# revoked
|
||||||
reason = ansible_module.params_get("revocation_reason")
|
reason = ansible_module.params_get("revocation_reason")
|
||||||
|
if reason is not None:
|
||||||
|
reason = get_revocation_reason(ansible_module, reason)
|
||||||
|
|
||||||
# general
|
# general
|
||||||
serial_number = ansible_module.params.get("serial_number")
|
serial_number = ansible_module.params.get("serial_number")
|
||||||
@@ -521,6 +523,9 @@ def main():
|
|||||||
invalid.append("revocation_reason")
|
invalid.append("revocation_reason")
|
||||||
if state == "revoked":
|
if state == "revoked":
|
||||||
invalid.extend(["certificate_out", "chain"])
|
invalid.extend(["certificate_out", "chain"])
|
||||||
|
# Reason 8 (revomeFromCRL) is the same as release hold
|
||||||
|
if reason == 8:
|
||||||
|
state = "released"
|
||||||
elif state == "held":
|
elif state == "held":
|
||||||
reason = 6 # certificateHold
|
reason = 6 # certificateHold
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
@@ -356,7 +356,7 @@ def config_show(module):
|
|||||||
def get_netbios_name(module):
|
def get_netbios_name(module):
|
||||||
try:
|
try:
|
||||||
_result = module.ipa_command_no_name("trustconfig_show", {"all": True})
|
_result = module.ipa_command_no_name("trustconfig_show", {"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
return None
|
return None
|
||||||
return _result["result"]["ipantflatname"][0]
|
return _result["result"]["ipantflatname"][0]
|
||||||
|
|
||||||
@@ -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 = {}
|
||||||
|
|
||||||
|
|||||||
@@ -124,14 +124,14 @@ RETURN = """
|
|||||||
|
|
||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa
|
IPAAnsibleModule, compare_args_ipa, ipalib_errors
|
||||||
|
|
||||||
|
|
||||||
def find_delegation(module, name):
|
def find_delegation(module, name):
|
||||||
"""Find if a delegation with the given name already exist."""
|
"""Find if a delegation with the given name already exist."""
|
||||||
try:
|
try:
|
||||||
_result = module.ipa_command("delegation_show", name, {"all": True})
|
_result = module.ipa_command("delegation_show", name, {"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if delegation name is not found.
|
# An exception is raised if delegation name is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"]
|
return _result["result"]
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -746,13 +776,25 @@ def main():
|
|||||||
|
|
||||||
(externalmember_add,
|
(externalmember_add,
|
||||||
externalmember_del) = gen_add_del_lists(
|
externalmember_del) = gen_add_del_lists(
|
||||||
externalmember, res_find.get("member_external"))
|
externalmember, (
|
||||||
|
list(res_find.get("member_external", []))
|
||||||
|
+ list(res_find.get("ipaexternalmember", []))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# 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(
|
||||||
@@ -780,9 +822,16 @@ def main():
|
|||||||
service_add = gen_add_list(
|
service_add = gen_add_list(
|
||||||
service, res_find.get("member_service"))
|
service, res_find.get("member_service"))
|
||||||
externalmember_add = gen_add_list(
|
externalmember_add = gen_add_list(
|
||||||
externalmember, res_find.get("member_external"))
|
externalmember, (
|
||||||
|
list(res_find.get("member_external", []))
|
||||||
|
+ list(res_find.get("ipaexternalmember", []))
|
||||||
|
)
|
||||||
|
)
|
||||||
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,
|
||||||
@@ -815,9 +864,16 @@ def main():
|
|||||||
service_del = gen_intersection_list(
|
service_del = gen_intersection_list(
|
||||||
service, res_find.get("member_service"))
|
service, res_find.get("member_service"))
|
||||||
externalmember_del = gen_intersection_list(
|
externalmember_del = gen_intersection_list(
|
||||||
externalmember, res_find.get("member_external"))
|
externalmember, (
|
||||||
|
list(res_find.get("member_external", []))
|
||||||
|
+ list(res_find.get("ipaexternalmember", []))
|
||||||
|
)
|
||||||
|
)
|
||||||
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"))
|
||||||
@@ -860,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."
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ RETURN = """
|
|||||||
|
|
||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa
|
IPAAnsibleModule, compare_args_ipa, ipalib_errors
|
||||||
from ansible.module_utils import six
|
from ansible.module_utils import six
|
||||||
|
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
@@ -168,7 +168,7 @@ def find_idoverridegroup(module, idview, anchor):
|
|||||||
_result = module.ipa_command("idoverridegroup_show", idview,
|
_result = module.ipa_command("idoverridegroup_show", idview,
|
||||||
{"ipaanchoruuid": anchor,
|
{"ipaanchoruuid": anchor,
|
||||||
"all": True})
|
"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if idoverridegroup anchor is not found.
|
# An exception is raised if idoverridegroup anchor is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"]
|
return _result["result"]
|
||||||
|
|||||||
@@ -315,7 +315,8 @@ RETURN = """
|
|||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa, gen_add_del_lists, gen_add_list, \
|
IPAAnsibleModule, compare_args_ipa, gen_add_del_lists, gen_add_list, \
|
||||||
gen_intersection_list, encode_certificate, convert_input_certificates
|
gen_intersection_list, encode_certificate, convert_input_certificates, \
|
||||||
|
ipalib_errors
|
||||||
from ansible.module_utils import six
|
from ansible.module_utils import six
|
||||||
|
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
@@ -328,7 +329,7 @@ def find_idoverrideuser(module, idview, anchor):
|
|||||||
_result = module.ipa_command("idoverrideuser_show", idview,
|
_result = module.ipa_command("idoverrideuser_show", idview,
|
||||||
{"ipaanchoruuid": anchor,
|
{"ipaanchoruuid": anchor,
|
||||||
"all": True})
|
"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if idoverrideuser anchor is not found.
|
# An exception is raised if idoverrideuser anchor is not found.
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@@ -184,7 +184,8 @@ RETURN = """
|
|||||||
|
|
||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa, template_str, urlparse
|
IPAAnsibleModule, compare_args_ipa, template_str, urlparse, \
|
||||||
|
ipalib_errors
|
||||||
from ansible.module_utils import six
|
from ansible.module_utils import six
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
import string
|
import string
|
||||||
@@ -269,7 +270,7 @@ def find_idp(module, name):
|
|||||||
"""Find if a idp with the given name already exist."""
|
"""Find if a idp with the given name already exist."""
|
||||||
try:
|
try:
|
||||||
_result = module.ipa_command("idp_show", name, {"all": True})
|
_result = module.ipa_command("idp_show", name, {"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if idp name is not found.
|
# An exception is raised if idp name is not found.
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@@ -143,7 +143,8 @@ RETURN = """
|
|||||||
|
|
||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa, get_trusted_domain_sid_from_name
|
IPAAnsibleModule, compare_args_ipa, get_trusted_domain_sid_from_name, \
|
||||||
|
ipalib_errors
|
||||||
from ansible.module_utils import six
|
from ansible.module_utils import six
|
||||||
|
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
@@ -154,7 +155,7 @@ def find_idrange(module, name):
|
|||||||
"""Find if a idrange with the given name already exist."""
|
"""Find if a idrange with the given name already exist."""
|
||||||
try:
|
try:
|
||||||
_result = module.ipa_command("idrange_show", name, {"all": True})
|
_result = module.ipa_command("idrange_show", name, {"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if idrange name is not found.
|
# An exception is raised if idrange name is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"]
|
return _result["result"]
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ def find_idview(module, name):
|
|||||||
"""Find if a idview with the given name already exist."""
|
"""Find if a idview with the given name already exist."""
|
||||||
try:
|
try:
|
||||||
_result = module.ipa_command("idview_show", name, {"all": True})
|
_result = module.ipa_command("idview_show", name, {"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if idview name is not found.
|
# An exception is raised if idview name is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"]
|
return _result["result"]
|
||||||
|
|||||||
@@ -76,14 +76,14 @@ RETURN = """
|
|||||||
|
|
||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa
|
IPAAnsibleModule, compare_args_ipa, ipalib_errors
|
||||||
|
|
||||||
|
|
||||||
def find_location(module, name):
|
def find_location(module, name):
|
||||||
"""Find if a location with the given name already exist."""
|
"""Find if a location with the given name already exist."""
|
||||||
try:
|
try:
|
||||||
_result = module.ipa_command("location_show", name, {"all": True})
|
_result = module.ipa_command("location_show", name, {"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if location name is not found.
|
# An exception is raised if location name is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"]
|
return _result["result"]
|
||||||
|
|||||||
@@ -154,14 +154,14 @@ RETURN = """
|
|||||||
|
|
||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa, to_text
|
IPAAnsibleModule, compare_args_ipa, to_text, ipalib_errors
|
||||||
|
|
||||||
|
|
||||||
def find_permission(module, name):
|
def find_permission(module, name):
|
||||||
"""Find if a permission with the given name already exist."""
|
"""Find if a permission with the given name already exist."""
|
||||||
try:
|
try:
|
||||||
_result = module.ipa_command("permission_show", name, {"all": True})
|
_result = module.ipa_command("permission_show", name, {"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if permission name is not found.
|
# An exception is raised if permission name is not found.
|
||||||
return None
|
return None
|
||||||
_res = _result["result"]
|
_res = _result["result"]
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ RETURN = """
|
|||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa, gen_add_del_lists, gen_add_list, \
|
IPAAnsibleModule, compare_args_ipa, gen_add_del_lists, gen_add_list, \
|
||||||
gen_intersection_list
|
gen_intersection_list, ipalib_errors
|
||||||
from ansible.module_utils import six
|
from ansible.module_utils import six
|
||||||
|
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
@@ -135,7 +135,7 @@ def find_privilege(module, name):
|
|||||||
"""Find if a privilege with the given name already exist."""
|
"""Find if a privilege with the given name already exist."""
|
||||||
try:
|
try:
|
||||||
_result = module.ipa_command("privilege_show", name, {"all": True})
|
_result = module.ipa_command("privilege_show", name, {"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if privilege name is not found.
|
# An exception is raised if privilege name is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"]
|
return _result["result"]
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ EXAMPLES = """
|
|||||||
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, gen_add_del_lists, compare_args_ipa, \
|
IPAAnsibleModule, gen_add_del_lists, compare_args_ipa, \
|
||||||
gen_intersection_list, ensure_fqdn
|
gen_intersection_list, ensure_fqdn, ipalib_errors
|
||||||
from ansible.module_utils import six
|
from ansible.module_utils import six
|
||||||
|
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
@@ -140,7 +140,7 @@ def find_role(module, name):
|
|||||||
"""Find if a role with the given name already exist."""
|
"""Find if a role with the given name already exist."""
|
||||||
try:
|
try:
|
||||||
_result = module.ipa_command("role_show", name, {"all": True})
|
_result = module.ipa_command("role_show", name, {"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if role name is not found.
|
# An exception is raised if role name is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"]
|
return _result["result"]
|
||||||
|
|||||||
@@ -113,14 +113,14 @@ RETURN = """
|
|||||||
|
|
||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa
|
IPAAnsibleModule, compare_args_ipa, ipalib_errors
|
||||||
|
|
||||||
|
|
||||||
def find_selfservice(module, name):
|
def find_selfservice(module, name):
|
||||||
"""Find if a selfservice with the given name already exist."""
|
"""Find if a selfservice with the given name already exist."""
|
||||||
try:
|
try:
|
||||||
_result = module.ipa_command("selfservice_show", name, {"all": True})
|
_result = module.ipa_command("selfservice_show", name, {"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if selfservice name is not found.
|
# An exception is raised if selfservice name is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"]
|
return _result["result"]
|
||||||
|
|||||||
@@ -192,14 +192,14 @@ RETURN = """
|
|||||||
|
|
||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, compare_args_ipa, DNSName
|
IPAAnsibleModule, compare_args_ipa, DNSName, ipalib_errors
|
||||||
|
|
||||||
|
|
||||||
def find_server(module, name):
|
def find_server(module, name):
|
||||||
"""Find if a server with the given name already exist."""
|
"""Find if a server with the given name already exist."""
|
||||||
try:
|
try:
|
||||||
_result = module.ipa_command("server_show", name, {"all": True})
|
_result = module.ipa_command("server_show", name, {"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if server name is not found.
|
# An exception is raised if server name is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"]
|
return _result["result"]
|
||||||
@@ -214,7 +214,7 @@ def server_role_status(module, name):
|
|||||||
"include_master": True,
|
"include_master": True,
|
||||||
"raw": True,
|
"raw": True,
|
||||||
"all": True})
|
"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if server name is not found.
|
# An exception is raised if server name is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"][0]
|
return _result["result"][0]
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ def find_servicedelegationrule(module, name):
|
|||||||
try:
|
try:
|
||||||
_result = module.ipa_command("servicedelegationrule_show", name,
|
_result = module.ipa_command("servicedelegationrule_show", name,
|
||||||
{"all": True})
|
{"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if servicedelegationrule name is not found.
|
# An exception is raised if servicedelegationrule name is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"]
|
return _result["result"]
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ RETURN = """
|
|||||||
|
|
||||||
from ansible.module_utils.ansible_freeipa_module import \
|
from ansible.module_utils.ansible_freeipa_module import \
|
||||||
IPAAnsibleModule, gen_add_del_lists, gen_add_list, gen_intersection_list, \
|
IPAAnsibleModule, gen_add_del_lists, gen_add_list, gen_intersection_list, \
|
||||||
servicedelegation_normalize_principals
|
servicedelegation_normalize_principals, ipalib_errors
|
||||||
from ansible.module_utils import six
|
from ansible.module_utils import six
|
||||||
|
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
@@ -118,7 +118,7 @@ def find_servicedelegationtarget(module, name):
|
|||||||
try:
|
try:
|
||||||
_result = module.ipa_command("servicedelegationtarget_show", name,
|
_result = module.ipa_command("servicedelegationtarget_show", name,
|
||||||
{"all": True})
|
{"all": True})
|
||||||
except Exception: # pylint: disable=broad-except
|
except ipalib_errors.NotFound:
|
||||||
# An exception is raised if servicedelegationtarget name is not found.
|
# An exception is raised if servicedelegationtarget name is not found.
|
||||||
return None
|
return None
|
||||||
return _result["result"]
|
return _result["result"]
|
||||||
|
|||||||
@@ -710,7 +710,11 @@ def main():
|
|||||||
|
|
||||||
# Generate addition and removal lists
|
# Generate addition and removal lists
|
||||||
host_add, host_del = gen_add_del_lists(
|
host_add, host_del = gen_add_del_lists(
|
||||||
entry.host, res_find.get('memberhost_host', []))
|
entry.host, (
|
||||||
|
list(res_find.get('memberhost_host', []))
|
||||||
|
+ list(res_find.get('externalhost', []))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
hostgroup_add, hostgroup_del = gen_add_del_lists(
|
hostgroup_add, hostgroup_del = gen_add_del_lists(
|
||||||
entry.hostgroup,
|
entry.hostgroup,
|
||||||
@@ -721,7 +725,11 @@ def main():
|
|||||||
entry.hostmask, res_find.get('hostmask', []))
|
entry.hostmask, res_find.get('hostmask', []))
|
||||||
|
|
||||||
user_add, user_del = gen_add_del_lists(
|
user_add, user_del = gen_add_del_lists(
|
||||||
entry.user, res_find.get('memberuser_user', []))
|
entry.user, (
|
||||||
|
list(res_find.get('memberuser_user', []))
|
||||||
|
+ list(res_find.get('externaluser', []))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
group_add, group_del = gen_add_del_lists(
|
group_add, group_del = gen_add_del_lists(
|
||||||
entry.group, res_find.get('memberuser_group', []))
|
entry.group, res_find.get('memberuser_group', []))
|
||||||
@@ -751,8 +759,7 @@ def main():
|
|||||||
# the provided list against both users and external
|
# the provided list against both users and external
|
||||||
# users list.
|
# users list.
|
||||||
runasuser_add, runasuser_del = gen_add_del_lists(
|
runasuser_add, runasuser_del = gen_add_del_lists(
|
||||||
entry.runasuser,
|
entry.runasuser, (
|
||||||
(
|
|
||||||
list(res_find.get('ipasudorunas_user', []))
|
list(res_find.get('ipasudorunas_user', []))
|
||||||
+ list(res_find.get('ipasudorunasextuser', []))
|
+ list(res_find.get('ipasudorunasextuser', []))
|
||||||
)
|
)
|
||||||
@@ -785,7 +792,11 @@ def main():
|
|||||||
# the sudorule already
|
# the sudorule already
|
||||||
if entry.host is not None:
|
if entry.host is not None:
|
||||||
host_add = gen_add_list(
|
host_add = gen_add_list(
|
||||||
entry.host, res_find.get("memberhost_host"))
|
entry.host, (
|
||||||
|
list(res_find.get("memberhost_host", []))
|
||||||
|
+ list(res_find.get("externalhost", []))
|
||||||
|
)
|
||||||
|
)
|
||||||
if entry.hostgroup is not None:
|
if entry.hostgroup is not None:
|
||||||
hostgroup_add = gen_add_list(
|
hostgroup_add = gen_add_list(
|
||||||
entry.hostgroup,
|
entry.hostgroup,
|
||||||
@@ -796,7 +807,11 @@ def main():
|
|||||||
entry.hostmask, res_find.get("hostmask"))
|
entry.hostmask, res_find.get("hostmask"))
|
||||||
if entry.user is not None:
|
if entry.user is not None:
|
||||||
user_add = gen_add_list(
|
user_add = gen_add_list(
|
||||||
entry.user, res_find.get("memberuser_user"))
|
entry.user, (
|
||||||
|
list(res_find.get('memberuser_user', []))
|
||||||
|
+ list(res_find.get('externaluser', []))
|
||||||
|
)
|
||||||
|
)
|
||||||
if entry.group is not None:
|
if entry.group is not None:
|
||||||
group_add = gen_add_list(
|
group_add = gen_add_list(
|
||||||
entry.group, res_find.get("memberuser_group"))
|
entry.group, res_find.get("memberuser_group"))
|
||||||
@@ -862,7 +877,11 @@ def main():
|
|||||||
# in sudorule
|
# in sudorule
|
||||||
if entry.host is not None:
|
if entry.host is not None:
|
||||||
host_del = gen_intersection_list(
|
host_del = gen_intersection_list(
|
||||||
entry.host, res_find.get("memberhost_host"))
|
entry.host, (
|
||||||
|
list(res_find.get("memberhost_host", []))
|
||||||
|
+ list(res_find.get("externalhost", []))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
if entry.hostgroup is not None:
|
if entry.hostgroup is not None:
|
||||||
hostgroup_del = gen_intersection_list(
|
hostgroup_del = gen_intersection_list(
|
||||||
@@ -876,7 +895,11 @@ def main():
|
|||||||
|
|
||||||
if entry.user is not None:
|
if entry.user is not None:
|
||||||
user_del = gen_intersection_list(
|
user_del = gen_intersection_list(
|
||||||
entry.user, res_find.get("memberuser_user"))
|
entry.user, (
|
||||||
|
list(res_find.get('memberuser_user', []))
|
||||||
|
+ list(res_find.get('externaluser', []))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
if entry.group is not None:
|
if entry.group is not None:
|
||||||
group_del = gen_intersection_list(
|
group_del = gen_intersection_list(
|
||||||
@@ -911,8 +934,7 @@ def main():
|
|||||||
# users list.
|
# users list.
|
||||||
if entry.runasuser is not None:
|
if entry.runasuser is not None:
|
||||||
runasuser_del = gen_intersection_list(
|
runasuser_del = gen_intersection_list(
|
||||||
entry.runasuser,
|
entry.runasuser, (
|
||||||
(
|
|
||||||
list(res_find.get('ipasudorunas_user', []))
|
list(res_find.get('ipasudorunas_user', []))
|
||||||
+ list(res_find.get('ipasudorunasextuser', []))
|
+ list(res_find.get('ipasudorunasextuser', []))
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ galaxy_info:
|
|||||||
description: A role to backup and restore an IPA server
|
description: A role to backup and restore an IPA server
|
||||||
company: Red Hat, Inc
|
company: Red Hat, Inc
|
||||||
license: GPLv3
|
license: GPLv3
|
||||||
min_ansible_version: "2.15"
|
min_ansible_version: "2.14"
|
||||||
platforms:
|
platforms:
|
||||||
- name: Fedora
|
- name: Fedora
|
||||||
versions:
|
versions:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ galaxy_info:
|
|||||||
description: A role to join a machine to an IPA domain
|
description: A role to join a machine to an IPA domain
|
||||||
company: Red Hat, Inc
|
company: Red Hat, Inc
|
||||||
license: GPLv3
|
license: GPLv3
|
||||||
min_ansible_version: "2.15"
|
min_ansible_version: "2.14"
|
||||||
platforms:
|
platforms:
|
||||||
- name: Fedora
|
- name: Fedora
|
||||||
versions:
|
versions:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ Requirements
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
**Controller**
|
**Controller**
|
||||||
* Ansible version: 2.15+
|
* Ansible version: 2.14+
|
||||||
|
|
||||||
**Node**
|
**Node**
|
||||||
* Supported FreeIPA version (see above)
|
* Supported FreeIPA version (see above)
|
||||||
@@ -190,7 +190,7 @@ Variable | Description | Required
|
|||||||
`ipaservers` | This group with the IPA master full qualified hostnames. (list of strings) | mostly
|
`ipaservers` | This group with the IPA master full qualified hostnames. (list of strings) | mostly
|
||||||
`ipareplicas` | Group of IPA replica hostnames. (list of strings) | yes
|
`ipareplicas` | Group of IPA replica hostnames. (list of strings) | yes
|
||||||
`ipaadmin_password` | The password for the IPA admin user (string) | mostly
|
`ipaadmin_password` | The password for the IPA admin user (string) | mostly
|
||||||
`ipareplica_ip_addresses` | The list of master server IP addresses. (list of strings) | no
|
`ipareplica_ip_addresses` | The list of IPA replica IP addresses. (list of strings) | no
|
||||||
`ipareplica_domain` | The primary DNS domain of an existing IPA deployment. (string) | no
|
`ipareplica_domain` | The primary DNS domain of an existing IPA deployment. (string) | no
|
||||||
`ipaserver_realm` | The Kerberos realm of an existing IPA deployment. (string) | no
|
`ipaserver_realm` | The Kerberos realm of an existing IPA deployment. (string) | no
|
||||||
`ipaserver_hostname` | Fully qualified name of the server. (string) | no
|
`ipaserver_hostname` | Fully qualified name of the server. (string) | no
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ options:
|
|||||||
type: str
|
type: str
|
||||||
required: no
|
required: no
|
||||||
ip_addresses:
|
ip_addresses:
|
||||||
description: List of Master Server IP Addresses
|
description: List of IPA replica IP addresses
|
||||||
type: list
|
type: list
|
||||||
elements: str
|
elements: str
|
||||||
required: no
|
required: no
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ options:
|
|||||||
type: str
|
type: str
|
||||||
required: no
|
required: no
|
||||||
ip_addresses:
|
ip_addresses:
|
||||||
description: List of Master Server IP Addresses
|
description: List of IPA replica IP addresses
|
||||||
type: list
|
type: list
|
||||||
elements: str
|
elements: str
|
||||||
required: no
|
required: no
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ options:
|
|||||||
type: str
|
type: str
|
||||||
required: no
|
required: no
|
||||||
ip_addresses:
|
ip_addresses:
|
||||||
description: List of Master Server IP Addresses
|
description: List of IPA replica IP addresses
|
||||||
type: list
|
type: list
|
||||||
elements: str
|
elements: str
|
||||||
required: no
|
required: no
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ options:
|
|||||||
type: str
|
type: str
|
||||||
required: no
|
required: no
|
||||||
ip_addresses:
|
ip_addresses:
|
||||||
description: List of Master Server IP Addresses
|
description: List of IPA replica IP addresses
|
||||||
type: list
|
type: list
|
||||||
elements: str
|
elements: str
|
||||||
required: no
|
required: no
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ options:
|
|||||||
type: str
|
type: str
|
||||||
required: no
|
required: no
|
||||||
ip_addresses:
|
ip_addresses:
|
||||||
description: List of Master Server IP Addresses
|
description: List of IPA replica IP addresses
|
||||||
type: list
|
type: list
|
||||||
elements: str
|
elements: str
|
||||||
required: no
|
required: no
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ short_description: IPA replica deployment tests
|
|||||||
description: IPA replica deployment tests
|
description: IPA replica deployment tests
|
||||||
options:
|
options:
|
||||||
ip_addresses:
|
ip_addresses:
|
||||||
description: List of Master Server IP Addresses
|
description: List of IPA replica IP addresses
|
||||||
type: list
|
type: list
|
||||||
elements: str
|
elements: str
|
||||||
required: no
|
required: no
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ galaxy_info:
|
|||||||
description: A role to setup an IPA domain replica
|
description: A role to setup an IPA domain replica
|
||||||
company: Red Hat, Inc
|
company: Red Hat, Inc
|
||||||
license: GPLv3
|
license: GPLv3
|
||||||
min_ansible_version: "2.15"
|
min_ansible_version: "2.14"
|
||||||
platforms:
|
platforms:
|
||||||
- name: Fedora
|
- name: Fedora
|
||||||
versions:
|
versions:
|
||||||
|
|||||||
@@ -125,6 +125,7 @@
|
|||||||
ipaclient_realm: "{{ result_ipareplica_test.realm | default(omit) }}"
|
ipaclient_realm: "{{ result_ipareplica_test.realm | default(omit) }}"
|
||||||
ipaclient_servers: "{{ ipareplica_servers | default(omit) }}"
|
ipaclient_servers: "{{ ipareplica_servers | default(omit) }}"
|
||||||
ipaclient_hostname: "{{ result_ipareplica_test.hostname }}"
|
ipaclient_hostname: "{{ result_ipareplica_test.hostname }}"
|
||||||
|
ipaclient_ip_addresses: "{{ ipareplica_ip_addresses | default(omit) }}"
|
||||||
ipaclient_install_packages: "{{ ipareplica_install_packages }}"
|
ipaclient_install_packages: "{{ ipareplica_install_packages }}"
|
||||||
when: not result_ipareplica_test.client_enrolled
|
when: not result_ipareplica_test.client_enrolled
|
||||||
|
|
||||||
|
|||||||
@@ -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" ]
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user