mirror of
https://github.com/freeipa/ansible-freeipa.git
synced 2026-05-08 14:23:11 +00:00
ipaserver: Remove unused ipaserver/library/ipaserver.py
This commit is contained in:
@@ -1,536 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Authors:
|
||||
# Florence Blanc-Renaud <frenaud@redhat.com>
|
||||
# Thomas Woerner <twoerner@redhat.com>
|
||||
#
|
||||
# Copyright (C) 2017 Red Hat
|
||||
# see file 'COPYING' for use and warranty information
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ANSIBLE_METADATA = {'metadata_version': '1.0',
|
||||
'status': ['preview'],
|
||||
'supported_by': 'community'}
|
||||
|
||||
DOCUMENTATION = '''
|
||||
---
|
||||
module: ipaserver
|
||||
short description: Configures a server machine as IPA server
|
||||
description:
|
||||
Configures a server machine to use IPA for authentication and
|
||||
identity services.
|
||||
The enrollment requires one authentication method among the 3 following:
|
||||
- Kerberos principal and password (principal/password)
|
||||
- Kerberos keytab file (keytab)
|
||||
- One-Time-Password (otp)
|
||||
options:
|
||||
state:
|
||||
description: the server state
|
||||
required: false
|
||||
default: present
|
||||
choices: [ "present", "absent" ]
|
||||
domain:
|
||||
description: The primary DNS domain of an existing IPA deployment
|
||||
required: true
|
||||
realm:
|
||||
description: The Kerberos realm of an existing IPA deployment
|
||||
required: true
|
||||
password:
|
||||
description: The password for the kerberos admin
|
||||
required: true
|
||||
dm_password:
|
||||
description: The password for the Directory Manager
|
||||
required: true
|
||||
|
||||
# ip_addresses:
|
||||
# description: Master Server IP Addresses
|
||||
# required: false
|
||||
# hostname:
|
||||
# description: Fully qualified name of this host
|
||||
# required: false
|
||||
|
||||
mkhomedir:
|
||||
description: Create home directories for users on their first login
|
||||
required: false
|
||||
default: no
|
||||
setup_dns:
|
||||
description: Configure bind with our zone
|
||||
required: false
|
||||
default: no
|
||||
no_host_dns:
|
||||
description: Do not use DNS for hostname lookup during installation
|
||||
required: false
|
||||
default: no
|
||||
no_ntp:
|
||||
description: Do not configure ntp
|
||||
required: false
|
||||
default: no
|
||||
|
||||
idstart:
|
||||
description: The starting value for the IDs range (default random)
|
||||
required: false
|
||||
idmax:
|
||||
description: The max value for the IDs range (default: idstart+199999)
|
||||
required: false
|
||||
no_hbac_allow:
|
||||
description: Don't install allow_all HBAC rule
|
||||
required: false
|
||||
default: no
|
||||
# ignore_topology_disconnect:
|
||||
# description: Do not check whether server uninstall disconnects the topology (domain level 1+)
|
||||
# required: false
|
||||
# default: no
|
||||
# ignore_last_of_role:
|
||||
# description: Do not check whether server uninstall removes last CA/DNS server or DNSSec master (domain level 1+)
|
||||
# required: false
|
||||
no_pkinit:
|
||||
description: Disables pkinit setup steps
|
||||
required: false
|
||||
no_ui_redirect:
|
||||
description: Do not automatically redirect to the Web UI
|
||||
required: false
|
||||
|
||||
ssh_trust_dns:
|
||||
description: Configure OpenSSH client to trust DNS SSHFP records
|
||||
required: false
|
||||
no_ssh:
|
||||
description: Do not configure OpenSSH client
|
||||
required: false
|
||||
no_sshd:
|
||||
description: Do not configure OpenSSH server
|
||||
required: false
|
||||
no_dns_sshfp:
|
||||
description: Do not automatically create DNS SSHFP records
|
||||
required: false
|
||||
dirsrv_config_file:
|
||||
description: The path to LDIF file that will be used to modify configuration of dse.ldif during installation of the directory server instance
|
||||
required: false
|
||||
|
||||
external_ca:
|
||||
description: Generate a CSR for the IPA CA certificate to be signed by an external CA
|
||||
required: false
|
||||
external_ca_type:
|
||||
description: Type of the external CA
|
||||
required: false
|
||||
external_cert_files:
|
||||
description: File containing the IPA CA certificate and the external CA certificate chain
|
||||
required: false
|
||||
|
||||
dirsrv_cert_files:
|
||||
description: File containing the Directory Server SSL certificate and private key
|
||||
required: false
|
||||
dirsrv_pin:
|
||||
description: The password to unlock the Directory Server private key
|
||||
required: false
|
||||
dirsrv_cert_name:
|
||||
description: Name of the Directory Server SSL certificate to install
|
||||
required: false
|
||||
|
||||
http_cert_files:
|
||||
description: File containing the Apache Server SSL certificate and private key
|
||||
required: false
|
||||
http_pin:
|
||||
description: The password to unlock the Apache Server private key
|
||||
required: false
|
||||
http_cert_name:
|
||||
description: Name of the Apache Server SSL certificate to install
|
||||
required: false
|
||||
|
||||
pkinit_cert_files:
|
||||
description: File containing the Kerberos KDC SSL certificate and private key
|
||||
required: false
|
||||
pkinit_pin:
|
||||
description: The password to unlock the Kerberos KDC private key
|
||||
required: false
|
||||
pkinit_cert_name:
|
||||
description: Name of the Kerberos KDC SSL certificate to install
|
||||
required: false
|
||||
|
||||
ca_cert_files:
|
||||
description: File containing CA certificates for the service certificate files
|
||||
required: false
|
||||
subject:
|
||||
description: The certificate subject base (default O=<realm-name>)
|
||||
required: false
|
||||
ca_signing_algorithm:
|
||||
description: Signing algorithm of the IPA CA certificate
|
||||
required: false
|
||||
|
||||
forwarders:
|
||||
description: Add DNS forwarders
|
||||
required: false
|
||||
|
||||
|
||||
|
||||
author:
|
||||
- Florence Blanc-Renaud
|
||||
- Thomas Woerner
|
||||
'''
|
||||
|
||||
EXAMPLES = '''
|
||||
# Example from Ansible Playbooks
|
||||
# Unenroll server
|
||||
- ipaserver:
|
||||
state: absent
|
||||
|
||||
# Enroll server using admin credentials, with auto-discovery
|
||||
- ipaserver:
|
||||
password: MySecretPassword
|
||||
dm_password: MySecretPassword
|
||||
'''
|
||||
|
||||
RETURN = '''
|
||||
tbd
|
||||
'''
|
||||
|
||||
import os
|
||||
from six.moves.configparser import RawConfigParser
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
try:
|
||||
from ipalib.install.sysrestore import SYSRESTORE_STATEFILE
|
||||
except ImportError:
|
||||
from ipapython.sysrestore import SYSRESTORE_STATEFILE
|
||||
from ipaplatform.paths import paths
|
||||
|
||||
|
||||
def is_server_configured():
|
||||
"""
|
||||
Check if ipa server is configured.
|
||||
|
||||
IPA server is configured when /etc/ipa/default.conf exists and
|
||||
/var/lib/ipa/sysrestore/sysrestore.state exists.
|
||||
|
||||
:returns: boolean
|
||||
"""
|
||||
|
||||
return (os.path.isfile(paths.IPA_DEFAULT_CONF) and
|
||||
os.path.isfile(os.path.join(paths.SYSRESTORE,
|
||||
SYSRESTORE_STATEFILE)))
|
||||
|
||||
|
||||
def get_ipa_conf():
|
||||
"""
|
||||
Return IPA configuration read from /etc/ipa/default.conf
|
||||
|
||||
:returns: dict containing key,value
|
||||
"""
|
||||
|
||||
parser = RawConfigParser()
|
||||
parser.read(paths.IPA_DEFAULT_CONF)
|
||||
result = dict()
|
||||
for item in ['basedn', 'realm', 'domain', 'server', 'host', 'xmlrpc_uri']:
|
||||
if parser.has_option('global', item):
|
||||
value = parser.get('global', item)
|
||||
else:
|
||||
value = None
|
||||
if value:
|
||||
result[item] = value
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def main():
|
||||
module = AnsibleModule(
|
||||
supports_check_mode=True,
|
||||
argument_spec=dict(
|
||||
state=dict(default='present', choices=['present', 'absent']),
|
||||
# basic
|
||||
dm_password=dict(required=False, no_log=True),
|
||||
password=dict(required=False, no_log=True),
|
||||
# ip_addresses=dict(required=False, type='list'),
|
||||
domain=dict(required=True),
|
||||
realm=dict(required=True),
|
||||
# hostname=dict(required=False),
|
||||
ca_cert_files=dict(required=False, type='list'),
|
||||
no_host_dns=dict(required=False, type='bool', default=False),
|
||||
# server
|
||||
# setup_adtrust=dict(required=False, type='bool', default=F#alse),
|
||||
# setup_kra=dict(required=False, type='bool', default=False),
|
||||
setup_dns=dict(required=False, type='bool', default=False),
|
||||
idstart=dict(required=False, type='int', default=0),
|
||||
idmax=dict(required=False, type='int', default=0),
|
||||
no_hbac_allow=dict(required=False, type='bool', default=False),
|
||||
no_pkinit=dict(required=False, type='bool', default=False),
|
||||
no_ui_redirect=dict(required=False, type='bool', default=False),
|
||||
dirsrv_config_file=dict(required=False),
|
||||
# ssl certificate
|
||||
dirsrv_cert_files=dict(required=False, type='list'),
|
||||
dirsrv_pin=dict(required=False),
|
||||
dirsrv_cert_name=dict(required=False),
|
||||
http_cert_files=dict(required=False, type='list'),
|
||||
http_pin=dict(required=False),
|
||||
http_cert_name=dict(required=False),
|
||||
pkinit_cert_files=dict(required=False, type='list'),
|
||||
pkinit_pin=dict(required=False),
|
||||
pkinit_cert_name=dict(required=False),
|
||||
# client
|
||||
mkhomedir=dict(required=False, type='bool', default=False),
|
||||
no_ntp=dict(required=False, type='bool', default=False),
|
||||
ssh_trust_dns=dict(required=False, type='bool', default=False),
|
||||
no_ssh=dict(required=False, type='bool', default=False),
|
||||
no_sshd=dict(required=False, type='bool', default=False),
|
||||
no_dns_sshfp=dict(required=False, type='bool', default=False),
|
||||
# certificate system
|
||||
external_ca=dict(required=False),
|
||||
external_ca_type=dict(default='generic',
|
||||
choices=['generic', 'ms-cs']),
|
||||
external_cert_files=dict(required=False, type='list'),
|
||||
subject_base=dict(required=False),
|
||||
ca_signing_algorithm=dict(required=False),
|
||||
|
||||
# dns
|
||||
allow_zone_overlap=dict(required=False, type='bool', default=False),
|
||||
reverse_zones=dict(required=False, type='list'),
|
||||
no_reverse=dict(required=False, type='bool', default=False),
|
||||
auto_reverse=dict(required=False, type='bool', default=False),
|
||||
zone_manager=dict(required=False),
|
||||
forwarders=dict(required=False, type='list'),
|
||||
no_forwarders=dict(required=False, type='bool', default=False),
|
||||
auto_forwarders=dict(required=False, type='bool', default=False),
|
||||
forward_policy=dict(default='first', choices=['first', 'only']),
|
||||
no_dnssec_validation=dict(required=False, type='bool', default=False),
|
||||
# ad trust
|
||||
enable_compat=dict(required=False, type='bool', default=False),
|
||||
netbios_name=dict(required=False),
|
||||
rid_base=dict(required=False),
|
||||
secondary_rid_base=dict(required=False),
|
||||
),
|
||||
)
|
||||
|
||||
module._ansible_debug = True
|
||||
state = module.params.get('state')
|
||||
|
||||
domain = module.params.get('domain')
|
||||
realm = module.params.get('realm')
|
||||
password = module.params.get('password')
|
||||
dm_password = module.params.get('dm_password')
|
||||
|
||||
#ip_addresses = module.params.get('ip_addresses')
|
||||
#hostname = module.params.get('hostname')
|
||||
|
||||
mkhomedir = module.params.get('mkhomedir')
|
||||
setup_dns = module.params.get('setup_dns')
|
||||
no_host_dns = module.params.get('no_host_dns')
|
||||
no_ntp = module.params.get('no_ntp')
|
||||
|
||||
idstart = module.params.get('idstart')
|
||||
idmax = module.params.get('idmax')
|
||||
no_hbac_allow = module.params.get('no_hbac_allow')
|
||||
ignore_topology_disconnect = module.params.get('ignore_topology_disconnect')
|
||||
ignore_last_of_role = module.params.get('ignore_last_of_role')
|
||||
no_pkinit = module.params.get('no_pkinit')
|
||||
no_ui_redirect = module.params.get('no_ui_redirect')
|
||||
|
||||
ssh_trust_dns = module.params.get('ssh_trust_dns')
|
||||
no_ssh = module.params.get('no_ssh')
|
||||
no_sshd = module.params.get('no_sshd')
|
||||
no_dns_sshfp = module.params.get('no_dns_sshfp')
|
||||
dirsrv_config_file = module.params.get('dirsrv_config_file')
|
||||
|
||||
external_ca = module.params.get('external_ca')
|
||||
external_ca_type = module.params.get('external_ca_type')
|
||||
external_cert_files = module.params.get('external_cert_files')
|
||||
|
||||
dirsrv_cert_files=module.params.get('dirsrv_cert_files')
|
||||
dirsrv_pin=module.params.get('dirsrv_pin')
|
||||
dirsrv_cert_name=module.params.get('dirsrv_cert_name')
|
||||
|
||||
http_cert_files=module.params.get('http_cert_files')
|
||||
http_pin=module.params.get('http_pin')
|
||||
http_cert_name=module.params.get('http_cert_name')
|
||||
|
||||
pkinit_cert_files=module.params.get('pkinit_cert_files')
|
||||
pkinit_pin=module.params.get('pkinit_pin')
|
||||
pkinit_cert_name=module.params.get('pkinit_cert_name')
|
||||
|
||||
ca_cert_files=module.params.get('ca_cert_files')
|
||||
subject=module.params.get('subject')
|
||||
ca_signing_algorithm=module.params.get('ca_signing_algorithm')
|
||||
|
||||
forwarders = module.params.get('forwarders')
|
||||
|
||||
if state == 'present':
|
||||
if not password or not dm_password:
|
||||
module.fail_json(
|
||||
msg="Password and dm password need to be specified")
|
||||
|
||||
# Check if ipa server is already configured
|
||||
if is_server_configured():
|
||||
# Check that realm and domain match
|
||||
current_config = get_ipa_conf()
|
||||
if domain and domain != current_config.get('domain'):
|
||||
module.fail_json(msg="IPA server already installed "
|
||||
"with a conflicting domain")
|
||||
if realm and realm != current_config.get('realm'):
|
||||
module.fail_json(msg="IPA server already installed "
|
||||
"with a conflicting realm")
|
||||
|
||||
# server is already configured and no inconsistency
|
||||
# detected
|
||||
return module.exit_json(changed=False, domain=domain, realm=realm)
|
||||
|
||||
# ipa server not installed
|
||||
if module.check_mode:
|
||||
# Do nothing, just return changed=True
|
||||
return module.exit_json(changed=True)
|
||||
|
||||
# basic options
|
||||
cmd = [
|
||||
module.get_bin_path("ipa-server-install"),
|
||||
"-U",
|
||||
"--ds-password", dm_password,
|
||||
"--admin-password", password,
|
||||
"--domain", domain,
|
||||
"--realm", realm,
|
||||
]
|
||||
|
||||
#for ip in ip_addresses:
|
||||
# cmd.append("--ip-address=%s" % ip)
|
||||
#if hostname:
|
||||
# cmd.append("--hostname=%s" % hostname)
|
||||
|
||||
for cert_file in ca_cert_files:
|
||||
cmd.append("--ca-cert-file=%s" % cert_file)
|
||||
if no_host_dns:
|
||||
cmd.append("--no-host-dns")
|
||||
|
||||
# server options
|
||||
#if setup_adtrust:
|
||||
# cmd.append("--setup-adtrust")
|
||||
#if setup_kra:
|
||||
# cmd.append("--setup-kra")
|
||||
if setup_dns:
|
||||
cmd.append("--setup-dns")
|
||||
if idstart:
|
||||
cmd.append("--idstart=%d", idstart)
|
||||
if idmax:
|
||||
cmd.append("--idstart=%d", idmax)
|
||||
if no_hbac_allow:
|
||||
cmd.append("--no_hbac_allow")
|
||||
if no_pkinit:
|
||||
cmd.append("--no-pkinit")
|
||||
if no_ui_redirect:
|
||||
cmd.append("--no-ui-redirect")
|
||||
if dirsrv_config_file:
|
||||
cmd.append("--dirsrv-config-file=%s" % dirsrv_config_file)
|
||||
|
||||
# ssl certificate options
|
||||
for cert_file in dirsrv_cert_files:
|
||||
cmd.append("--dirsrv-cert-file=%s" % cert_file)
|
||||
if dirsrv_pin:
|
||||
cmd.append("--dirsrv-pin=%s" % dirserv_pin)
|
||||
if dirsrv_cert_name:
|
||||
cmd.append("--dirsrv-cert-name=%s" % dirsrv_cert_name)
|
||||
for cert_file in http_cert_files:
|
||||
cmd.append("--http-cert-file=%s" % cert_file)
|
||||
if http_pin:
|
||||
cmd.append("--http-pin=%s" % http_pin)
|
||||
if http_cert_name:
|
||||
cmd.append("--http-cert-name=%s" % http_cert_name)
|
||||
for cert_file in pkinit_cert_files:
|
||||
cmd.append("--pkinit-cert-file=%s" % cert_file)
|
||||
if pkinit_pin:
|
||||
cmd.append("--pkinit-pin=%s" % pkinit_pin)
|
||||
if pkinit_cert_name:
|
||||
cmd.append("--pkinit-cert-name=%s" % pkinit_cert_name)
|
||||
|
||||
# client options
|
||||
if mkhomedir:
|
||||
cmd.append("--mkhomedir")
|
||||
if no_ntp:
|
||||
cmd.append("--no-ntp")
|
||||
if ssh_trust_dns:
|
||||
cmd.append("--ssh-trust-dns")
|
||||
if no_ssh:
|
||||
cmd.append("--no-ssh")
|
||||
if no_sshd:
|
||||
cmd.append("--no-sshd")
|
||||
if no_dns_sshfp:
|
||||
cmd.append("--no-dns-sshfp")
|
||||
|
||||
# certificate system options
|
||||
if external_ca:
|
||||
cmd.append("--external-ca")
|
||||
if external_ca_type:
|
||||
cmd.append("--external-ca-type=%s" % external_ca_type)
|
||||
for cert_file in external_cert_files:
|
||||
cmd.append("--external-cert-file=%s" % cert_file)
|
||||
if subject_base:
|
||||
cmd.append("--subject=%s" % subject)
|
||||
if ca_signing_algorithm:
|
||||
cmd.append("--ca-signing-algorithm=%s" % ca_signing_algorithm)
|
||||
|
||||
# dns options
|
||||
if allow_zone_overlop:
|
||||
cmd.append("--allow-zone-overlap")
|
||||
for reverse_zone in reverse_zones:
|
||||
cmd.append("--reverse-zone=%s" % reverse_zone)
|
||||
if no_reverse:
|
||||
cmd.append("--no-reverse")
|
||||
if auto_reverse:
|
||||
cmd.append("--auto-reverse")
|
||||
if zonemgr:
|
||||
cmd.append("--zonemgr=%s" % zonemgr)
|
||||
for forwarder in forwarders:
|
||||
cmd.append("--forwarder=%s" % forwarder)
|
||||
if no_forwarders:
|
||||
cmd.append("--no-forwarders")
|
||||
if auto_forwarders:
|
||||
cmd.append("--auto-forwarders")
|
||||
if forward_policy:
|
||||
cmd.append("--forward-policy=%s" % forward_policy)
|
||||
if no_dnssec_validation:
|
||||
cmd.append("--no-dnssec-validation")
|
||||
|
||||
# ad trust options
|
||||
#if enable_compat:
|
||||
# cmd.append("--enable-compat")
|
||||
#if netbios_name:
|
||||
# cmd.append("--netbios-name=%s" % netbios_name)
|
||||
#if rid_base:
|
||||
# cmd.append("--rid-base=%s" % rid_base)
|
||||
#if secondary_rid_base:
|
||||
# cmd.append("--secondary-rid-base=%s" % rid_base)
|
||||
|
||||
else: # state == adsent
|
||||
if not is_server_configured():
|
||||
# Nothing to do
|
||||
module.exit_json(changed=False)
|
||||
|
||||
# Server is configured
|
||||
# If in check mode, do nothing but return changed=True
|
||||
if module.check_mode:
|
||||
module.exit_json(changed=True)
|
||||
|
||||
cmd = [
|
||||
module.get_bin_path('ipa-server-install'),
|
||||
"--uninstall",
|
||||
"-U",
|
||||
]
|
||||
|
||||
if ignore_topology_disconnect:
|
||||
cmd.append("--ignore-topology-disconnect")
|
||||
if ignore_last_of_role:
|
||||
cmd.append("--ignore-last-of-role")
|
||||
|
||||
retcode, stdout, stderr = module.run_command(cmd)
|
||||
if retcode != 0:
|
||||
module.fail_json(msg="Failed to uninstall IPA server: %s" % stderr)
|
||||
|
||||
module.exit_json(changed=True)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user