mirror of
https://github.com/freeipa/ansible-freeipa.git
synced 2026-03-27 05:43:05 +00:00
Compare commits
62 Commits
v0.3.1
...
fix_image_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
408aa69ab0 | ||
|
|
f24390473b | ||
|
|
b598470c2b | ||
|
|
2e5a826ddb | ||
|
|
0e7f4e2b1b | ||
|
|
7a23531047 | ||
|
|
3c666ccdaa | ||
|
|
976cd1baa7 | ||
|
|
5bed0d627b | ||
|
|
630c378ab1 | ||
|
|
0447143047 | ||
|
|
6e45d1ea06 | ||
|
|
be27a615d0 | ||
|
|
e2c6480fe0 | ||
|
|
873b69107e | ||
|
|
e2cb68de54 | ||
|
|
be1720e9ea | ||
|
|
90779ed7ab | ||
|
|
141554bd3d | ||
|
|
dff921039d | ||
|
|
2cc4c27fa3 | ||
|
|
38b3e817ad | ||
|
|
a292645a01 | ||
|
|
6ffc51a75f | ||
|
|
b738085ba4 | ||
|
|
9e912d2bd9 | ||
|
|
71c0972b69 | ||
|
|
5537492f7f | ||
|
|
0cfd07a709 | ||
|
|
fa9f100350 | ||
|
|
17c7872a8b | ||
|
|
69b045322d | ||
|
|
a1f385f017 | ||
|
|
23829c5ec4 | ||
|
|
11e5a2867e | ||
|
|
27a805313e | ||
|
|
29dc21a40c | ||
|
|
14f682ad76 | ||
|
|
7bbb401b9b | ||
|
|
7e04a46f07 | ||
|
|
6f0d183aba | ||
|
|
67179a8c4b | ||
|
|
04e95cfa1e | ||
|
|
8d9e794ddf | ||
|
|
8fc2e6cbb2 | ||
|
|
5634f94efb | ||
|
|
0a3e13b0c3 | ||
|
|
97b06ff6f0 | ||
|
|
f89330a80d | ||
|
|
ba697466a3 | ||
|
|
7415280728 | ||
|
|
3d4affcbf9 | ||
|
|
eba38e30a3 | ||
|
|
bc4564876b | ||
|
|
cef733eba2 | ||
|
|
85bd3f5f20 | ||
|
|
8444e89640 | ||
|
|
0cfc9d0147 | ||
|
|
18c195b052 | ||
|
|
c0321b433b | ||
|
|
e2f3941512 | ||
|
|
1ac93cb736 |
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@@ -30,4 +30,4 @@ jobs:
|
||||
uses: ibiqlik/action-yamllint@v1
|
||||
|
||||
- name: Run Python linters
|
||||
uses: rjeffman/python-lint-action@master
|
||||
uses: rjeffman/python-lint-action@v2
|
||||
|
||||
@@ -4,7 +4,7 @@ repos:
|
||||
rev: v4.3.5
|
||||
hooks:
|
||||
- id: ansible-lint
|
||||
always_run: true
|
||||
always_run: false
|
||||
pass_filenames: true
|
||||
files: \.(yaml|yml)$
|
||||
entry: env ANSIBLE_LIBRARY=./plugins/modules ANSIBLE_MODULE_UTILS=./plugins/module_utils ansible-lint --force-color
|
||||
@@ -12,7 +12,7 @@ repos:
|
||||
rev: v1.25.0
|
||||
hooks:
|
||||
- id: yamllint
|
||||
args: ['.']
|
||||
files: \.(yaml|yml)$
|
||||
- repo: https://gitlab.com/pycqa/flake8
|
||||
rev: 3.8.4
|
||||
hooks:
|
||||
|
||||
@@ -43,7 +43,7 @@ Example playbook to make sure permission "MyPermission" is present:
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: Playbook to create an IPA permission.
|
||||
- name: Playbook to handle IPA permissions
|
||||
hosts: ipaserver
|
||||
become: yes
|
||||
|
||||
@@ -56,39 +56,61 @@ Example playbook to make sure permission "MyPermission" is present:
|
||||
right: all
|
||||
```
|
||||
|
||||
Example playbook to make sure permission "MyPermission" member "privilege" with value "User Administrators" is present:
|
||||
|
||||
Example playbook to ensure permission "MyPermission" is present with attr carlicense:
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: Permission add privilege to a permission
|
||||
- name: Playbook to handle IPA permissions
|
||||
hosts: ipaserver
|
||||
become: true
|
||||
become: yes
|
||||
|
||||
tasks:
|
||||
- name: Ensure permission MyPermission is present with the User Administrators privilege present
|
||||
- name: Ensure permission "MyPermission" is present with attr carlicense
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: MyPermission
|
||||
privilege: "User Administrators"
|
||||
object_type: host
|
||||
right: all
|
||||
attrs:
|
||||
- carlicense
|
||||
```
|
||||
|
||||
|
||||
Example playbook to ensure attr gecos is present in permission "MyPermission":
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: Playbook to handle IPA permissions
|
||||
hosts: ipaserver
|
||||
become: yes
|
||||
|
||||
tasks:
|
||||
- name: Ensure attr gecos is present in permission "MyPermission"
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: MyPermission
|
||||
attrs:
|
||||
- gecos
|
||||
action: member
|
||||
```
|
||||
|
||||
|
||||
Example playbook to make sure permission "MyPermission" member "privilege" with value "User Administrators" is absent:
|
||||
|
||||
Example playbook to ensure attr gecos is absent in permission "MyPermission":
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: Permission remove privilege from a permission
|
||||
- name: Playbook to handle IPA permissions
|
||||
hosts: ipaserver
|
||||
become: true
|
||||
become: yes
|
||||
|
||||
tasks:
|
||||
- name: Ensure permission MyPermission is present without the User Administrators privilege
|
||||
- name: Ensure attr gecos is present in permission "MyPermission"
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: MyPermission
|
||||
privilege: "User Administrators"
|
||||
attrs:
|
||||
- gecos
|
||||
action: member
|
||||
state: absent
|
||||
```
|
||||
@@ -98,27 +120,30 @@ Example playbook to make sure permission "MyPermission" is absent:
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: Playbook to manage IPA permission.
|
||||
- name: Playbook to handle IPA permissions
|
||||
hosts: ipaserver
|
||||
become: yes
|
||||
|
||||
tasks:
|
||||
- ipapermission:
|
||||
- name: Ensure permission "MyPermission" is absent
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: MyPermission
|
||||
state: absent
|
||||
```
|
||||
|
||||
|
||||
Example playbook to make sure permission "MyPermission" is renamed to "MyNewPermission":
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: Playbook to manage IPA permission.
|
||||
- name: Playbook to handle IPA permissions
|
||||
hosts: ipaserver
|
||||
become: yes
|
||||
|
||||
tasks:
|
||||
- ipapermission:
|
||||
- name: Ensure permission "MyPermission" is renamed to "MyNewPermission
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: MyPermission
|
||||
rename: MyNewPermission
|
||||
@@ -126,8 +151,6 @@ Example playbook to make sure permission "MyPermission" is renamed to "MyNewPerm
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
Variables
|
||||
---------
|
||||
|
||||
@@ -140,7 +163,7 @@ Variable | Description | Required
|
||||
`ipaadmin_password` | The admin password is a string and is required if there is no admin ticket available on the node | no
|
||||
`name` \| `cn` | The permission name string. | yes
|
||||
`right` \| `ipapermright` | Rights to grant. It can be a list of one or more of `read`, `search`, `compare`, `write`, `add`, `delete`, and `all` default: `all` | no
|
||||
`attrs` | All attributes to which the permission applies | no
|
||||
`attrs` | All attributes to which the permission applies. | no
|
||||
`bindtype` \| `ipapermbindruletype` | Bind rule type. It can be one of `permission`, `all`, `self`, or `anonymous` defaults to `permission` for new permissions. Bind rule type `self` can only be used on IPA versions 4.8.7 or up.| no
|
||||
`subtree` \| `ipapermlocation` | Subtree to apply permissions to | no
|
||||
`filter` \| `extratargetfilter` | Extra target filter | no
|
||||
@@ -153,10 +176,12 @@ Variable | Description | Required
|
||||
`object_type` | Type of IPA object (sets subtree and objectClass targetfilter) | no
|
||||
`no_members` | Suppress processing of membership | no
|
||||
`rename` | Rename the permission object | no
|
||||
`privilege` | Member Privilege of Permission | no
|
||||
`action` | Work on permission or member level. It can be on of `member` or `permission` and defaults to `permission`. | no
|
||||
`state` | The state to ensure. It can be one of `present`, `absent`, or `renamed` default: `present`. | no
|
||||
|
||||
The `includedattrs` and `excludedattrs` variables are only usable for managed permisions and are not exposed by the module. Using `attrs` for managed permissions will result in the automatic generation of `includedattrs` and `excludedattrs` in the IPA server.
|
||||
|
||||
|
||||
Authors
|
||||
=======
|
||||
|
||||
|
||||
@@ -154,7 +154,7 @@ ipaserver_domain=test.local
|
||||
ipaserver_realm=TEST.LOCAL
|
||||
```
|
||||
|
||||
The admin principle is ```admin``` by default. Please set ```ipaadmin_principal``` if you need to change it.
|
||||
The admin principal is ```admin``` by default. Please set ```ipaadmin_principal``` if you need to change it.
|
||||
|
||||
You can also add more setting here, like for example to enable the DNS server or to set auto-forwarders:
|
||||
```yaml
|
||||
|
||||
@@ -3,7 +3,7 @@ driver:
|
||||
name: docker
|
||||
platforms:
|
||||
- name: centos-8-build
|
||||
image: centos:8
|
||||
image: "centos:centos8"
|
||||
pre_build_image: true
|
||||
hostname: ipaserver.test.local
|
||||
dns_servers:
|
||||
|
||||
@@ -3,7 +3,7 @@ driver:
|
||||
name: docker
|
||||
platforms:
|
||||
- name: fedora-latest-build
|
||||
image: fedora-latest
|
||||
image: "fedora:latest"
|
||||
dockerfile: Dockerfile
|
||||
hostname: ipaserver.test.local
|
||||
dns_servers:
|
||||
|
||||
@@ -25,3 +25,4 @@
|
||||
ipadm_password: SomeDMpassword
|
||||
ipaserver_domain: test.local
|
||||
ipaserver_realm: TEST.LOCAL
|
||||
ipaclient_no_ntp: yes
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Ensure permission TestPerm1 is absent
|
||||
- name: Ensure permission is absent
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: TestPerm1
|
||||
state: absent
|
||||
|
||||
|
||||
@@ -4,11 +4,12 @@
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Ensure permission TestPerm2 is present with Read rights to employeenumber
|
||||
- name: Ensure permission is present with set of rights to attribute employeenumber
|
||||
ipapermission:
|
||||
name: TestPerm2
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: TestPerm1
|
||||
object_type: user
|
||||
perm_rights:
|
||||
right:
|
||||
- read
|
||||
- search
|
||||
- compare
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Ensure privilege User Administrators privilege is absent on Permission TestPerm1
|
||||
- name: Ensure permission privilege, "User Administrators", is absent
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: TestPerm1
|
||||
privilege: "User Administrators"
|
||||
action: member
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Ensure permission TestPerm1 is present with the User Administrators privilege present
|
||||
- name: Ensure permission is present with "User Administrators" privilege
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: TestPerm1
|
||||
privilege: "User Administrators"
|
||||
action: member
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Ensure permission TestPerm1 is present
|
||||
- name: Ensure permission is present
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: TestPerm1
|
||||
object_type: host
|
||||
perm_rights: all
|
||||
right: all
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Ensure permission TestPerm1 is present
|
||||
- name: Ensure permission TestPerm1 is renamed to TestPermRenamed
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: TestPerm1
|
||||
rename: TestPermRenamed
|
||||
state: renamed
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
---
|
||||
- name: Delegation absent
|
||||
- name: Selfservice absent
|
||||
hosts: ipaserver
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Ensure delegation "basic manager attributes" is absent
|
||||
ipadelegation:
|
||||
- name: Ensure selfservice "basic manager attributes" is absent
|
||||
ipaselfservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "basic manager attributes"
|
||||
state: absent
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
---
|
||||
- name: Delegation member absent
|
||||
- name: Selfservice member absent
|
||||
hosts: ipaserver
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Ensure delegation "basic manager attributes" member attributes employeenumber and employeetype are absent
|
||||
ipadelegation:
|
||||
- name: Ensure selfservice "basic manager attributes" member attributes employeenumber and employeetype are absent
|
||||
ipaselfservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "basic manager attributes"
|
||||
attribute:
|
||||
- employeenumber
|
||||
- employeetype
|
||||
- businesscategory
|
||||
- departmentnumber
|
||||
action: member
|
||||
state: absent
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
---
|
||||
- name: Delegation member present
|
||||
- name: Selfservice member present
|
||||
hosts: ipaserver
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Ensure delegation "basic manager attributes" member attribute departmentnumber is present
|
||||
ipadelegation:
|
||||
- name: Ensure selfservice "basic manager attributes" member attribute departmentnumber is present
|
||||
ipaselfservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "basic manager attributes"
|
||||
attribute:
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
---
|
||||
- name: Delegation present
|
||||
- name: Selfservice present
|
||||
hosts: ipaserver
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Ensure delegation "basic manager attributes" is present
|
||||
ipadelegation:
|
||||
- name: Ensure selfservice "basic manager attributes" is present
|
||||
ipaselfservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "basic manager attributes"
|
||||
permission: read
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
tasks:
|
||||
- copy:
|
||||
src: "{{ playbook_dir }}/password.txt"
|
||||
dest: "{{ ansible_env.HOME }}/password.txt"
|
||||
dest: "{{ ansible_facts['env'].HOME }}/password.txt"
|
||||
owner: "{{ ansible_user }}"
|
||||
group: "{{ ansible_user }}"
|
||||
mode: 0600
|
||||
@@ -16,7 +16,7 @@
|
||||
name: symvault
|
||||
username: admin
|
||||
vault_type: symmetric
|
||||
vault_password_file: "{{ ansible_env.HOME }}/password.txt"
|
||||
vault_password_file: "{{ ansible_facts['env'].HOME }}/password.txt"
|
||||
- file:
|
||||
path: "{{ ansible_env.HOME }}/password.txt"
|
||||
path: "{{ ansible_facts['env'].HOME }}/password.txt"
|
||||
state: absent
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
tasks:
|
||||
- copy:
|
||||
src: "{{ playbook_dir }}/public.pem"
|
||||
dest: "{{ ansible_env.HOME }}/public.pem"
|
||||
dest: "{{ ansible_facts['env'].HOME }}/public.pem"
|
||||
owner: "{{ ansible_user }}"
|
||||
group: "{{ ansible_user }}"
|
||||
mode: 0600
|
||||
@@ -21,7 +21,7 @@
|
||||
name: asymvault
|
||||
username: admin
|
||||
vault_type: asymmetric
|
||||
vault_public_key_file: "{{ ansible_env.HOME }}/public.pem"
|
||||
vault_public_key_file: "{{ ansible_facts['env'].HOME }}/public.pem"
|
||||
- file:
|
||||
path: "{{ ansible_env.HOME }}/public.pem"
|
||||
path: "{{ ansible_facts['env'].HOME }}/public.pem"
|
||||
state: absent
|
||||
|
||||
@@ -28,6 +28,7 @@ import os
|
||||
import uuid
|
||||
import tempfile
|
||||
import shutil
|
||||
import netaddr
|
||||
import gssapi
|
||||
from datetime import datetime
|
||||
from pprint import pformat
|
||||
@@ -413,6 +414,24 @@ def is_valid_port(port):
|
||||
return False
|
||||
|
||||
|
||||
def is_ip_address(ipaddr):
|
||||
"""Test if given IP address is a valid IPv4 or IPv6 address."""
|
||||
try:
|
||||
netaddr.IPAddress(str(ipaddr))
|
||||
except (netaddr.AddrFormatError, ValueError):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def is_ip_network_address(ipaddr):
|
||||
"""Test if given IP address is a valid IPv4 or IPv6 address."""
|
||||
try:
|
||||
netaddr.IPNetwork(str(ipaddr))
|
||||
except (netaddr.AddrFormatError, ValueError):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def is_ipv4_addr(ipaddr):
|
||||
"""Test if given IP address is a valid IPv4 address."""
|
||||
try:
|
||||
|
||||
@@ -428,7 +428,8 @@ def main():
|
||||
if params \
|
||||
and not compare_args_ipa(ansible_module, params, res_show):
|
||||
changed = True
|
||||
api_command_no_name(ansible_module, "config_mod", params)
|
||||
if not ansible_module.check_mode:
|
||||
api_command_no_name(ansible_module, "config_mod", params)
|
||||
|
||||
else:
|
||||
rawresult = api_command_no_name(ansible_module, "config_show", {})
|
||||
|
||||
@@ -310,6 +310,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
for name, command, args in commands:
|
||||
|
||||
@@ -233,7 +233,8 @@ def main():
|
||||
# Execute command only if configuration changes.
|
||||
if not compare_args_ipa(ansible_module, args, res_find):
|
||||
try:
|
||||
api_command_no_name(ansible_module, 'dnsconfig_mod', args)
|
||||
if not ansible_module.check_mode:
|
||||
api_command_no_name(ansible_module, 'dnsconfig_mod', args)
|
||||
# If command did not fail, something changed.
|
||||
changed = True
|
||||
|
||||
|
||||
@@ -380,6 +380,12 @@ def main():
|
||||
[name, 'dnsforwardzone_remove_permission', {}]
|
||||
)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0,
|
||||
**exit_args)
|
||||
|
||||
# Execute commands
|
||||
for name, command, args in commands:
|
||||
api_command(ansible_module, command, name, args)
|
||||
changed = True
|
||||
|
||||
@@ -1350,8 +1350,6 @@ def define_commands_for_present_state(module, zone_name, entry, res_find):
|
||||
module, zone_name, name, args[record])
|
||||
_commands.extend(cmds)
|
||||
del args['%s_extra_create_reverse' % ipv]
|
||||
if '%s_ip_address' not in args:
|
||||
del args[record]
|
||||
for record, fields in _RECORD_PARTS.items():
|
||||
part_fields = [f for f in fields if f in args]
|
||||
if part_fields:
|
||||
@@ -1375,10 +1373,9 @@ def define_commands_for_present_state(module, zone_name, entry, res_find):
|
||||
# remove record from args, as it will not be used again.
|
||||
del args[record]
|
||||
else:
|
||||
for f in part_fields:
|
||||
_args = {k: args[k] for k in part_fields}
|
||||
_args['idnsname'] = name
|
||||
_commands.append([zone_name, 'dnsrecord_add', _args])
|
||||
_args = {k: args[k] for k in part_fields if k in args}
|
||||
_args['idnsname'] = name
|
||||
_commands.append([zone_name, 'dnsrecord_add', _args])
|
||||
# clean used fields from args
|
||||
for f in part_fields:
|
||||
if f in args:
|
||||
@@ -1497,6 +1494,10 @@ def main():
|
||||
if cmds:
|
||||
commands.extend(cmds)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
for name, command, args in commands:
|
||||
try:
|
||||
|
||||
@@ -210,9 +210,9 @@ dnszone:
|
||||
from ipapython.dnsutil import DNSName # noqa: E402
|
||||
from ansible.module_utils.ansible_freeipa_module import (
|
||||
FreeIPABaseModule,
|
||||
is_ipv4_addr,
|
||||
is_ipv6_addr,
|
||||
is_valid_port,
|
||||
is_ip_address,
|
||||
is_ip_network_address,
|
||||
is_valid_port
|
||||
) # noqa: E402
|
||||
import ipalib.errors
|
||||
import netaddr
|
||||
@@ -252,7 +252,13 @@ class DNSZoneModule(FreeIPABaseModule):
|
||||
|
||||
def validate_ips(self, ips, error_msg):
|
||||
invalid_ips = [
|
||||
ip for ip in ips if not is_ipv4_addr(ip) or is_ipv6_addr(ip)
|
||||
ip for ip in ips
|
||||
if not any([
|
||||
is_ip_address(ip),
|
||||
is_ip_network_address(ip),
|
||||
ip == "any",
|
||||
ip == "none"
|
||||
])
|
||||
]
|
||||
if any(invalid_ips):
|
||||
self.fail_json(msg=error_msg % invalid_ips)
|
||||
@@ -309,7 +315,7 @@ class DNSZoneModule(FreeIPABaseModule):
|
||||
forwarders = []
|
||||
for forwarder in self.ipa_params.forwarders:
|
||||
ip_address = forwarder.get("ip_address")
|
||||
if not (is_ipv4_addr(ip_address) or is_ipv6_addr(ip_address)):
|
||||
if not (is_ip_address(ip_address)):
|
||||
self.fail_json(
|
||||
msg="Invalid IP for DNS forwarder: %s" % ip_address
|
||||
)
|
||||
|
||||
@@ -616,6 +616,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
for name, command, args in commands:
|
||||
|
||||
@@ -500,6 +500,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
errors = []
|
||||
|
||||
@@ -195,6 +195,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
for name, command, args in commands:
|
||||
|
||||
@@ -300,6 +300,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
errors = []
|
||||
for name, command, args in commands:
|
||||
|
||||
@@ -1347,6 +1347,10 @@ def main():
|
||||
|
||||
del host_set
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
errors = []
|
||||
|
||||
@@ -463,6 +463,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
for name, command, args in commands:
|
||||
try:
|
||||
|
||||
@@ -190,6 +190,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
for name, command, args in commands:
|
||||
|
||||
@@ -102,10 +102,6 @@ options:
|
||||
rename:
|
||||
description: Rename the permission object
|
||||
required: false
|
||||
privilege:
|
||||
description: Member Privilege of Permission
|
||||
required: false
|
||||
type: list
|
||||
action:
|
||||
description: Work on permission or member privilege level.
|
||||
choices: ["permission", "member"]
|
||||
@@ -126,19 +122,6 @@ EXAMPLES = """
|
||||
bindtype: permission
|
||||
object_type: host
|
||||
|
||||
# Ensure permission "NAME" member privilege VALUE is present
|
||||
- ipapermission:
|
||||
name: "Add Automember Rebuild Membership Task"
|
||||
privilege: "Automember Task Administrator"
|
||||
action: member
|
||||
|
||||
# Ensure permission "NAME" member privilege VALUE is absent
|
||||
- ipapermission:
|
||||
name: "Add Automember Rebuild Membership Task"
|
||||
privilege: "IPA Masters Readers"
|
||||
action: member
|
||||
state: absent
|
||||
|
||||
# Ensure permission NAME is absent
|
||||
- ipapermission:
|
||||
name: "Removed Permission Name"
|
||||
@@ -152,8 +135,7 @@ RETURN = """
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.ansible_freeipa_module import \
|
||||
temp_kinit, temp_kdestroy, valid_creds, api_connect, api_command, \
|
||||
compare_args_ipa, module_params_get, gen_add_del_lists, \
|
||||
api_check_ipa_version
|
||||
compare_args_ipa, module_params_get, api_check_ipa_version
|
||||
import six
|
||||
|
||||
if six.PY3:
|
||||
@@ -207,13 +189,6 @@ def gen_args(right, attrs, bindtype, subtree,
|
||||
return _args
|
||||
|
||||
|
||||
def gen_member_args(privilege):
|
||||
_args = {}
|
||||
if privilege is not None:
|
||||
_args["privilege"] = privilege
|
||||
return _args
|
||||
|
||||
|
||||
def main():
|
||||
ansible_module = AnsibleModule(
|
||||
argument_spec=dict(
|
||||
@@ -252,7 +227,6 @@ def main():
|
||||
required=False),
|
||||
no_members=dict(type=bool, default=None, require=False),
|
||||
rename=dict(type="str", default=None, required=False),
|
||||
privilege=dict(type="list", default=None, required=False),
|
||||
|
||||
action=dict(type="str", default="permission",
|
||||
choices=["member", "permission"]),
|
||||
@@ -289,7 +263,6 @@ def main():
|
||||
object_type = module_params_get(ansible_module, "object_type")
|
||||
no_members = module_params_get(ansible_module, "no_members")
|
||||
rename = module_params_get(ansible_module, "rename")
|
||||
privilege = module_params_get(ansible_module, "privilege")
|
||||
action = module_params_get(ansible_module, "action")
|
||||
|
||||
# state
|
||||
@@ -304,10 +277,10 @@ def main():
|
||||
ansible_module.fail_json(
|
||||
msg="Only one permission can be added at a time.")
|
||||
if action == "member":
|
||||
invalid = ["right", "attrs", "bindtype", "subtree",
|
||||
"extra_target_filter", "rawfilter", "target",
|
||||
"targetto", "targetfrom", "memberof", "targetgroup",
|
||||
"object_type", "rename"]
|
||||
invalid = ["bindtype", "target", "targetto", "targetfrom",
|
||||
"subtree", "targetgroup", "object_type", "rename"]
|
||||
else:
|
||||
invalid = ["rename"]
|
||||
|
||||
if state == "renamed":
|
||||
if len(names) != 1:
|
||||
@@ -315,7 +288,7 @@ def main():
|
||||
msg="Only one permission can be renamed at a time.")
|
||||
if action == "member":
|
||||
ansible_module.fail_json(
|
||||
msg="Member Privileges cannot be renamed")
|
||||
msg="Member action can not be used with state 'renamed'")
|
||||
invalid = ["right", "attrs", "bindtype", "subtree",
|
||||
"extra_target_filter", "rawfilter", "target", "targetto",
|
||||
"targetfrom", "memberof", "targetgroup", "object_type",
|
||||
@@ -324,12 +297,12 @@ def main():
|
||||
if state == "absent":
|
||||
if len(names) < 1:
|
||||
ansible_module.fail_json(msg="No name given.")
|
||||
invalid = ["right", "attrs", "bindtype", "subtree",
|
||||
"extra_target_filter", "rawfilter", "target", "targetto",
|
||||
"targetfrom", "memberof", "targetgroup", "object_type",
|
||||
invalid = ["bindtype", "subtree", "target", "targetto",
|
||||
"targetfrom", "targetgroup", "object_type",
|
||||
"no_members", "rename"]
|
||||
if action == "permission":
|
||||
invalid.append("privilege")
|
||||
if action != "member":
|
||||
invalid += ["right", "attrs", "memberof",
|
||||
"extra_target_filter", "rawfilter"]
|
||||
|
||||
for x in invalid:
|
||||
if vars()[x] is not None:
|
||||
@@ -341,6 +314,11 @@ def main():
|
||||
ansible_module.fail_json(
|
||||
msg="Bindtype 'self' is not supported by your IPA version.")
|
||||
|
||||
if all([extra_target_filter, rawfilter]):
|
||||
ansible_module.fail_json(
|
||||
msg="Cannot specify target filter and extra target filter "
|
||||
"simultaneously.")
|
||||
|
||||
# Init
|
||||
|
||||
changed = False
|
||||
@@ -366,11 +344,6 @@ def main():
|
||||
targetto, targetfrom, memberof, targetgroup,
|
||||
object_type, no_members, rename)
|
||||
|
||||
no_members_value = False
|
||||
|
||||
if no_members is not None:
|
||||
no_members_value = no_members
|
||||
|
||||
if action == "permission":
|
||||
# Found the permission
|
||||
if res_find is not None:
|
||||
@@ -383,44 +356,36 @@ def main():
|
||||
else:
|
||||
commands.append([name, "permission_add", args])
|
||||
|
||||
member_args = gen_member_args(privilege)
|
||||
if not compare_args_ipa(ansible_module, member_args,
|
||||
res_find):
|
||||
|
||||
# Generate addition and removal lists
|
||||
privilege_add, privilege_del = gen_add_del_lists(
|
||||
privilege, res_find.get("member_privilege"))
|
||||
|
||||
# Add members
|
||||
if len(privilege_add) > 0:
|
||||
commands.append([name, "permission_add_member",
|
||||
{
|
||||
"privilege": privilege_add,
|
||||
"no_members": no_members_value
|
||||
}])
|
||||
# Remove members
|
||||
if len(privilege_del) > 0:
|
||||
commands.append([name, "permission_remove_member",
|
||||
{
|
||||
"privilege": privilege_del,
|
||||
"no_members": no_members_value
|
||||
}])
|
||||
elif action == "member":
|
||||
if res_find is None:
|
||||
ansible_module.fail_json(
|
||||
msg="No permission '%s'" % name)
|
||||
|
||||
if privilege is None:
|
||||
ansible_module.fail_json(msg="No privilege given")
|
||||
member_attrs = {}
|
||||
check_members = {
|
||||
"attrs": attrs,
|
||||
"memberof": memberof,
|
||||
"ipapermright": right,
|
||||
"ipapermtargetfilter": rawfilter,
|
||||
"extratargetfilter": extra_target_filter,
|
||||
# subtree member management is currently disabled.
|
||||
# "ipapermlocation": subtree,
|
||||
}
|
||||
|
||||
for _member, _member_change in check_members.items():
|
||||
if _member_change is not None:
|
||||
_res_list = res_find[_member]
|
||||
_new_set = set(_res_list + _member_change)
|
||||
if _new_set != set(_res_list):
|
||||
member_attrs[_member] = list(_new_set)
|
||||
|
||||
if member_attrs:
|
||||
commands.append([name, "permission_mod", member_attrs])
|
||||
|
||||
commands.append([name, "permission_add_member",
|
||||
{
|
||||
"privilege": privilege,
|
||||
"no_members": no_members_value
|
||||
}])
|
||||
else:
|
||||
ansible_module.fail_json(
|
||||
msg="Unknown action '%s'" % action)
|
||||
|
||||
elif state == "renamed":
|
||||
if action == "permission":
|
||||
# Generate args
|
||||
@@ -445,6 +410,7 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(
|
||||
msg="Unknown action '%s'" % action)
|
||||
|
||||
elif state == "absent":
|
||||
if action == "permission":
|
||||
if res_find is not None:
|
||||
@@ -455,17 +421,34 @@ def main():
|
||||
ansible_module.fail_json(
|
||||
msg="No permission '%s'" % name)
|
||||
|
||||
if privilege is None:
|
||||
ansible_module.fail_json(msg="No privilege given")
|
||||
member_attrs = {}
|
||||
check_members = {
|
||||
"attrs": attrs,
|
||||
"memberof": memberof,
|
||||
"ipapermright": right,
|
||||
"ipapermtargetfilter": rawfilter,
|
||||
"extratargetfilter": extra_target_filter,
|
||||
# subtree member management is currently disabled.
|
||||
# "ipapermlocation": subtree,
|
||||
}
|
||||
|
||||
commands.append([name, "permission_remove_member",
|
||||
{
|
||||
"privilege": privilege,
|
||||
}])
|
||||
for _member, _member_change in check_members.items():
|
||||
if _member_change is not None:
|
||||
_res_set = set(res_find[_member])
|
||||
_new_set = _res_set - set(_member_change)
|
||||
if _new_set != _res_set:
|
||||
member_attrs[_member] = list(_new_set)
|
||||
|
||||
if member_attrs:
|
||||
commands.append([name, "permission_mod", member_attrs])
|
||||
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unknown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
for name, command, args in commands:
|
||||
|
||||
@@ -312,6 +312,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
for name, command, args in commands:
|
||||
|
||||
@@ -284,6 +284,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
for name, command, args in commands:
|
||||
|
||||
@@ -257,7 +257,7 @@ def filter_service(module, res_find, predicate):
|
||||
return _services
|
||||
|
||||
|
||||
def ensure_role_with_members_is_present(module, name, res_find):
|
||||
def ensure_role_with_members_is_present(module, name, res_find, action):
|
||||
"""Define commands to ensure member are present for action `role`."""
|
||||
commands = []
|
||||
privilege_add, privilege_del = gen_add_del_lists(
|
||||
@@ -267,7 +267,7 @@ def ensure_role_with_members_is_present(module, name, res_find):
|
||||
if privilege_add:
|
||||
commands.append([name, "role_add_privilege",
|
||||
{"privilege": privilege_add}])
|
||||
if privilege_del:
|
||||
if action == "role" and privilege_del:
|
||||
commands.append([name, "role_remove_privilege",
|
||||
{"privilege": privilege_del}])
|
||||
|
||||
@@ -297,7 +297,8 @@ def ensure_role_with_members_is_present(module, name, res_find):
|
||||
|
||||
if add_members:
|
||||
commands.append([name, "role_add_member", add_members])
|
||||
if del_members:
|
||||
# Only remove members if ensuring role, not acting on members.
|
||||
if action == "role" and del_members:
|
||||
commands.append([name, "role_remove_member", del_members])
|
||||
|
||||
return commands
|
||||
@@ -355,6 +356,11 @@ def process_commands(module, commands):
|
||||
errors = []
|
||||
exit_args = {}
|
||||
changed = False
|
||||
|
||||
# Check mode exit
|
||||
if module.check_mode:
|
||||
return len(commands) > 0, exit_args
|
||||
|
||||
for name, command, args in commands:
|
||||
try:
|
||||
result = api_command(module, command, name, args)
|
||||
@@ -400,7 +406,9 @@ def role_commands_for_name(module, state, action, name):
|
||||
if res_find is None:
|
||||
module.fail_json(msg="No role '%s'" % name)
|
||||
|
||||
cmds = ensure_role_with_members_is_present(module, name, res_find)
|
||||
cmds = ensure_role_with_members_is_present(
|
||||
module, name, res_find, action
|
||||
)
|
||||
commands.extend(cmds)
|
||||
|
||||
if state == "absent" and res_find is not None:
|
||||
|
||||
@@ -293,6 +293,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
for name, command, args in commands:
|
||||
|
||||
@@ -824,6 +824,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
errors = []
|
||||
for name, command, args in commands:
|
||||
|
||||
@@ -182,6 +182,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
for name, command, args in commands:
|
||||
try:
|
||||
|
||||
@@ -298,6 +298,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
for name, command, args in commands:
|
||||
try:
|
||||
|
||||
@@ -429,16 +429,16 @@ def main():
|
||||
|
||||
# Generate addition and removal lists
|
||||
host_add, host_del = gen_add_del_lists(
|
||||
host, res_find.get('member_host', []))
|
||||
host, res_find.get('memberhost_host', []))
|
||||
|
||||
hostgroup_add, hostgroup_del = gen_add_del_lists(
|
||||
hostgroup, res_find.get('member_hostgroup', []))
|
||||
hostgroup, res_find.get('memberhost_hostgroup', []))
|
||||
|
||||
user_add, user_del = gen_add_del_lists(
|
||||
user, res_find.get('member_user', []))
|
||||
user, res_find.get('memberuser_user', []))
|
||||
|
||||
group_add, group_del = gen_add_del_lists(
|
||||
group, res_find.get('member_group', []))
|
||||
group, res_find.get('memberuser_group', []))
|
||||
|
||||
allow_cmd_add, allow_cmd_del = gen_add_del_lists(
|
||||
allow_sudocmd,
|
||||
@@ -686,6 +686,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
errors = []
|
||||
|
||||
@@ -326,6 +326,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unkown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute command
|
||||
|
||||
for command, args, _suffix in commands:
|
||||
|
||||
@@ -244,7 +244,8 @@ def main():
|
||||
|
||||
if state == "absent":
|
||||
if res_find is not None:
|
||||
del_trust(ansible_module, realm)
|
||||
if not ansible_module.check_mode:
|
||||
del_trust(ansible_module, realm)
|
||||
changed = True
|
||||
elif res_find is None:
|
||||
if admin is None and trust_secret is None:
|
||||
@@ -256,7 +257,8 @@ def main():
|
||||
trust_secret, base_id, range_size, range_type,
|
||||
two_way, external)
|
||||
|
||||
add_trust(ansible_module, realm, args)
|
||||
if not ansible_module.check_mode:
|
||||
add_trust(ansible_module, realm, args)
|
||||
changed = True
|
||||
|
||||
except Exception as e:
|
||||
|
||||
@@ -1377,6 +1377,10 @@ def main():
|
||||
|
||||
del user_set
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
errors = []
|
||||
|
||||
@@ -317,10 +317,11 @@ vault:
|
||||
import os
|
||||
from base64 import b64decode
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils._text import to_text
|
||||
from ansible.module_utils.ansible_freeipa_module import temp_kinit, \
|
||||
temp_kdestroy, valid_creds, api_connect, api_command, \
|
||||
gen_add_del_lists, compare_args_ipa, module_params_get, exit_raw_json
|
||||
from ipalib.errors import EmptyModlist
|
||||
from ipalib.errors import EmptyModlist, NotFound
|
||||
|
||||
|
||||
def find_vault(module, name, username, service, shared):
|
||||
@@ -351,7 +352,9 @@ def gen_args(description, username, service, shared, vault_type, salt,
|
||||
password, password_file, public_key, public_key_file, vault_data,
|
||||
datafile_in, datafile_out):
|
||||
_args = {}
|
||||
vault_type = vault_type or to_text("symmetric")
|
||||
|
||||
_args['ipavaulttype'] = vault_type
|
||||
if description is not None:
|
||||
_args['description'] = description
|
||||
if username is not None:
|
||||
@@ -360,27 +363,32 @@ def gen_args(description, username, service, shared, vault_type, salt,
|
||||
_args['service'] = service
|
||||
if shared is not None:
|
||||
_args['shared'] = shared
|
||||
if vault_type is not None:
|
||||
_args['ipavaulttype'] = vault_type
|
||||
if salt is not None:
|
||||
_args['ipavaultsalt'] = salt
|
||||
if public_key is not None:
|
||||
_args['ipavaultpublickey'] = b64decode(public_key.encode('utf-8'))
|
||||
if public_key_file is not None:
|
||||
with open(public_key_file, 'r') as keyfile:
|
||||
keydata = keyfile.read()
|
||||
_args['ipavaultpublickey'] = keydata.strip().encode('utf-8')
|
||||
|
||||
if vault_type == "symmetric":
|
||||
if salt is not None:
|
||||
_args['ipavaultsalt'] = salt
|
||||
_args['ipavaultpublickey'] = None
|
||||
|
||||
elif vault_type == "asymmetric":
|
||||
if public_key is not None:
|
||||
_args['ipavaultpublickey'] = b64decode(public_key.encode('utf-8'))
|
||||
if public_key_file is not None:
|
||||
with open(public_key_file, 'r') as keyfile:
|
||||
keydata = keyfile.read()
|
||||
_args['ipavaultpublickey'] = keydata.strip().encode('utf-8')
|
||||
_args['ipavaultsalt'] = None
|
||||
|
||||
elif vault_type == "standard":
|
||||
_args['ipavaultsalt'] = None
|
||||
_args['ipavaultpublickey'] = None
|
||||
|
||||
return _args
|
||||
|
||||
|
||||
def gen_member_args(args, users, groups, services):
|
||||
_args = args.copy()
|
||||
|
||||
for arg in ['ipavaulttype', 'description', 'ipavaultpublickey',
|
||||
'ipavaultsalt']:
|
||||
if arg in _args:
|
||||
del _args[arg]
|
||||
remove = ['ipavaulttype', 'description', 'ipavaultpublickey',
|
||||
'ipavaultsalt']
|
||||
_args = {k: v for k, v in args.items() if k not in remove}
|
||||
|
||||
if any([users, groups, services]):
|
||||
if users is not None:
|
||||
@@ -395,9 +403,12 @@ def gen_member_args(args, users, groups, services):
|
||||
return None
|
||||
|
||||
|
||||
def data_storage_args(args, data, password, password_file, private_key,
|
||||
private_key_file, datafile_in, datafile_out):
|
||||
_args = {}
|
||||
def data_storage_args(vault_type, args, data, password, password_file,
|
||||
private_key, private_key_file, datafile_in,
|
||||
datafile_out):
|
||||
remove = ['ipavaulttype', 'description', 'ipavaultpublickey',
|
||||
'ipavaultsalt']
|
||||
_args = {k: v for k, v in args.items() if k not in remove}
|
||||
|
||||
if 'username' in args:
|
||||
_args['username'] = args['username']
|
||||
@@ -406,15 +417,17 @@ def data_storage_args(args, data, password, password_file, private_key,
|
||||
if 'shared' in args:
|
||||
_args['shared'] = args['shared']
|
||||
|
||||
if password is not None:
|
||||
_args['password'] = password
|
||||
if password_file is not None:
|
||||
_args['password_file'] = password_file
|
||||
if vault_type is None or vault_type == "symmetric":
|
||||
if password is not None:
|
||||
_args['password'] = password
|
||||
if password_file is not None:
|
||||
_args['password_file'] = password_file
|
||||
|
||||
if private_key is not None:
|
||||
_args['private_key'] = private_key
|
||||
if private_key_file is not None:
|
||||
_args['private_key_file'] = private_key_file
|
||||
if vault_type == "asymmetric":
|
||||
if private_key is not None:
|
||||
_args['private_key'] = private_key
|
||||
if private_key_file is not None:
|
||||
_args['private_key_file'] = private_key_file
|
||||
|
||||
if datafile_in is not None:
|
||||
_args['in'] = datafile_in
|
||||
@@ -427,9 +440,6 @@ def data_storage_args(args, data, password, password_file, private_key,
|
||||
if datafile_out is not None:
|
||||
_args['out'] = datafile_out
|
||||
|
||||
if private_key_file is not None:
|
||||
_args['private_key_file'] = private_key_file
|
||||
|
||||
return _args
|
||||
|
||||
|
||||
@@ -441,7 +451,7 @@ def check_parameters(module, state, action, description, username, service,
|
||||
new_password, new_password_file):
|
||||
invalid = []
|
||||
if state == "present":
|
||||
invalid = ['private_key', 'private_key_file', 'datafile_out']
|
||||
invalid = ['datafile_out']
|
||||
|
||||
if all([password, password_file]) \
|
||||
or all([new_password, new_password_file]):
|
||||
@@ -454,7 +464,7 @@ def check_parameters(module, state, action, description, username, service,
|
||||
"change symmetric vault password.")
|
||||
|
||||
if action == "member":
|
||||
invalid.extend(['description'])
|
||||
invalid.extend(['description', 'vault_type'])
|
||||
|
||||
elif state == "absent":
|
||||
invalid = ['description', 'salt', 'vault_type', 'private_key',
|
||||
@@ -480,12 +490,6 @@ def check_parameters(module, state, action, description, username, service,
|
||||
msg="Argument '%s' can not be used with state '%s', "
|
||||
"action '%s'" % (arg, state, action))
|
||||
|
||||
for arg in invalid:
|
||||
if vars()[arg] is not None:
|
||||
module.fail_json(
|
||||
msg="Argument '%s' can not be used with state '%s', "
|
||||
"action '%s'" % (arg, state, action))
|
||||
|
||||
|
||||
def check_encryption_params(module, state, action, vault_type, salt,
|
||||
password, password_file, public_key,
|
||||
@@ -494,6 +498,10 @@ def check_encryption_params(module, state, action, vault_type, salt,
|
||||
new_password, new_password_file, res_find):
|
||||
vault_type_invalid = []
|
||||
|
||||
existing_type = None
|
||||
if res_find:
|
||||
existing_type = res_find["ipavaulttype"][0]
|
||||
|
||||
if vault_type is None and res_find is not None:
|
||||
vault_type = res_find['ipavaulttype']
|
||||
if isinstance(vault_type, (tuple, list)):
|
||||
@@ -536,47 +544,45 @@ def check_encryption_params(module, state, action, vault_type, salt,
|
||||
msg="Assymmetric vault requires public_key "
|
||||
"or public_key_file to store data.")
|
||||
|
||||
for param in vault_type_invalid:
|
||||
valid_fields = []
|
||||
if existing_type == "symmetric":
|
||||
valid_fields = [
|
||||
'password', 'password_file', 'new_password', 'new_password_file',
|
||||
'salt'
|
||||
]
|
||||
if existing_type == "asymmetric":
|
||||
valid_fields = [
|
||||
'public_key', 'public_key_file', 'private_key', 'private_key_file'
|
||||
]
|
||||
|
||||
check_fields = [f for f in vault_type_invalid if f not in valid_fields]
|
||||
|
||||
for param in check_fields:
|
||||
if vars()[param] is not None:
|
||||
module.fail_json(
|
||||
msg="Argument '%s' cannot be used with vault type '%s'" %
|
||||
(param, vault_type or 'symmetric'))
|
||||
|
||||
|
||||
def change_password(module, res_find, password, password_file, new_password,
|
||||
new_password_file):
|
||||
"""
|
||||
Change the password of a symmetric vault.
|
||||
|
||||
To change the password of a vault, it is needed to retrieve the stored
|
||||
data with the current password, and store the data again, with the new
|
||||
password, forcing it to override the old one.
|
||||
"""
|
||||
# verify parameters.
|
||||
if not any([new_password, new_password_file]):
|
||||
return []
|
||||
if res_find["ipavaulttype"][0] != "symmetric":
|
||||
module.fail_json(msg="Cannot change password of `%s` vault."
|
||||
% res_find["ipavaulttype"])
|
||||
|
||||
def get_stored_data(module, res_find, args):
|
||||
"""Retrieve data stored in the vault."""
|
||||
# prepare arguments to retrieve data.
|
||||
name = res_find["cn"][0]
|
||||
args = {}
|
||||
if password:
|
||||
args["password"] = password
|
||||
if password_file:
|
||||
args["password_file"] = password_file
|
||||
# retrieve current stored data
|
||||
result = api_command(module, 'vault_retrieve', name, args)
|
||||
copy_args = []
|
||||
if res_find['ipavaulttype'][0] == "symmetric":
|
||||
copy_args = ["password", "password_file"]
|
||||
if res_find['ipavaulttype'][0] == "asymmetric":
|
||||
copy_args = ["private_key", "private_key_file"]
|
||||
|
||||
# modify arguments to store data with new password.
|
||||
args = {"override_password": True, "data": result['result']['data']}
|
||||
if new_password:
|
||||
args["password"] = new_password
|
||||
if new_password_file:
|
||||
args["password_file"] = new_password_file
|
||||
# return the command to store data with the new password.
|
||||
return [(name, "vault_archive", args)]
|
||||
pwdargs = {arg: args[arg] for arg in copy_args if arg in args}
|
||||
|
||||
# retrieve vault stored data
|
||||
try:
|
||||
result = api_command(module, 'vault_retrieve', name, pwdargs)
|
||||
except NotFound:
|
||||
return None
|
||||
|
||||
return result['result'].get('data')
|
||||
|
||||
|
||||
def main():
|
||||
@@ -594,10 +600,12 @@ def main():
|
||||
default=None, required=False,
|
||||
choices=["standard", "symmetric", "asymmetric"]),
|
||||
vault_public_key=dict(type="str", required=False, default=None,
|
||||
aliases=['ipavaultpublickey', 'public_key']),
|
||||
aliases=['ipavaultpublickey', 'public_key',
|
||||
'new_public_key']),
|
||||
vault_public_key_file=dict(type="str", required=False,
|
||||
default=None,
|
||||
aliases=['public_key_file']),
|
||||
aliases=['public_key_file',
|
||||
'new_public_key_file']),
|
||||
vault_private_key=dict(
|
||||
type="str", required=False, default=None, no_log=True,
|
||||
aliases=['ipavaultprivatekey', 'private_key']),
|
||||
@@ -742,6 +750,11 @@ def main():
|
||||
res_find = find_vault(
|
||||
ansible_module, name, username, service, shared)
|
||||
|
||||
# Set default vault_type if needed.
|
||||
res_type = res_find.get('ipavaulttype')[0] if res_find else None
|
||||
if vault_type is None:
|
||||
vault_type = res_type if res_find is not None else u"symmetric"
|
||||
|
||||
# Generate args
|
||||
args = gen_args(description, username, service, shared, vault_type,
|
||||
salt, password, password_file, public_key,
|
||||
@@ -749,14 +762,6 @@ def main():
|
||||
datafile_out)
|
||||
pwdargs = None
|
||||
|
||||
# Set default vault_type if needed.
|
||||
if vault_type is None and vault_data is not None:
|
||||
if res_find is not None:
|
||||
res_vault_type = res_find.get('ipavaulttype')[0]
|
||||
args['ipavaulttype'] = vault_type = res_vault_type
|
||||
else:
|
||||
args['ipavaulttype'] = vault_type = u"symmetric"
|
||||
|
||||
# Create command
|
||||
if state == "present":
|
||||
# verify data encription args
|
||||
@@ -766,16 +771,52 @@ def main():
|
||||
private_key_file, vault_data, datafile_in, datafile_out,
|
||||
new_password, new_password_file, res_find)
|
||||
|
||||
# Found the vault
|
||||
change_passwd = any([
|
||||
new_password, new_password_file,
|
||||
(private_key or private_key_file) and
|
||||
(public_key or public_key_file)
|
||||
])
|
||||
if action == "vault":
|
||||
# Found the vault
|
||||
if res_find is not None:
|
||||
# For all settings is args, check if there are
|
||||
# different settings in the find result.
|
||||
# If yes: modify
|
||||
if not compare_args_ipa(ansible_module, args,
|
||||
res_find):
|
||||
commands.append([name, "vault_mod_internal", args])
|
||||
arg_type = args.get("ipavaulttype")
|
||||
|
||||
modified = not compare_args_ipa(ansible_module,
|
||||
args, res_find)
|
||||
|
||||
if arg_type != res_type or change_passwd:
|
||||
stargs = data_storage_args(
|
||||
res_type, args, vault_data, password,
|
||||
password_file, private_key,
|
||||
private_key_file, datafile_in,
|
||||
datafile_out)
|
||||
stored = get_stored_data(
|
||||
ansible_module, res_find, stargs
|
||||
)
|
||||
if stored:
|
||||
vault_data = \
|
||||
(stored or b"").decode("utf-8")
|
||||
|
||||
remove_attrs = {
|
||||
"symmetric": ["private_key", "public_key"],
|
||||
"asymmetric": ["password", "ipavaultsalt"],
|
||||
"standard": [
|
||||
"private_key", "public_key",
|
||||
"password", "ipavaultsalt"
|
||||
],
|
||||
}
|
||||
for attr in remove_attrs.get(arg_type, []):
|
||||
if attr in args:
|
||||
del args[attr]
|
||||
|
||||
if vault_type == 'symmetric':
|
||||
if 'ipavaultsalt' not in args:
|
||||
args['ipavaultsalt'] = os.urandom(32)
|
||||
else:
|
||||
args['ipavaultsalt'] = b''
|
||||
|
||||
if modified:
|
||||
commands.append([name, "vault_mod_internal", args])
|
||||
else:
|
||||
if vault_type == 'symmetric' \
|
||||
and 'ipavaultsalt' not in args:
|
||||
@@ -851,16 +892,22 @@ def main():
|
||||
ownerservices)
|
||||
commands.append([name, 'vault_add_owner', owner_args])
|
||||
|
||||
pwdargs = data_storage_args(
|
||||
args, vault_data, password, password_file, private_key,
|
||||
private_key_file, datafile_in, datafile_out)
|
||||
if any([vault_data, datafile_in]):
|
||||
commands.append([name, "vault_archive", pwdargs])
|
||||
if change_passwd:
|
||||
pwdargs = data_storage_args(
|
||||
vault_type, args, vault_data, new_password,
|
||||
new_password_file, private_key, private_key_file,
|
||||
datafile_in, datafile_out)
|
||||
else:
|
||||
pwdargs = data_storage_args(
|
||||
vault_type, args, vault_data, password,
|
||||
password_file, private_key, private_key_file,
|
||||
datafile_in, datafile_out)
|
||||
|
||||
cmds = change_password(
|
||||
ansible_module, res_find, password, password_file,
|
||||
new_password, new_password_file)
|
||||
commands.extend(cmds)
|
||||
pwdargs['override_password'] = True
|
||||
pwdargs.pop("private_key", None)
|
||||
pwdargs.pop("private_key_file", None)
|
||||
commands.append([name, "vault_archive", pwdargs])
|
||||
|
||||
elif state == "retrieved":
|
||||
if res_find is None:
|
||||
@@ -875,8 +922,9 @@ def main():
|
||||
new_password, new_password_file, res_find)
|
||||
|
||||
pwdargs = data_storage_args(
|
||||
args, vault_data, password, password_file, private_key,
|
||||
private_key_file, datafile_in, datafile_out)
|
||||
res_find["ipavaulttype"][0], args, vault_data, password,
|
||||
password_file, private_key, private_key_file, datafile_in,
|
||||
datafile_out)
|
||||
if 'data' in pwdargs:
|
||||
del pwdargs['data']
|
||||
|
||||
@@ -888,6 +936,10 @@ def main():
|
||||
|
||||
if action == "vault":
|
||||
if res_find is not None:
|
||||
remove = ['ipavaultsalt', 'ipavaultpublickey']
|
||||
args = {
|
||||
k: v for k, v in args.items() if k not in remove
|
||||
}
|
||||
commands.append([name, "vault_del", args])
|
||||
|
||||
elif action == "member":
|
||||
@@ -910,6 +962,10 @@ def main():
|
||||
else:
|
||||
ansible_module.fail_json(msg="Unknown state '%s'" % state)
|
||||
|
||||
# Check mode exit
|
||||
if ansible_module.check_mode:
|
||||
ansible_module.exit_json(changed=len(commands) > 0, **exit_args)
|
||||
|
||||
# Execute commands
|
||||
|
||||
errors = []
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
-r requirements-tests.txt
|
||||
ipdb
|
||||
pre-commit
|
||||
flake8-bugbear
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
pytest>=2.7
|
||||
pytest-sourceorder>=0.5
|
||||
pytest-split-tests>=1.0.3
|
||||
testinfra>=5.0
|
||||
pytest-testinfra>=5.0
|
||||
jmespath>=0.9 # needed for the `json_query` filter
|
||||
pyyaml>=3
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
set_fact:
|
||||
ipabackup_controller_dir:
|
||||
"{{ ipabackup_controller_path | default(lookup('env','PWD')) }}/{{
|
||||
ipabackup_name_prefix | default(ansible_fqdn) }}_{{
|
||||
ipabackup_name_prefix | default(ansible_facts['fqdn']) }}_{{
|
||||
ipabackup_item }}/"
|
||||
|
||||
- name: Stat backup on server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
- name: Get IPA_BACKUP_DIR dir from ipaplatform
|
||||
command: "{{ ansible_playbook_python }}"
|
||||
command: "{{ ansible_python_interpreter | default('/usr/bin/python') }}"
|
||||
args:
|
||||
stdin: |
|
||||
from ipaplatform.paths import paths
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
- name: Import variables specific to distribution
|
||||
include_vars: "{{ item }}"
|
||||
with_first_found:
|
||||
- "{{ role_path }}/vars/{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml"
|
||||
- "{{ role_path }}/vars/{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml"
|
||||
- "{{ role_path }}/vars/{{ ansible_distribution }}.yml"
|
||||
- "{{ role_path }}/vars/{{ ansible_facts['distribution'] }}-{{ ansible_facts['distribution_version'] }}.yml"
|
||||
- "{{ role_path }}/vars/{{ ansible_facts['distribution'] }}-{{ ansible_facts['distribution_major_version'] }}.yml"
|
||||
- "{{ role_path }}/vars/{{ ansible_facts['distribution'] }}.yml"
|
||||
- "{{ role_path }}/vars/default.yml"
|
||||
|
||||
### GET SERVICES FROM BACKUP
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
domain: "{{ ipaserver_domain | default(ipaclient_domain) | default(omit) }}"
|
||||
servers: "{{ ipaclient_servers | default(omit) }}"
|
||||
realm: "{{ ipaserver_realm | default(ipaclient_realm) | default(omit) }}"
|
||||
hostname: "{{ ipaclient_hostname | default(ansible_fqdn) }}"
|
||||
hostname: "{{ ipaclient_hostname | default(ansible_facts['fqdn']) }}"
|
||||
ntp_servers: "{{ ipaclient_ntp_servers | default(omit) }}"
|
||||
ntp_pool: "{{ ipaclient_ntp_pool | default(omit) }}"
|
||||
no_ntp: "{{ ipaclient_no_ntp }}"
|
||||
@@ -181,8 +181,12 @@
|
||||
# Do not fail on error codes 3 and 5:
|
||||
# 3 - Unable to open keytab
|
||||
# 5 - Principal name or realm not found in keytab
|
||||
# 7 - Failed to set cursor, typically when errcode
|
||||
# would be issued in past
|
||||
failed_when: result_ipa_rmkeytab.rc != 0 and
|
||||
result_ipa_rmkeytab.rc != 3 and result_ipa_rmkeytab.rc != 5
|
||||
result_ipa_rmkeytab.rc != 3 and
|
||||
result_ipa_rmkeytab.rc != 5 and
|
||||
result_ipa_rmkeytab.rc != 7
|
||||
when: (ipaclient_use_otp | bool or ipaclient_force_join | bool) and not ipaclient_on_master | bool
|
||||
|
||||
- name: Install - Backup and set hostname
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
- name: Import variables specific to distribution
|
||||
include_vars: "{{ item }}"
|
||||
with_first_found:
|
||||
- "{{ role_path }}/vars/{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml"
|
||||
- "{{ role_path }}/vars/{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml"
|
||||
- "{{ role_path }}/vars/{{ ansible_distribution }}.yml"
|
||||
- "{{ role_path }}/vars/{{ ansible_facts['distribution'] }}-{{ ansible_facts['distribution_version'] }}.yml"
|
||||
- "{{ role_path }}/vars/{{ ansible_facts['distribution'] }}-{{ ansible_facts['distribution_major_version'] }}.yml"
|
||||
- "{{ role_path }}/vars/{{ ansible_facts['distribution'] }}.yml"
|
||||
- "{{ role_path }}/vars/default.yml"
|
||||
|
||||
- name: Install IPA client
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
default(omit) }}"
|
||||
servers: "{{ ipareplica_servers | default(omit) }}"
|
||||
realm: "{{ ipareplica_realm | default(ipaserver_realm) |default(omit) }}"
|
||||
hostname: "{{ ipareplica_hostname | default(ansible_fqdn) }}"
|
||||
hostname: "{{ ipareplica_hostname | default(ansible_facts['fqdn']) }}"
|
||||
ca_cert_files: "{{ ipareplica_ca_cert_files | default([]) }}"
|
||||
hidden_replica: "{{ ipareplica_hidden_replica }}"
|
||||
skip_mem_check: "{{ not ipareplica_mem_check }}"
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
- name: Import variables specific to distribution
|
||||
include_vars: "{{ item }}"
|
||||
with_first_found:
|
||||
- "vars/{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml"
|
||||
- "vars/{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml"
|
||||
- "vars/{{ ansible_distribution }}.yml"
|
||||
- "vars/{{ ansible_facts['distribution'] }}-{{ ansible_facts['distribution_version'] }}.yml"
|
||||
- "vars/{{ ansible_facts['distribution'] }}-{{ ansible_facts['distribution_major_version'] }}.yml"
|
||||
- "vars/{{ ansible_facts['distribution'] }}.yml"
|
||||
- "vars/default.yml"
|
||||
|
||||
- name: Install IPA replica
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
# command: >
|
||||
# /usr/sbin/ipa-replica-manage
|
||||
# del
|
||||
# {{ ipareplica_hostname | default(ansible_fqdn) }}
|
||||
# {{ ipareplica_hostname | default(ansible_facts['fqdn']) }}
|
||||
# --force
|
||||
# --password={{ ipadm_password }}
|
||||
# failed_when: False
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
master_password: "{{ ipaserver_master_password | default(omit) }}"
|
||||
domain: "{{ ipaserver_domain | default(omit) }}"
|
||||
realm: "{{ ipaserver_realm | default(omit) }}"
|
||||
hostname: "{{ ipaserver_hostname | default(ansible_fqdn) }}"
|
||||
hostname: "{{ ipaserver_hostname | default(ansible_facts['fqdn']) }}"
|
||||
ca_cert_files: "{{ ipaserver_ca_cert_files | default(omit) }}"
|
||||
no_host_dns: "{{ ipaserver_no_host_dns }}"
|
||||
pki_config_override: "{{ ipaserver_pki_config_override | default(omit) }}"
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
- name: Import variables specific to distribution
|
||||
include_vars: "{{ item }}"
|
||||
with_first_found:
|
||||
- "vars/{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml"
|
||||
- "vars/{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml"
|
||||
- "vars/{{ ansible_distribution }}.yml"
|
||||
- "vars/{{ ansible_facts['distribution'] }}-{{ ansible_facts['distribution_version'] }}.yml"
|
||||
- "vars/{{ ansible_facts['distribution'] }}-{{ ansible_facts['distribution_major_version'] }}.yml"
|
||||
- "vars/{{ ansible_facts['distribution'] }}.yml"
|
||||
- "vars/default.yml"
|
||||
|
||||
- name: Install IPA server
|
||||
|
||||
@@ -3,3 +3,4 @@ roles_path = ../roles:~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/rol
|
||||
library = ../plugins/modules:~/.ansible/plugins/modules:/usr/share/ansible/plugins/modules
|
||||
module_utils = ../plugins/module_utils:~/.ansible/plugins/module_utils:/usr/share/ansible/plugins/module_utils
|
||||
host_key_checking = false
|
||||
inject_facts_as_vars = false
|
||||
|
||||
@@ -15,7 +15,7 @@ trigger:
|
||||
- master
|
||||
|
||||
pool:
|
||||
vmImage: 'ubuntu-18.04'
|
||||
vmImage: 'ubuntu-20.04'
|
||||
|
||||
stages:
|
||||
- stage: Centos7
|
||||
|
||||
@@ -11,7 +11,7 @@ schedules:
|
||||
trigger: none
|
||||
|
||||
pool:
|
||||
vmImage: 'ubuntu-18.04'
|
||||
vmImage: 'ubuntu-20.04'
|
||||
|
||||
jobs:
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ jobs:
|
||||
inputs:
|
||||
versionSpec: '3.6'
|
||||
|
||||
- script: python -m pip install --upgrade pip setuptools wheel
|
||||
- script: python -m pip install --upgrade pip setuptools wheel ansible
|
||||
displayName: Install tools
|
||||
|
||||
- script: pip install molecule[docker]
|
||||
@@ -23,6 +23,8 @@ jobs:
|
||||
|
||||
- script: molecule create -s ${{ parameters.build_scenario_name }}
|
||||
displayName: Create test container
|
||||
env:
|
||||
ANSIBLE_LIBRARY: ./molecule
|
||||
|
||||
- script: |
|
||||
docker stop ${{ parameters.build_scenario_name }}
|
||||
|
||||
@@ -44,6 +44,8 @@ jobs:
|
||||
cp -a plugins/module_utils/* ~/.ansible/module_utils
|
||||
molecule create -s ${{ parameters.scenario }}
|
||||
displayName: Setup test container
|
||||
env:
|
||||
ANSIBLE_LIBRARY: ./molecule
|
||||
|
||||
- script: |
|
||||
pytest \
|
||||
|
||||
@@ -36,6 +36,8 @@ jobs:
|
||||
cp -a plugins/module_utils/* ~/.ansible/module_utils
|
||||
molecule create -s ${{ parameters.scenario }}
|
||||
displayName: Setup test container
|
||||
env:
|
||||
ANSIBLE_LIBRARY: ./molecule
|
||||
|
||||
- script: |
|
||||
pytest \
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
# Set common vars and facts for test.
|
||||
- name: Set IPv4 address prefix.
|
||||
set_fact:
|
||||
ipv4_prefix: "{{ ansible_default_ipv4.address.split('.')[:-1] |
|
||||
ipv4_prefix: "{{ ansible_facts['default_ipv4'].address.split('.')[:-1] |
|
||||
join('.') }}"
|
||||
ipv4_reverse_sufix: "{{ ansible_default_ipv4.address.split('.')[:-1] |
|
||||
ipv4_reverse_sufix: "{{ ansible_facts['default_ipv4'].address.split('.')[:-1] |
|
||||
reverse |
|
||||
join('.') }}"
|
||||
|
||||
|
||||
@@ -29,26 +29,32 @@
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: host01
|
||||
zone_name: testzone.local
|
||||
record_type: 'AAAA'
|
||||
record_value: '::1'
|
||||
del_all: yes
|
||||
state: absent
|
||||
|
||||
- name: Ensure that dns record 'vm-001' is absent
|
||||
- name: Ensure that dns records for 'vm-001' are absent
|
||||
ipadnsrecord:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: vm-001
|
||||
zone_name: testzone.local
|
||||
record_type: 'AAAA'
|
||||
record_value: '::1'
|
||||
del_all: yes
|
||||
state: absent
|
||||
|
||||
- name: Ensure a PTR record is absent for 'vm-001'
|
||||
ipadnsrecord:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: '1'
|
||||
record_type: 'PTR'
|
||||
record_value: 'vm-001'
|
||||
zone_name: 2.168.192.in-addr.arpa
|
||||
state: absent
|
||||
|
||||
- name: Ensure a PTR record is absent
|
||||
ipadnsrecord:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: 5
|
||||
record_type: 'PTR'
|
||||
record_value: 'internal.ipa.testzone.local'
|
||||
zone_name: 2.168.192.in-addr.arpa
|
||||
name: "5"
|
||||
del_all: yes
|
||||
state: absent
|
||||
|
||||
- name: Ensure a TXT record is absent
|
||||
@@ -79,7 +85,7 @@
|
||||
state: absent
|
||||
|
||||
# tests
|
||||
- name: Ensure dns record is present
|
||||
- name: Ensure AAAA dns record is present
|
||||
ipadnsrecord:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: vm-001
|
||||
@@ -88,9 +94,9 @@
|
||||
zone_name: testzone.local
|
||||
state: present
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure that dns record exists with a TTL
|
||||
- name: Ensure that AAAA dns record exists with a TTL
|
||||
ipadnsrecord:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: host01
|
||||
@@ -100,18 +106,52 @@
|
||||
zone_name: testzone.local
|
||||
state: present
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure a PTR record is present
|
||||
ipadnsrecord:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: 5
|
||||
name: '5'
|
||||
record_type: 'PTR'
|
||||
record_value: 'internal.ipa.testzone.local'
|
||||
zone_name: 2.168.192.in-addr.arpa
|
||||
state: present
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure A record is present, with reverse
|
||||
ipadnsrecord:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: vm-001
|
||||
record_type: 'A'
|
||||
record_value: '192.168.2.1'
|
||||
create_reverse: yes
|
||||
zone_name: testzone.local
|
||||
state: present
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure A record is present
|
||||
ipadnsrecord:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: vm-001
|
||||
record_type: 'A'
|
||||
record_value: '192.168.2.1'
|
||||
zone_name: testzone.local
|
||||
state: present
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure PTR record is present
|
||||
ipadnsrecord:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: '1'
|
||||
record_type: 'PTR'
|
||||
record_value: vm-001.testzone.local
|
||||
zone_name: 2.168.192.in-addr.arpa
|
||||
state: present
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure a TXT record is present
|
||||
ipadnsrecord:
|
||||
@@ -122,7 +162,7 @@
|
||||
zone_name: testzone.local
|
||||
state: present
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure a SRV record is present
|
||||
ipadnsrecord:
|
||||
@@ -133,7 +173,7 @@
|
||||
zone_name: testzone.local
|
||||
state: present
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure an MX record is present
|
||||
ipadnsrecord:
|
||||
@@ -144,7 +184,7 @@
|
||||
zone_name: testzone.local
|
||||
state: present
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure that dns record is removed
|
||||
ipadnsrecord:
|
||||
@@ -155,7 +195,7 @@
|
||||
record_value: '::1'
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
# cleanup
|
||||
- name: Ensure that dns record 'host01' is absent
|
||||
@@ -167,7 +207,7 @@
|
||||
record_value: '::1'
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: result.changed
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure that dns record 'vm-001' is absent
|
||||
ipadnsrecord:
|
||||
@@ -178,7 +218,7 @@
|
||||
record_value: '::1'
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure a PTR record is absent
|
||||
ipadnsrecord:
|
||||
@@ -189,7 +229,7 @@
|
||||
zone_name: 2.168.192.in-addr.arpa
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure a TXT record is absent
|
||||
ipadnsrecord:
|
||||
@@ -200,7 +240,7 @@
|
||||
zone_name: testzone.local
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure a SRV record is absent
|
||||
ipadnsrecord:
|
||||
@@ -211,7 +251,7 @@
|
||||
zone_name: testzone.local
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure an MX record is absent
|
||||
ipadnsrecord:
|
||||
@@ -222,7 +262,7 @@
|
||||
zone_name: testzone.local
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure DNS zones to be used are absent.
|
||||
ipadnszone:
|
||||
|
||||
@@ -564,7 +564,7 @@
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: iron01
|
||||
zone_name: "{{ safezone }}"
|
||||
ip_address: "{{ ansible_default_ipv4.address }}"
|
||||
ip_address: "{{ ansible_facts['default_ipv4'].address }}"
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
# CLEANUP TEST ITEMS
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Generate self-signed certificates.
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Host test absent
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Set host1_fqdn .. host6_fqdn
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
- name: Get IPv4 address prefix from server node
|
||||
set_fact:
|
||||
ipv4_prefix: "{{ ansible_default_ipv4.address.split('.')[:-1] |
|
||||
ipv4_prefix: "{{ ansible_facts['default_ipv4'].address.split('.')[:-1] |
|
||||
join('.') }}"
|
||||
|
||||
- name: Host "{{ host1_fqdn }}" present
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Get Realm from server name
|
||||
set_fact:
|
||||
ipaserver_realm: "{{ ansible_fqdn.split('.')[1:] | join ('.') | upper }}"
|
||||
ipaserver_realm: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') | upper }}"
|
||||
when: ipaserver_realm is not defined
|
||||
|
||||
- name: Set host1_fqdn .. host3_fqdn
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Get Realm from server name
|
||||
set_fact:
|
||||
ipaserver_realm: "{{ ansible_fqdn.split('.')[1:] | join ('.') | upper }}"
|
||||
ipaserver_realm: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') | upper }}"
|
||||
when: ipaserver_realm is not defined
|
||||
|
||||
- name: Set host1_fqdn .. host3_fqdn
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Set host1_fqdn .. host6_fqdn
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Set host1_fqdn .. host6_fqdn
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
- name: Get IPv4 address prefix from server node
|
||||
set_fact:
|
||||
ipv4_prefix: "{{ ansible_default_ipv4.address.split('.')[:-1] |
|
||||
ipv4_prefix: "{{ ansible_facts['default_ipv4'].address.split('.')[:-1] |
|
||||
join('.') }}"
|
||||
|
||||
- name: Host absent
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Set host1_fqdn .. host2_fqdn
|
||||
@@ -55,39 +55,39 @@
|
||||
register: result
|
||||
failed_when: result.changed
|
||||
|
||||
- name: Host "{{ host1_fqdn }}" managed by "{{ ansible_fqdn }}"
|
||||
- name: Host "{{ host1_fqdn }}" managed by "{{ ansible_facts['fqdn'] }}"
|
||||
ipahost:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{ host1_fqdn }}"
|
||||
managedby_host: "{{ ansible_fqdn }}"
|
||||
managedby_host: "{{ ansible_facts['fqdn'] }}"
|
||||
action: member
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
|
||||
- name: Host "{{ host1_fqdn }}" managed by "{{ ansible_fqdn }}" again
|
||||
- name: Host "{{ host1_fqdn }}" managed by "{{ ansible_facts['fqdn'] }}" again
|
||||
ipahost:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{ host1_fqdn }}"
|
||||
managedby_host: "{{ ansible_fqdn }}"
|
||||
managedby_host: "{{ ansible_facts['fqdn'] }}"
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.changed
|
||||
|
||||
- name: Host "{{ host1_fqdn }}" not managed by "{{ ansible_fqdn }}"
|
||||
- name: Host "{{ host1_fqdn }}" not managed by "{{ ansible_facts['fqdn'] }}"
|
||||
ipahost:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{ host1_fqdn }}"
|
||||
managedby_host: "{{ ansible_fqdn }}"
|
||||
managedby_host: "{{ ansible_facts['fqdn'] }}"
|
||||
action: member
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
|
||||
- name: Host "{{ host1_fqdn }}" not managed by "{{ ansible_fqdn }}" again
|
||||
- name: Host "{{ host1_fqdn }}" not managed by "{{ ansible_facts['fqdn'] }}" again
|
||||
ipahost:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{ host1_fqdn }}"
|
||||
managedby_host: "{{ ansible_fqdn }}"
|
||||
managedby_host: "{{ ansible_facts['fqdn'] }}"
|
||||
action: member
|
||||
state: absent
|
||||
register: result
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Get Realm from server name
|
||||
set_fact:
|
||||
ipaserver_realm: "{{ ansible_fqdn.split('.')[1:] | join ('.') | upper }}"
|
||||
ipaserver_realm: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') | upper }}"
|
||||
when: ipaserver_realm is not defined
|
||||
|
||||
- name: Set host1_fqdn
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Set host1_fqdn and host2_fqdn
|
||||
@@ -77,11 +77,11 @@
|
||||
debug:
|
||||
var: ipahost.host["{{host2_fqdn }}"].randompassword
|
||||
|
||||
- name: Enrolled host "{{ ansible_fqdn }}" fails to set random password with update_password always
|
||||
- name: Enrolled host "{{ ansible_facts['fqdn'] }}" fails to set random password with update_password always
|
||||
ipahost:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
hosts:
|
||||
- name: "{{ ansible_fqdn }}"
|
||||
- name: "{{ ansible_facts['fqdn'] }}"
|
||||
random: yes
|
||||
update_password: always
|
||||
register: ipahost
|
||||
@@ -89,7 +89,7 @@
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- ipahost.host["{{ ansible_fqdn }}"].randompassword is
|
||||
- ipahost.host["{{ ansible_facts['fqdn'] }}"].randompassword is
|
||||
not defined
|
||||
- "'Password cannot be set on enrolled host' in ipahost.msg"
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Set host1_fqdn
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
- name: Get IPv4 address prefix from server node
|
||||
set_fact:
|
||||
ipv4_prefix: "{{ ansible_default_ipv4.address.split('.')[:-1] |
|
||||
ipv4_prefix: "{{ ansible_facts['default_ipv4'].address.split('.')[:-1] |
|
||||
join('.') }}"
|
||||
|
||||
- name: Set zone prefixes.
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Set host1_fqdn .. host6_fqdn
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Set host1_fqdn .. host5_fqdn
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Get Realm from server name
|
||||
set_fact:
|
||||
ipaserver_realm: "{{ ansible_fqdn.split('.')[1:] | join ('.') | upper }}"
|
||||
ipaserver_realm: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') | upper }}"
|
||||
when: ipaserver_realm is not defined
|
||||
|
||||
- name: Set host1_fqdn .. host2_fqdn
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Ensure host-group databases, mysql-server and oracle-server are absent
|
||||
|
||||
@@ -6,6 +6,15 @@
|
||||
tasks:
|
||||
- include_tasks: ../env_freeipa_facts.yml
|
||||
|
||||
- name: Ensure testing groups are present.
|
||||
ipagroup:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{ item }}"
|
||||
state: present
|
||||
with_items:
|
||||
- rbacgroup1
|
||||
- rbacgroup2
|
||||
|
||||
# CLEANUP TEST ITEMS
|
||||
|
||||
- name: Ensure permission perm-test-1 is absent
|
||||
@@ -24,6 +33,8 @@
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
object_type: host
|
||||
memberof: rbacgroup1
|
||||
filter: '(cn=*.ipa.*)'
|
||||
right: all
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
@@ -33,50 +44,260 @@
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
object_type: host
|
||||
memberof: rbacgroup1
|
||||
filter: '(cn=*.ipa.*)'
|
||||
right: all
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 member User Administrators privilege is present
|
||||
- name: Ensure permission perm-test-1 has an extra filter '(cn=*.internal.*)'
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
privilege: "User Administrators"
|
||||
filter: '(cn=*.internal.*)'
|
||||
action: member
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 member User Administrators privilege is present again
|
||||
- name: Ensure permission perm-test-1 has an extra filter '(cn=*.internal.*)', again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
privilege: "User Administrators"
|
||||
filter: '(cn=*.internal.*)'
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 member User Administrators privilege is absent
|
||||
- name: Ensure permission perm-test-1 `right` has `write`
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
privilege: "User Administrators"
|
||||
right: write
|
||||
action: member
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 `right` has `write`, again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
right: write
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 `right` has no `write`
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
right: write
|
||||
action: member
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
# NOTE: We use the "User Administrators" Privilege here since we don't have a module
|
||||
# to make one. A test privilege should be used in the future.
|
||||
- name: Ensure permission perm-test-1 member User Administrators privilege is absent again
|
||||
- name: Ensure permission perm-test-1 `right` has no `write`, again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
privilege: "User Administrators"
|
||||
right: write
|
||||
action: member
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 `memberof` has `rbackgroup2`
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
memberof: rbacgroup2
|
||||
action: member
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 `memberof` has `rbackgroup2`, again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
memberof: rbacgroup2
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 `memberof` item `rbackgroup1` is absent
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
memberof: rbacgroup1
|
||||
action: member
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 `memberof` item `rbackgroup1` is absent, again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
memberof: rbacgroup1
|
||||
action: member
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 is present with attr carlicense
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
attrs:
|
||||
- carlicense
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 is present with attr carlicense again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
attrs:
|
||||
- carlicense
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 is present with attr carlicense and displayname
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
attrs:
|
||||
- carlicense
|
||||
- displayname
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 is present with attr carlicense and displayname again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
attrs:
|
||||
- carlicense
|
||||
- displayname
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure attr gecos is present in permission perm-test-1
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
attrs:
|
||||
- gecos
|
||||
action: member
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure attr gecos is present in permission perm-test-1 again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
attrs:
|
||||
- gecos
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure attr gecos is absent in permission perm-test-1
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
attrs:
|
||||
- gecos
|
||||
action: member
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure attr gecos is absent in permission perm-test-1 again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
attrs:
|
||||
- gecos
|
||||
action: member
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure attributes carlicense and displayname are present in permission "System{{':'}} Update DNS Entries"
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "System: Update DNS Entries"
|
||||
attrs:
|
||||
- carlicense
|
||||
- displayname
|
||||
action: member
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure attributes carlicense and displayname are present in permission "System{{':'}} Update DNS Entries" again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "System: Update DNS Entries"
|
||||
attrs:
|
||||
- carlicense
|
||||
- displayname
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure attributes carlicense and displayname are present in permission "System{{':'}} Update DNS Entries"
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "System: Update DNS Entries"
|
||||
attrs:
|
||||
- carlicense
|
||||
- displayname
|
||||
action: member
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure attributes carlicense and displayname are present in permission "System{{':'}} Update DNS Entries" again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "System: Update DNS Entries"
|
||||
attrs:
|
||||
- carlicense
|
||||
- displayname
|
||||
action: member
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 has rawfilter '(objectclass=ipagroup)'
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
rawfilter: '(objectclass=ipagroup)'
|
||||
action: member
|
||||
register: result
|
||||
failed_when: not result.changed or result.failed
|
||||
|
||||
- name: Ensure permission perm-test-1 has rawfilter '(objectclass=ipagroup)', again
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
rawfilter: '(objectclass=ipagroup)'
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.changed or result.failed
|
||||
|
||||
- name: Ensure filter and rawfilter cannot be used together.
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: perm-test-1
|
||||
rawfilter: '(objectclass=ipagroup)'
|
||||
filter: '(cn=*.internal.*)'
|
||||
action: member
|
||||
register: result
|
||||
failed_when: not result.failed or "Cannot specify target filter and extra target filter simultaneously" not in result.msg
|
||||
|
||||
- name: Rename permission perm-test-1 to perm-test-renamed
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
@@ -127,7 +348,7 @@
|
||||
|
||||
# CLEANUP TEST ITEMS
|
||||
|
||||
- name: Ensure permission perm-test-1 is absent
|
||||
- name: Ensure testing permissions are absent
|
||||
ipapermission:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name:
|
||||
@@ -135,3 +356,12 @@
|
||||
- perm-test-bindtype-test
|
||||
- perm-test-renamed
|
||||
state: absent
|
||||
|
||||
- name: Ensure testing groups are absent.
|
||||
ipagroup:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{ item }}"
|
||||
state: absent
|
||||
with_items:
|
||||
- rbacgroup1
|
||||
- rbacgroup2
|
||||
|
||||
@@ -2,31 +2,42 @@
|
||||
- name: Ensure test user is absent.
|
||||
ipauser:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: user01
|
||||
name:
|
||||
- user01
|
||||
- user02
|
||||
- user03
|
||||
state: absent
|
||||
|
||||
- name: Ensure test group is absent.
|
||||
ipagroup:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: group01
|
||||
name:
|
||||
- group01
|
||||
- group02
|
||||
state: absent
|
||||
|
||||
- name: Ensure test hostgroup is absent.
|
||||
ipahostgroup:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: hostgroup01
|
||||
name:
|
||||
- hostgroup01
|
||||
- hostgroup02
|
||||
state: absent
|
||||
|
||||
- name: Ensure test host is absent.
|
||||
ipahost:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{ host1_fqdn }}"
|
||||
name:
|
||||
- "{{ host1_fqdn }}"
|
||||
- "{{ host2_fqdn }}"
|
||||
state: absent
|
||||
|
||||
- name: Ensure test service is absent.
|
||||
ipaservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "service01/{{ host1_fqdn }}"
|
||||
name:
|
||||
- "service01/{{ host1_fqdn }}"
|
||||
- "service02/{{ host2_fqdn }}"
|
||||
state: absent
|
||||
|
||||
- name: Ensure test roles are absent.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Set fact for realm name
|
||||
@@ -12,3 +12,4 @@
|
||||
- name: Create FQDN for host01
|
||||
set_fact:
|
||||
host1_fqdn: "host01.{{ ipaserver_domain }}"
|
||||
host2_fqdn: "host02.{{ ipaserver_domain }}"
|
||||
|
||||
@@ -5,30 +5,49 @@
|
||||
- name: Ensure test user is present.
|
||||
ipauser:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: user01
|
||||
first: First
|
||||
last: Last
|
||||
users:
|
||||
- name: user01
|
||||
first: First
|
||||
last: Last
|
||||
- name: user02
|
||||
first: First
|
||||
last: Last
|
||||
- name: user03
|
||||
first: First
|
||||
last: Last
|
||||
|
||||
- name: Ensure test group is present.
|
||||
ipagroup:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: group01
|
||||
name: "{{ item }}"
|
||||
with_items:
|
||||
- group01
|
||||
- group02
|
||||
|
||||
- name: Ensure test host is present.
|
||||
ipahost:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{ host1_fqdn }}"
|
||||
name: "{{ item }}"
|
||||
force: yes
|
||||
with_items:
|
||||
- "{{ host1_fqdn }}"
|
||||
- "{{ host2_fqdn }}"
|
||||
|
||||
- name: Ensure test hostgroup is present.
|
||||
ipahostgroup:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: hostgroup01
|
||||
name: "{{ item[0] }}"
|
||||
host:
|
||||
- "{{ host1_fqdn }}"
|
||||
- "{{ item[1] }}"
|
||||
with_nested:
|
||||
- [hostgroup01, hostgroup02]
|
||||
- ["{{ host1_fqdn }}", "{{ host2_fqdn }}"]
|
||||
|
||||
- name: Ensure test service is present.
|
||||
ipaservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "service01/{{ host1_fqdn }}"
|
||||
name: "{{ item }}"
|
||||
force: yes
|
||||
with_items:
|
||||
- "service01/{{ host1_fqdn }}"
|
||||
- "service02/{{ host2_fqdn }}"
|
||||
|
||||
259
tests/role/test_role_lists_handling.yml
Normal file
259
tests/role/test_role_lists_handling.yml
Normal file
@@ -0,0 +1,259 @@
|
||||
---
|
||||
- name: Test service member in role module.
|
||||
hosts: ipaserver
|
||||
become: yes
|
||||
gather_facts: yes
|
||||
|
||||
tasks:
|
||||
- name: Set environment facts.
|
||||
import_tasks: env_facts.yml
|
||||
|
||||
- name: Setup environment.
|
||||
import_tasks: env_setup.yml
|
||||
|
||||
- name: Add role.
|
||||
iparole:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrole
|
||||
user: user01
|
||||
group: group01
|
||||
hostgroup: hostgroup01
|
||||
host: "{{ host1_fqdn }}"
|
||||
service: "service01/{{ host1_fqdn }}"
|
||||
privilege:
|
||||
- Automember Readers
|
||||
- ADTrust Agents
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
# Test fix for https://github.com/freeipa/ansible-freeipa/issues/409
|
||||
- name: Add new privileges to role.
|
||||
iparole:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrole
|
||||
privilege:
|
||||
- DNS Servers
|
||||
- Host Administrators
|
||||
- DNS Administrators
|
||||
- Group Administrators
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify role privileges.
|
||||
shell:
|
||||
cmd: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa role-show testrole
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: |
|
||||
result.failed or not (
|
||||
"Automember Readers" in result.stdout
|
||||
and "ADTrust Agents" in result.stdout
|
||||
and "DNS Servers" in result.stdout
|
||||
and "Host Administrators" in result.stdout
|
||||
and "DNS Administrators" in result.stdout
|
||||
and "Group Administrators" in result.stdout
|
||||
)
|
||||
vars:
|
||||
KRB5CCNAME: verify_issue_409
|
||||
# End of test fix for https://github.com/freeipa/ansible-freeipa/issues/409
|
||||
|
||||
# Test fix for https://github.com/freeipa/ansible-freeipa/issues/412
|
||||
- name: Add new user to role.
|
||||
iparole:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrole
|
||||
user: user02
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify role users.
|
||||
shell:
|
||||
cmd: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa role-show testrole
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: |
|
||||
result.failed or not (
|
||||
"user01" in result.stdout
|
||||
and "user02" in result.stdout
|
||||
)
|
||||
vars:
|
||||
KRB5CCNAME: verify_issue_412
|
||||
|
||||
- name: Add new group to role.
|
||||
iparole:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrole
|
||||
group: group02
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify role group.
|
||||
shell:
|
||||
cmd: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa role-show testrole
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: |
|
||||
result.failed or not (
|
||||
"group01" in result.stdout
|
||||
and "group02" in result.stdout
|
||||
)
|
||||
vars:
|
||||
KRB5CCNAME: verify_issue_412
|
||||
|
||||
- name: Add new host to role.
|
||||
iparole:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrole
|
||||
host: "{{ host2_fqdn }}"
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify role hosts.
|
||||
shell:
|
||||
cmd: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa role-show testrole
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: |
|
||||
result.failed or not (
|
||||
host1 in result.stdout
|
||||
and host2 in result.stdout
|
||||
)
|
||||
vars:
|
||||
KRB5CCNAME: verify_issue_412
|
||||
host1: " {{ host1_fqdn }}"
|
||||
host2: " {{ host2_fqdn }}"
|
||||
|
||||
- name: Add new hostgroup to role.
|
||||
iparole:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrole
|
||||
hostgroup: hostgroup02
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify role hostgroups.
|
||||
shell:
|
||||
cmd: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa role-show testrole
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: |
|
||||
result.failed or not (
|
||||
" hostgroup01" in result.stdout
|
||||
and " hostgroup02" in result.stdout
|
||||
)
|
||||
vars:
|
||||
KRB5CCNAME: verify_issue_412
|
||||
|
||||
- name: Add new service to role.
|
||||
iparole:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrole
|
||||
service: "service02/{{ host2_fqdn }}"
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify role services.
|
||||
shell:
|
||||
cmd: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa role-show testrole
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: |
|
||||
result.failed or not (
|
||||
service1 in result.stdout
|
||||
and service1 in result.stdout
|
||||
)
|
||||
vars:
|
||||
KRB5CCNAME: verify_issue_412
|
||||
service1: "service01/{{ host1_fqdn }}"
|
||||
service2: "service02/{{ host2_fqdn }}"
|
||||
# End of test fix for https://github.com/freeipa/ansible-freeipa/issues/412
|
||||
|
||||
# Test fix for https://github.com/freeipa/ansible-freeipa/issues/413
|
||||
- name: Add new user to role.
|
||||
iparole:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrole
|
||||
user: user03
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify role services.
|
||||
shell:
|
||||
cmd: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa role-show testrole
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: |
|
||||
result.failed or not (
|
||||
service1 in result.stdout
|
||||
and service1 in result.stdout
|
||||
and "user03" in result.stdout
|
||||
)
|
||||
vars:
|
||||
KRB5CCNAME: verify_issue_413
|
||||
service1: "service01/{{ host1_fqdn }}"
|
||||
service2: "service02/{{ host2_fqdn }}"
|
||||
|
||||
- name: Remove user from role.
|
||||
iparole:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrole
|
||||
user: user03
|
||||
action: member
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify role services.
|
||||
shell:
|
||||
cmd: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa role-show testrole
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: |
|
||||
result.failed or not (
|
||||
service1 in result.stdout
|
||||
and service1 in result.stdout
|
||||
and "user03" not in result.stdout
|
||||
)
|
||||
vars:
|
||||
KRB5CCNAME: verify_issue_413
|
||||
service1: "service01/{{ host1_fqdn }}"
|
||||
service2: "service02/{{ host2_fqdn }}"
|
||||
# End of test fix for https://github.com/freeipa/ansible-freeipa/issues/413
|
||||
|
||||
# Test fix for https://github.com/freeipa/ansible-freeipa/issues/411
|
||||
- name: Add non-existing user to role.
|
||||
iparole:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrole
|
||||
user: nonexisiting_user
|
||||
action: member
|
||||
register: result
|
||||
failed_when: not result.failed
|
||||
# End of test fix for https://github.com/freeipa/ansible-freeipa/issues/411
|
||||
|
||||
# cleanup
|
||||
- name: Cleanup environment.
|
||||
include_tasks: env_cleanup.yml
|
||||
@@ -29,12 +29,12 @@
|
||||
# setup
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
when: ipaserver_domain is not defined
|
||||
|
||||
- name: Get IPv4 address prefix from server node
|
||||
set_fact:
|
||||
ipv4_prefix: "{{ ansible_default_ipv4.address.split('.')[:-1] |
|
||||
ipv4_prefix: "{{ ansible_facts['default_ipv4'].address.split('.')[:-1] |
|
||||
join('.') }}"
|
||||
|
||||
- name: Set test host FQDN
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
- name: Get Domain from server name
|
||||
set_fact:
|
||||
test_domain: "{{ ansible_fqdn.split('.')[1:] | join('.') }}"
|
||||
test_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join('.') }}"
|
||||
|
||||
- name: Set host1, host2 and svc hosts fqdn
|
||||
set_fact:
|
||||
@@ -12,4 +12,4 @@
|
||||
|
||||
- name: Get IPv4 address prefix from server node
|
||||
set_fact:
|
||||
ipv4_prefix: "{{ ansible_default_ipv4.address.split('.')[:-1] | join('.') }}"
|
||||
ipv4_prefix: "{{ ansible_facts['default_ipv4'].address.split('.')[:-1] | join('.') }}"
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
- name: Ensure service is absent
|
||||
ipaservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "mysvc1/{{ ansible_fqdn }}"
|
||||
name: "mysvc1/{{ ansible_facts['fqdn'] }}"
|
||||
state: absent
|
||||
|
||||
- name: Ensure service is present
|
||||
ipaservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "mysvc1/{{ ansible_fqdn }}"
|
||||
name: "mysvc1/{{ ansible_facts['fqdn'] }}"
|
||||
certificate:
|
||||
- MIIC/zCCAeegAwIBAgIUMNHIbn+hhrOVew/2WbkteisV29QwDQYJKoZIhvcNAQELBQAwDzENMAsGA1UEAwwEdGVzdDAeFw0yMDAyMDQxNDQxMDhaFw0zMDAyMDExNDQxMDhaMA8xDTALBgNVBAMMBHRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+XVVGFYpHVkcDfVnNInE1Y/pFciegdzqTjMwUWlRL4Zt3u96GhaMLRbtk+OfEkzLUAhWBOwEraELJzMLJOMvjYF3C+TiGO7dStFLikZmccuSsSIXjnzIPwBXa8KvgRVRyGLoVvGbLJvmjfMXp0nIToTx/i74KF9S++WEes9H5ErJ99CDhLKFgq0amnvsgparYXhypHaRLnikn0vQINt55YoEd1s4KrvEcD2VdZkIMPbLRu2zFvMprF3cjQQG4LT9ggfEXNIPZ1nQWAnAsu7OJEkNF+E4Mkmpcxj9aGUVt5bsq1D+Tzj3GsidSX0nSNcZ2JltXRnL/5v63g5cZyE+nAgMBAAGjUzBRMB0GA1UdDgQWBBRV0j7JYukuH/r/t9+QeNlRLXDlEDAfBgNVHSMEGDAWgBRV0j7JYukuH/r/t9+QeNlRLXDlEDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCgVy1+1kNwHs5y1Zp0WjMWGCJC6/zw7FDG4OW5r2GJiCXZYdJ0UonY9ZtoVLJPrp2/DAv1m5DtnDhBYqicuPgLzEkOS1KdTi20Otm/J4yxLLrZC5W4x0XOeSVPXOJuQWfwQ5pPvKkn6WxYUYkGwIt1OH2nSMngkbami3CbSmKZOCpgQIiSlQeDJ8oGjWFMLDymYSHoVOIXHwNoooyEiaio3693l6noobyGv49zyCVLVR1DC7i6RJ186ql0av+D4vPoiF5mX7+sKC2E8xEj9uKQ5GTWRh59VnRBVC/SiMJ/H78tJnBAvoBwXxSEvj8Z3Kjm/BQqZfv4IBsA5yqV7MVq
|
||||
force: no
|
||||
@@ -33,51 +33,51 @@
|
||||
failed_when: not result.changed
|
||||
|
||||
- name: Obtain keytab
|
||||
shell: ipa-getkeytab -s "{{ ansible_fqdn }}" -p "mysvc1/{{ ansible_fqdn }}" -k mysvc1.keytab
|
||||
shell: ipa-getkeytab -s "{{ ansible_facts['fqdn'] }}" -p "mysvc1/{{ ansible_facts['fqdn'] }}" -k mysvc1.keytab
|
||||
|
||||
- name: Verify keytab
|
||||
shell: ipa service-find "mysvc1/{{ ansible_fqdn }}"
|
||||
shell: ipa service-find "mysvc1/{{ ansible_facts['fqdn'] }}"
|
||||
register: result
|
||||
failed_when: result.failed or result.stdout | regex_search(" Keytab. true")
|
||||
|
||||
- name: Ensure service is disabled
|
||||
ipaservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "mysvc1/{{ ansible_fqdn }}"
|
||||
name: "mysvc1/{{ ansible_facts['fqdn'] }}"
|
||||
state: disabled
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
|
||||
- name: Verify keytab
|
||||
shell: ipa service-find "mysvc1/{{ ansible_fqdn }}"
|
||||
shell: ipa service-find "mysvc1/{{ ansible_facts['fqdn'] }}"
|
||||
register: result
|
||||
failed_when: result.failed or result.stdout | regex_search(" Keytab. true")
|
||||
|
||||
- name: Obtain keytab
|
||||
shell: ipa-getkeytab -s "{{ ansible_fqdn }}" -p "mysvc1/{{ ansible_fqdn }}" -k mysvc1.keytab
|
||||
shell: ipa-getkeytab -s "{{ ansible_facts['fqdn'] }}" -p "mysvc1/{{ ansible_facts['fqdn'] }}" -k mysvc1.keytab
|
||||
|
||||
- name: Verify keytab
|
||||
shell: ipa service-find "mysvc1/{{ ansible_fqdn }}"
|
||||
shell: ipa service-find "mysvc1/{{ ansible_facts['fqdn'] }}"
|
||||
register: result
|
||||
failed_when: result.failed or result.stdout | regex_search(" Keytab. true")
|
||||
|
||||
- name: Ensure service is disabled
|
||||
ipaservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "mysvc1/{{ ansible_fqdn }}"
|
||||
name: "mysvc1/{{ ansible_facts['fqdn'] }}"
|
||||
state: disabled
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
|
||||
- name: Verify keytab
|
||||
shell: ipa service-find "mysvc1/{{ ansible_fqdn }}"
|
||||
shell: ipa service-find "mysvc1/{{ ansible_facts['fqdn'] }}"
|
||||
register: result
|
||||
failed_when: result.failed or result.stdout | regex_search(" Keytab. true")
|
||||
|
||||
- name: Ensure service is disabled, with no keytab.
|
||||
ipaservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "mysvc1/{{ ansible_fqdn }}"
|
||||
name: "mysvc1/{{ ansible_facts['fqdn'] }}"
|
||||
state: disabled
|
||||
register: result
|
||||
failed_when: result.changed
|
||||
@@ -85,7 +85,7 @@
|
||||
- name: Ensure service is absent
|
||||
ipaservice:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "mysvc1/{{ ansible_fqdn }}"
|
||||
name: "mysvc1/{{ ansible_facts['fqdn'] }}"
|
||||
|
||||
- name: Destroy Kerberos tickets.
|
||||
shell: kdestroy -A -q -c ${KRB5CCNAME}
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
ipahostgroup:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: cluster
|
||||
host: "{{ ansible_fqdn }}"
|
||||
host: "{{ ansible_facts['fqdn'] }}"
|
||||
|
||||
- name: Ensure some sudocmds are available
|
||||
ipasudocmd:
|
||||
@@ -500,20 +500,20 @@
|
||||
register: result
|
||||
failed_when: result.changed
|
||||
|
||||
- name: Ensure host "{{ ansible_fqdn }}" is present in sudorule.
|
||||
- name: Ensure host "{{ ansible_facts['fqdn'] }}" is present in sudorule.
|
||||
ipasudorule:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrule1
|
||||
host: "{{ ansible_fqdn }}"
|
||||
host: "{{ ansible_facts['fqdn'] }}"
|
||||
action: member
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
|
||||
- name: Ensure host "{{ ansible_fqdn }}" is present in sudorule, again.
|
||||
- name: Ensure host "{{ ansible_facts['fqdn'] }}" is present in sudorule, again.
|
||||
ipasudorule:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: testrule1
|
||||
host: "{{ ansible_fqdn }}"
|
||||
host: "{{ ansible_facts['fqdn'] }}"
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.changed
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
tasks:
|
||||
- name: Get Domain from the server name
|
||||
set_fact:
|
||||
ipaserver_domain: "{{ ansible_fqdn.split('.')[1:] | join ('.') }}"
|
||||
ipaserver_domain: "{{ ansible_facts['fqdn'].split('.')[1:] | join ('.') }}"
|
||||
|
||||
- name: Ensure sudorules are absent
|
||||
ipasudorule:
|
||||
|
||||
@@ -169,7 +169,7 @@ def list_test_yaml(dir_path):
|
||||
`test_` and the extension is `.yml`.
|
||||
"""
|
||||
yamls = []
|
||||
for root, dirs, files in os.walk(dir_path):
|
||||
for root, _dirs, files in os.walk(dir_path):
|
||||
for yaml_name in files:
|
||||
if yaml_name.startswith("test_") and yaml_name.endswith(".yml"):
|
||||
test_yaml_path = os.path.join(root, yaml_name)
|
||||
|
||||
@@ -38,35 +38,35 @@
|
||||
name: vaultgroup
|
||||
state: absent
|
||||
|
||||
- name: Remove password file from target host.
|
||||
- name: Remove files from target host.
|
||||
file:
|
||||
path: "{{ ansible_env.HOME }}/password.txt"
|
||||
path: "{{ ansible_facts['env'].HOME }}/{{ item }}"
|
||||
state: absent
|
||||
with_items:
|
||||
- A_private.pem
|
||||
- A_public.pem
|
||||
- B_private.pem
|
||||
- B_public.pem
|
||||
- A_private.b64
|
||||
- A_public.b64
|
||||
- B_private.b64
|
||||
- B_public.b64
|
||||
- password.txt
|
||||
- in.txt
|
||||
- out.txt
|
||||
|
||||
- name: Remove public key file from target host.
|
||||
- name: Remove files from controller.
|
||||
file:
|
||||
path: "{{ ansible_env.HOME }}/public.pem"
|
||||
path: "{{ playbook_dir }}/{{ item }}"
|
||||
state: absent
|
||||
|
||||
- name: Remove private key file from target host.
|
||||
file:
|
||||
path: "{{ ansible_env.HOME }}/private.pem"
|
||||
state: absent
|
||||
|
||||
- name: Remove output data file from target host.
|
||||
file:
|
||||
path: "{{ ansible_env.HOME }}/data.txt"
|
||||
state: absent
|
||||
|
||||
- name: Remove input data file from target host.
|
||||
file:
|
||||
path: "{{ ansible_env.HOME }}/in.txt"
|
||||
state: absent
|
||||
|
||||
- name: Remove private/public key files.
|
||||
shell:
|
||||
cmd: rm -f private.pem public.pem
|
||||
delegate_to: localhost
|
||||
become: no
|
||||
args:
|
||||
warn: no # suppres warning for not using the `file` module.
|
||||
with_items:
|
||||
- A_private.pem
|
||||
- A_public.pem
|
||||
- B_private.pem
|
||||
- B_public.pem
|
||||
- A_private.b64
|
||||
- A_public.b64
|
||||
- B_private.b64
|
||||
- B_public.b64
|
||||
|
||||
@@ -3,37 +3,34 @@
|
||||
- name: Ensure environment is clean.
|
||||
import_tasks: env_cleanup.yml
|
||||
|
||||
- name: Create private key file.
|
||||
- name: Create private/public key pair.
|
||||
shell:
|
||||
cmd: openssl genrsa -out private.pem 2048
|
||||
cmd: |
|
||||
openssl genrsa -out "{{ item }}private.pem" 2048
|
||||
openssl rsa -in "{{ item }}private.pem" -outform PEM -pubout -out "{{ item }}public.pem"
|
||||
base64 "{{ item }}public.pem" -w5000 > "{{ item }}public.b64"
|
||||
base64 "{{ item }}private.pem" -w5000 > "{{ item }}private.b64"
|
||||
delegate_to: localhost
|
||||
become: no
|
||||
with_items:
|
||||
- A_
|
||||
- B_
|
||||
|
||||
- name: Create public key file.
|
||||
shell:
|
||||
cmd: openssl rsa -in private.pem -outform PEM -pubout -out public.pem
|
||||
delegate_to: localhost
|
||||
become: no
|
||||
|
||||
- name: Copy password file to target host.
|
||||
- name: Copy files to target host.
|
||||
copy:
|
||||
src: "{{ playbook_dir }}/password.txt"
|
||||
dest: "{{ ansible_env.HOME }}/password.txt"
|
||||
|
||||
- name: Copy public key file to target host.
|
||||
copy:
|
||||
src: "{{ playbook_dir }}/public.pem"
|
||||
dest: "{{ ansible_env.HOME }}/public.pem"
|
||||
|
||||
- name: Copy private key file to target host.
|
||||
copy:
|
||||
src: "{{ playbook_dir }}/private.pem"
|
||||
dest: "{{ ansible_env.HOME }}/private.pem"
|
||||
|
||||
- name: Copy input data file to target host.
|
||||
copy:
|
||||
src: "{{ playbook_dir }}/in.txt"
|
||||
dest: "{{ ansible_env.HOME }}/in.txt"
|
||||
src: "{{ playbook_dir }}/{{ item }}"
|
||||
dest: "{{ ansible_facts['env'].HOME }}/{{ item }}"
|
||||
with_items:
|
||||
- A_private.pem
|
||||
- A_public.pem
|
||||
- B_private.pem
|
||||
- B_public.pem
|
||||
- A_private.b64
|
||||
- A_public.b64
|
||||
- B_private.b64
|
||||
- B_public.b64
|
||||
- password.txt
|
||||
- in.txt
|
||||
|
||||
- name: Ensure vaultgroup exists.
|
||||
ipagroup:
|
||||
|
||||
@@ -25,9 +25,9 @@
|
||||
- name: Ensure vault is present
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{vault.name}}"
|
||||
vault_type: "{{vault.vault_type}}"
|
||||
public_key: "{{lookup('file', 'private.pem', rstrip=False) | b64encode}}"
|
||||
name: "{{ vault.name }}"
|
||||
vault_type: "{{ vault.vault_type }}"
|
||||
public_key: "{{lookup('file', 'A_private.b64')}}"
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
when: vault.vault_type == 'asymmetric'
|
||||
@@ -151,7 +151,7 @@
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{vault.name}}"
|
||||
action: member
|
||||
services: "HTTP/{{ ansible_fqdn }}"
|
||||
services: "HTTP/{{ ansible_facts['fqdn'] }}"
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
|
||||
@@ -160,7 +160,7 @@
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{vault.name}}"
|
||||
action: member
|
||||
services: "HTTP/{{ ansible_fqdn }}"
|
||||
services: "HTTP/{{ ansible_facts['fqdn'] }}"
|
||||
register: result
|
||||
failed_when: result.changed
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{vault.name}}"
|
||||
action: member
|
||||
services: "HTTP/{{ ansible_fqdn }}"
|
||||
services: "HTTP/{{ ansible_facts['fqdn'] }}"
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
@@ -179,7 +179,7 @@
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{vault.name}}"
|
||||
action: member
|
||||
services: "HTTP/{{ ansible_fqdn }}"
|
||||
services: "HTTP/{{ ansible_facts['fqdn'] }}"
|
||||
state: absent
|
||||
register: result
|
||||
failed_when: result.changed
|
||||
@@ -264,7 +264,7 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{vault.name}}"
|
||||
ownerservices: "HTTP/{{ ansible_fqdn }}"
|
||||
ownerservices: "HTTP/{{ ansible_facts['fqdn'] }}"
|
||||
action: member
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
@@ -273,7 +273,7 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{vault.name}}"
|
||||
ownerservices: "HTTP/{{ ansible_fqdn }}"
|
||||
ownerservices: "HTTP/{{ ansible_facts['fqdn'] }}"
|
||||
action: member
|
||||
register: result
|
||||
failed_when: result.changed
|
||||
@@ -282,7 +282,7 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{vault.name}}"
|
||||
ownerservices: "HTTP/{{ ansible_fqdn }}"
|
||||
ownerservices: "HTTP/{{ ansible_facts['fqdn'] }}"
|
||||
state: absent
|
||||
action: member
|
||||
register: result
|
||||
@@ -292,7 +292,7 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: "{{vault.name}}"
|
||||
ownerservices: "HTTP/{{ ansible_fqdn }}"
|
||||
ownerservices: "HTTP/{{ ansible_facts['fqdn'] }}"
|
||||
state: absent
|
||||
action: member
|
||||
register: result
|
||||
|
||||
@@ -14,18 +14,111 @@
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
vault_type: asymmetric
|
||||
public_key: "{{ lookup('file', 'public.pem', rstrip=False) | b64encode }}"
|
||||
public_key: "{{ lookup('file', 'A_public.b64') }}"
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Ensure asymmetric vault is present, again
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
vault_type: asymmetric
|
||||
public_key: "{{ lookup('file', 'public.pem', rstrip=False) | b64encode }}"
|
||||
public_key: "{{ lookup('file', 'A_public.b64') }}"
|
||||
register: result
|
||||
failed_when: result.changed
|
||||
failed_when: result.failed or result.changed
|
||||
|
||||
- name: Archive data to asymmetric vault.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
vault_data: SomeValue
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Retrieve data from asymmetric vault using key A.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
private_key: "{{ lookup('file', 'A_private.b64') }}"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.failed or result.changed or result.vault.data != 'SomeValue'
|
||||
|
||||
- name: Change asymmetric vault key to B.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
vault_type: asymmetric
|
||||
public_key: "{{ lookup('file', 'B_public.b64') }}"
|
||||
private_key: "{{ lookup('file', 'A_private.b64') }}"
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Retrieve data from asymmetric vault using key B.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
private_key: "{{ lookup('file', 'B_private.b64') }}"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.failed or result.changed or result.vault.data != 'SomeValue'
|
||||
|
||||
- name: Change asymmetric vault key to A, using key_file
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
vault_type: asymmetric
|
||||
public_key_file: "{{ ansible_facts['env'].HOME }}/A_public.pem"
|
||||
private_key: "{{ lookup('file', 'B_private.b64') }}"
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Retrieve data from asymmetric vault using key A, with key_file.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
private_key_file: "{{ ansible_facts['env'].HOME }}/A_private.pem"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.failed or result.changed or result.vault.data != 'SomeValue'
|
||||
|
||||
- name: Change asymmetric vault key to B key, using key_files
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
vault_type: asymmetric
|
||||
public_key_file: "{{ ansible_facts['env'].HOME }}/B_public.pem"
|
||||
private_key_file: "{{ ansible_facts['env'].HOME }}/A_private.pem"
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Retrieve data from asymmetric vault, using key B.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
private_key: "{{ lookup('file', 'B_private.b64') }}"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.failed or result.changed or result.vault.data != 'SomeValue'
|
||||
|
||||
- name: Change asymmetric vault key to A, without specifying vault_type.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
vault_type: asymmetric
|
||||
public_key: "{{ lookup('file', 'A_public.b64') }}"
|
||||
private_key: "{{ lookup('file', 'B_private.b64') }}"
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Change asymmetric vault key to B, with key files, without specifying vault_type.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
public_key_file: "{{ ansible_facts['env'].HOME }}/B_public.pem"
|
||||
private_key_file: "{{ ansible_facts['env'].HOME }}/A_private.pem"
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Archive data to asymmetric vault, matching `no_log` field.
|
||||
ipavault:
|
||||
@@ -39,12 +132,12 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
private_key: "{{ lookup('file', 'private.pem', rstrip=False) | b64encode }}"
|
||||
private_key: "{{ lookup('file', 'B_private.b64') }}"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.vault.data != 'SomeADMINpassword' or result.changed
|
||||
|
||||
- name: Archive data to asymmetric vault
|
||||
- name: Change data in asymmetric vault
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
@@ -52,28 +145,28 @@
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
|
||||
- name: Retrieve data from asymmetric vault.
|
||||
- name: Retrieve changed data from asymmetric vault.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
private_key: "{{ lookup('file', 'private.pem', rstrip=False) | b64encode }}"
|
||||
private_key: "{{ lookup('file', 'B_private.b64') }}"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.vault.data != 'Hello World.' or result.changed
|
||||
|
||||
- name: Retrieve data from asymmetric vault into file {{ ansible_env.HOME }}/data.txt.
|
||||
- name: Retrieve data from asymmetric vault into file {{ ansible_facts['env'].HOME }}/data.txt.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
out: "{{ ansible_env.HOME }}/data.txt"
|
||||
private_key: "{{ lookup('file', 'private.pem', rstrip=False) | b64encode }}"
|
||||
out: "{{ ansible_facts['env'].HOME }}/data.txt"
|
||||
private_key: "{{ lookup('file', 'B_private.b64') }}"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.changed or result.failed or (result.vault.data | default(false))
|
||||
|
||||
- name: Verify retrieved data.
|
||||
slurp:
|
||||
src: "{{ ansible_env.HOME }}/data.txt"
|
||||
src: "{{ ansible_facts['env'].HOME }}/data.txt"
|
||||
register: slurpfile
|
||||
failed_when: slurpfile['content'] | b64decode != 'Hello World.'
|
||||
|
||||
@@ -89,7 +182,7 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
private_key: "{{ lookup('file', 'private.pem', rstrip=False) | b64encode }}"
|
||||
private_key: "{{ lookup('file', 'B_private.b64') }}"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.vault.data != 'The world of π is half rounded.' or result.changed
|
||||
@@ -99,7 +192,7 @@
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
vault_type: asymmetric
|
||||
in: "{{ ansible_env.HOME }}/in.txt"
|
||||
in: "{{ ansible_facts['env'].HOME }}/in.txt"
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
|
||||
@@ -107,7 +200,7 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
private_key: "{{ lookup('file', 'private.pem', rstrip=False) | b64encode }}"
|
||||
private_key: "{{ lookup('file', 'B_private.b64') }}"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.vault.data != 'Another World.' or result.changed
|
||||
@@ -124,7 +217,7 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
private_key: "{{ lookup('file', 'private.pem', rstrip=False) | b64encode }}"
|
||||
private_key: "{{ lookup('file', 'B_private.b64') }}"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.vault.data != 'c' or result.changed
|
||||
@@ -149,7 +242,7 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
public_key_file: "{{ ansible_env.HOME }}/public.pem"
|
||||
public_key_file: "{{ ansible_facts['env'].HOME }}/B_public.pem"
|
||||
vault_type: asymmetric
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
@@ -158,7 +251,7 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
public_key_file: "{{ ansible_env.HOME }}/public.pem"
|
||||
public_key_file: "{{ ansible_facts['env'].HOME }}/B_public.pem"
|
||||
vault_type: asymmetric
|
||||
register: result
|
||||
failed_when: result.changed
|
||||
@@ -175,7 +268,7 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
private_key: "{{ lookup('file', 'private.pem', rstrip=False) | b64encode }}"
|
||||
private_key: "{{ lookup('file', 'B_private.b64') }}"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.vault.data != 'Hello World.' or result.changed
|
||||
@@ -184,7 +277,7 @@
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: asymvault
|
||||
private_key_file: "{{ ansible_env.HOME }}/private.pem"
|
||||
private_key_file: "{{ ansible_facts['env'].HOME }}/B_private.pem"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.vault.data != 'Hello World.' or result.changed
|
||||
@@ -206,4 +299,4 @@
|
||||
failed_when: result.changed
|
||||
|
||||
- name: Cleanup testing environment.
|
||||
import_tasks: env_setup.yml
|
||||
import_tasks: env_cleanup.yml
|
||||
|
||||
304
tests/vault/test_vault_change_type.yml
Normal file
304
tests/vault/test_vault_change_type.yml
Normal file
@@ -0,0 +1,304 @@
|
||||
---
|
||||
- name: Test vault
|
||||
hosts: ipaserver
|
||||
become: true
|
||||
# Need to gather facts for ansible_env.
|
||||
gather_facts: true
|
||||
|
||||
tasks:
|
||||
- name: Setup testing environment.
|
||||
import_tasks: env_setup.yml
|
||||
|
||||
- name: Ensure test_vault is absent.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
state: absent
|
||||
|
||||
- name: Create standard vault with no data archived.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: standard
|
||||
|
||||
- name: Change from standard to asymmetric
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: asymmetric
|
||||
public_key: "{{ lookup('file', 'A_public.b64') }}"
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- block:
|
||||
- name: Change from asymmetric to symmetric
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: symmetric
|
||||
private_key: "{{ lookup('file', 'A_private.b64') }}"
|
||||
password: SomeVAULTpassword
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify assymetric-only fields are not present.
|
||||
shell: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa vault-show test_vault
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: result.failed or "Public Key:" in result.stdout
|
||||
|
||||
vars:
|
||||
KRB5CCNAME: verify_change_from_asymmetric
|
||||
|
||||
- block:
|
||||
- name: Change from symmetric to standard
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: standard
|
||||
password: SomeVAULTpassword
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify salt is not present.
|
||||
shell: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa vault-show test_vault
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: result.failed or "Salt:" in result.stdout
|
||||
|
||||
vars:
|
||||
KRB5CCNAME: verify_change_from_symmetric
|
||||
|
||||
- name: Change from standard to symmetric
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: symmetric
|
||||
password: SomeVAULTpassword
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- block:
|
||||
- name: Change from symmetric to asymmetric
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: asymmetric
|
||||
password: SomeVAULTpassword
|
||||
public_key: "{{ lookup('file', 'A_public.b64') }}"
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify salt is not present.
|
||||
shell: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa vault-show test_vault
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: result.failed or "Salt:" in result.stdout
|
||||
|
||||
vars:
|
||||
KRB5CCNAME: verify_change_from_symmetric
|
||||
|
||||
- block:
|
||||
- name: Change from asymmetric to standard
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: standard
|
||||
private_key: "{{ lookup('file', 'A_private.b64') }}"
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify assymetric-only fields are not present.
|
||||
shell: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa vault-show test_vault
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: result.failed or "Public Key:" in result.stdout
|
||||
|
||||
vars:
|
||||
KRB5CCNAME: verify_change_from_asymmetric
|
||||
|
||||
- name: Ensure test_vault is absent.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
state: absent
|
||||
|
||||
- name: Create standard vault with data archived.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: standard
|
||||
data: hello
|
||||
|
||||
- name: Change from standard to asymmetric, with data
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: asymmetric
|
||||
public_key: "{{ lookup('file', 'A_public.b64') }}"
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Retrieve data from asymmetric vault.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
private_key: "{{ lookup('file', 'A_private.b64') }}"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.failed or result.changed or result.vault.data != 'hello'
|
||||
|
||||
- block:
|
||||
- name: Change from asymmetric to symmetric, with data
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: symmetric
|
||||
private_key: "{{ lookup('file', 'A_private.b64') }}"
|
||||
password: SomeVAULTpassword
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify assymetric-only fields are not present.
|
||||
shell: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa vault-show test_vault
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: result.failed or "Public Key:" in result.stdout
|
||||
|
||||
vars:
|
||||
KRB5CCNAME: verify_change_from_asymmetric
|
||||
|
||||
- name: Retrieve data from symmetric vault.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
password: SomeVAULTpassword
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.failed or result.changed or result.vault.data != 'hello'
|
||||
|
||||
- block:
|
||||
- name: Change from symmetric to standard, with data
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: standard
|
||||
password: SomeVAULTpassword
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify salt is not present.
|
||||
shell: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa vault-show test_vault
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: result.failed or "Salt:" in result.stdout
|
||||
|
||||
vars:
|
||||
KRB5CCNAME: verify_change_from_symmetric
|
||||
|
||||
- name: Retrieve data from standard vault.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.failed or result.changed or result.vault.data != 'hello'
|
||||
|
||||
- name: Change from standard to symmetric, with data
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: symmetric
|
||||
password: SomeVAULTpassword
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Retrieve data from symmetric vault.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
state: retrieved
|
||||
password: SomeVAULTpassword
|
||||
register: result
|
||||
failed_when: result.failed or result.changed or result.vault.data != 'hello'
|
||||
|
||||
- block:
|
||||
- name: Change from symmetric to asymmetric, with data
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: asymmetric
|
||||
password: SomeVAULTpassword
|
||||
public_key: "{{ lookup('file', 'A_public.b64') }}"
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed
|
||||
|
||||
- name: Verify salt is not present.
|
||||
shell: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa vault-show test_vault
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: result.failed or "Salt:" in result.stdout
|
||||
|
||||
vars:
|
||||
KRB5CCNAME: verify_change_from_symmetric
|
||||
|
||||
- name: Retrieve data from asymmetric vault.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
state: retrieved
|
||||
private_key: "{{ lookup('file', 'A_private.b64') }}"
|
||||
register: result
|
||||
failed_when: result.failed or result.changed or result.vault.data != 'hello'
|
||||
|
||||
- block:
|
||||
- name: Change from asymmetric to standard, with data
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
vault_type: standard
|
||||
private_key: "{{ lookup('file', 'A_private.b64') }}"
|
||||
register: result
|
||||
failed_when: result.failed or not result.changed or result.failed
|
||||
|
||||
- name: Verify assymetric-only fields are not present.
|
||||
shell: |
|
||||
echo SomeADMINpassword | kinit -c {{ KRB5CCNAME }} admin
|
||||
KRB5CCNAME={{ KRB5CCNAME }} ipa vault-show test_vault
|
||||
kdestroy -A -q -c {{ KRB5CCNAME }}
|
||||
register: result
|
||||
failed_when: result.failed or "Public Key:" in result.stdout
|
||||
|
||||
vars:
|
||||
KRB5CCNAME: verify_change_from_asymmetric
|
||||
|
||||
- name: Retrieve data from standard vault.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.failed or result.changed or result.vault.data != 'hello'
|
||||
|
||||
- name: Remove test_vault.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: test_vault
|
||||
state: absent
|
||||
|
||||
- name: Cleanup testing environment.
|
||||
import_tasks: env_cleanup.yml
|
||||
@@ -57,18 +57,18 @@
|
||||
register: result
|
||||
failed_when: result.vault.data != 'Hello World.' or result.changed
|
||||
|
||||
- name: Retrieve data from standard vault into file {{ ansible_env.HOME }}/data.txt.
|
||||
- name: Retrieve data from standard vault into file {{ ansible_facts['env'].HOME }}/data.txt.
|
||||
ipavault:
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: stdvault
|
||||
out: "{{ ansible_env.HOME }}/data.txt"
|
||||
out: "{{ ansible_facts['env'].HOME }}/data.txt"
|
||||
state: retrieved
|
||||
register: result
|
||||
failed_when: result.changed or result.failed or (result.vault.data | default(false))
|
||||
|
||||
- name: Verify retrieved data.
|
||||
slurp:
|
||||
src: "{{ ansible_env.HOME }}/data.txt"
|
||||
src: "{{ ansible_facts['env'].HOME }}/data.txt"
|
||||
register: slurpfile
|
||||
failed_when: slurpfile['content'] | b64decode != 'Hello World.'
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
ipaadmin_password: SomeADMINpassword
|
||||
name: stdvault
|
||||
vault_type: standard
|
||||
in: "{{ ansible_env.HOME }}/in.txt"
|
||||
in: "{{ ansible_facts['env'].HOME }}/in.txt"
|
||||
register: result
|
||||
failed_when: not result.changed
|
||||
|
||||
@@ -138,4 +138,4 @@
|
||||
failed_when: result.changed
|
||||
|
||||
- name: Cleanup testing environment.
|
||||
import_tasks: env_setup.yml
|
||||
import_tasks: env_cleanup.yml
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user