Blame utils/ansible-ipa-server-install

Packit 8cb997
#!/usr/bin/python
Packit 8cb997
# -*- coding: utf-8 -*-
Packit 8cb997
Packit 8cb997
# Authors:
Packit 8cb997
#   Thomas Woerner <twoerner@redhat.com>
Packit 8cb997
#
Packit 8cb997
# Copyright (C) 2019  Red Hat
Packit 8cb997
# see file 'COPYING' for use and warranty information
Packit 8cb997
#
Packit 8cb997
# This program is free software; you can redistribute it and/or modify
Packit 8cb997
# it under the terms of the GNU General Public License as published by
Packit 8cb997
# the Free Software Foundation, either version 3 of the License, or
Packit 8cb997
# (at your option) any later version.
Packit 8cb997
#
Packit 8cb997
# This program is distributed in the hope that it will be useful,
Packit 8cb997
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 8cb997
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 8cb997
# GNU General Public License for more details.
Packit 8cb997
#
Packit 8cb997
# You should have received a copy of the GNU General Public License
Packit 8cb997
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 8cb997
Packit 8cb997
import os
Packit 8cb997
import sys
Packit 8cb997
import shutil
Packit 8cb997
import tempfile
Packit 8cb997
import argparse
Packit 8cb997
import traceback
Packit 8cb997
import subprocess
Packit 8cb997
Packit 8cb997
Packit 8cb997
def parse_options():
Packit 8cb997
    usage = "Usage: anisble-ipa-server-install [options] <ansible host>"
Packit 8cb997
Packit 8cb997
    parser = argparse.ArgumentParser(usage=usage)
Packit 8cb997
    parser.add_argument("--version", dest="version",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="show program's version number and exit")
Packit 8cb997
    parser.add_argument("-U", "--unattended", dest="unattended",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="unattended (un)installation never prompts the "
Packit 8cb997
                        "user")
Packit 8cb997
    parser.add_argument("--uninstall", dest="uninstall",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="uninstall an existing installation. The "
Packit 8cb997
                        "uninstall can be run with --unattended option")
Packit 8cb997
    # basic
Packit 8cb997
    parser.add_argument("-p", "--ds-password", dest="dm_password",
Packit 8cb997
                        default=None,
Packit 8cb997
                        help="Directory Manager password")
Packit 8cb997
    parser.add_argument("-a", "--admin-password", dest="admin_password",
Packit 8cb997
                        default=None,
Packit 8cb997
                        help="admin user kerberos password")
Packit 8cb997
    parser.add_argument("--ip-address", dest="ip_addresses",
Packit 8cb997
                        metavar="IP_ADDRESS",
Packit 8cb997
                        action='append', default=None,
Packit 8cb997
                        help="Master Server IP Address. This option can be "
Packit 8cb997
                        "used multiple times")
Packit 8cb997
    parser.add_argument("-n", "--domain", dest="domain",
Packit 8cb997
                        metavar="DOMAIN_NAME", default=None,
Packit 8cb997
                        help="primary DNS domain of the IPA deployment (not "
Packit 8cb997
                        "necessarily related to the current hostname)")
Packit 8cb997
    parser.add_argument("-r", "--realm", dest="realm",
Packit 8cb997
                        metavar="REALM_NAME", default=None,
Packit 8cb997
                        help="Kerberos realm name of the IPA deployment "
Packit 8cb997
                        "(typically un upper-cased name of the primary DNS "
Packit 8cb997
                        "domain)")
Packit 8cb997
    parser.add_argument("--hostname", dest="hostname",
Packit 8cb997
                        metavar="HOST_NAME", default=None,
Packit 8cb997
                        help="fully qualified name of this host")
Packit 8cb997
    parser.add_argument("--ca-cert-file", dest="ca_cert_file",
Packit 8cb997
                        metavar="FILE", default=None,
Packit 8cb997
                        help="File containing CA certificates for the "
Packit 8cb997
                        "service certificate files")
Packit 8cb997
    parser.add_argument("--pki-config-override", dest="pki_config_override",
Packit 8cb997
                        default=None,
Packit 8cb997
                        help="Path to ini file with config overrides.")
Packit 8cb997
    parser.add_argument("--no-host-dns", dest="no_host_dns",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="Do not use DNS for hostname lookup during "
Packit 8cb997
                        "installation")
Packit 8cb997
    # server
Packit 8cb997
    parser.add_argument("--setup-adtrust", dest="setup_adtrust",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="configure AD trust capability")
Packit 8cb997
    parser.add_argument("--setup-kra", dest="setup_kra",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="configure a dogtag KRA")
Packit 8cb997
    parser.add_argument("--setup-dns", dest="setup_dns",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="configure bind with our zone")
Packit 8cb997
    parser.add_argument("--idstart", dest="idstart",
Packit 8cb997
                        type=int, default=None,
Packit 8cb997
                        help="The starting value for the IDs range (default "
Packit 8cb997
                        "random)")
Packit 8cb997
    parser.add_argument("--idmax", dest="idmax",
Packit 8cb997
                        default=None, type=int,
Packit 8cb997
                        help="The max value for the IDs range (default: "
Packit 8cb997
                        "idstart+199999)")
Packit 8cb997
    parser.add_argument("--no-hbac-allow", dest="no_hbac_allow",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="Don't install allow_all HBAC rule")
Packit 8cb997
    parser.add_argument("--no-pkinit", dest="no_pkinit",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="disables pkinit setup steps")
Packit 8cb997
    parser.add_argument("--no-ui-redirect", dest="no_ui_redirect",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="Do not automatically redirect to the Web UI")
Packit 8cb997
    parser.add_argument("--dirsrv-config-file", dest="dirsrv_config_file",
Packit 8cb997
                        metavar="FILE", default=None,
Packit 8cb997
                        help="The path to LDIF file that will be used to "
Packit 8cb997
                        "modify configuration of dse.ldif during "
Packit 8cb997
                        "installation of the directory server instance")
Packit 8cb997
    # ssl certificate
Packit 8cb997
    parser.add_argument("--dirsrv-cert-file", dest="dirsrv_cert_files",
Packit 8cb997
                        metavar="FILE", default=None, action="append",
Packit 8cb997
                        help="File containing the Directory Server SSL "
Packit 8cb997
                        "certificate and private key")
Packit 8cb997
    parser.add_argument("--http-cert-file", dest="http_cert_files",
Packit 8cb997
                        metavar="FILE", default=None, action="append",
Packit 8cb997
                        help="File containing the Apache Server SSL "
Packit 8cb997
                        "certificate and private key")
Packit 8cb997
    parser.add_argument("--pkinit-cert-file", dest="pkinit_cert_files",
Packit 8cb997
                        metavar="FILE", default=None, action="append",
Packit 8cb997
                        help="File containing the Kerberos KDC SSL "
Packit 8cb997
                        "certificate and Private key")
Packit 8cb997
    parser.add_argument("--dirsrv-pin", dest="dirsrv_pin",
Packit 8cb997
                        metavar="PIN", default=None,
Packit 8cb997
                        help="The password to unlock the Directory Server "
Packit 8cb997
                        "private key")
Packit 8cb997
    parser.add_argument("--http-pin", dest="http_pin",
Packit 8cb997
                        metavar="PIN", default=None,
Packit 8cb997
                        help="The password to unlock the Apache Server "
Packit 8cb997
                        "private key")
Packit 8cb997
    parser.add_argument("--pkinit-pin", dest="pkinit_pin",
Packit 8cb997
                        metavar="PIN", default=None,
Packit 8cb997
                        help="The password to unlock the Kerberos KDC "
Packit 8cb997
                        "private key")
Packit 8cb997
    parser.add_argument("--dirsrv-cert-name", dest="dirsrv_cert_name",
Packit 8cb997
                        metavar="NAME", default=None,
Packit 8cb997
                        help="Name of the Directory Server SSL certificate "
Packit 8cb997
                        "to install")
Packit 8cb997
    parser.add_argument("--http-cert-name", dest="http_cert_name",
Packit 8cb997
                        metavar="NAME", default=None,
Packit 8cb997
                        help="Name of the Apache Server SSL certificate to "
Packit 8cb997
                        "install")
Packit 8cb997
    parser.add_argument("--pkinit-cert-name", dest="pkinit_cert_name",
Packit 8cb997
                        metavar="NAME", default=None,
Packit 8cb997
                        help="Name of the Kerberos KDC SSL certificate to "
Packit 8cb997
                        "install")
Packit 8cb997
    # client
Packit 8cb997
    parser.add_argument("--mkhomedir", dest="mkhomedir",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="create home directories for users on their "
Packit 8cb997
                        "first login")
Packit 8cb997
    parser.add_argument("--ntp-server", dest="ntp_servers",
Packit 8cb997
                        metavar="NTP_SERVER",
Packit 8cb997
                        action='append', default=None,
Packit 8cb997
                        help="ntp server to use. This option can be used "
Packit 8cb997
                        "multiple times")
Packit 8cb997
    parser.add_argument("--ntp-pool", dest="ntp_pool",
Packit 8cb997
                        default=None,
Packit 8cb997
                        help="ntp server pool to use")
Packit 8cb997
    parser.add_argument("-N", "--no-ntp", dest="no_ntp",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="do not configure ntp")
Packit 8cb997
    parser.add_argument("--ssh-trust-dns", dest="ssh_trust_dns",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="configure OpenSSH client to trust DNS SSHFP "
Packit 8cb997
                        "records")
Packit 8cb997
    parser.add_argument("--no-ssh", dest="no_ssh",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="do not configure OpenSSH client")
Packit 8cb997
    parser.add_argument("--no-sshd", dest="no_sshd",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="do not configure OpenSSH server")
Packit 8cb997
    parser.add_argument("--no-dns-sshfp", dest="no_dns_sshfp",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="do not automatically create DNS SSHFP records")
Packit 8cb997
    # certificate system
Packit 8cb997
    parser.add_argument("--external-ca", dest="external_ca",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="Generate a CSR for the IPA CA certificate to "
Packit 8cb997
                        "be signed by an external CA")
Packit 8cb997
    parser.add_argument("--external-ca-type", dest="external_ca_type",
Packit 8cb997
                        choices=("generic", "ms-cs"), default=None,
Packit 8cb997
                        help="Type of the external CA")
Packit 8cb997
    parser.add_argument("--external-ca-profile", dest="external_ca_profile",
Packit 8cb997
                        default=None,
Packit 8cb997
                        help="Specify the certificate profile/template to "
Packit 8cb997
                        "use at the external CA")
Packit 8cb997
    parser.add_argument("--external-cert-file", dest="external_cert_files",
Packit 8cb997
                        metavar="FILE", default=None, action="append",
Packit 8cb997
                        help="File containing the IPA CA certificate and the "
Packit 8cb997
                        "external CA certificate chain")
Packit 8cb997
    parser.add_argument("--subject-base", dest="subject_base",
Packit 8cb997
                        default=None,
Packit 8cb997
                        help="The certificate subject base (default "
Packit 8cb997
                        "O=<realm-name>). RDNs are in LDAP order (most "
Packit 8cb997
                        "specific RDN first).")
Packit 8cb997
    parser.add_argument("--ca-subject", dest="ca_subject",
Packit 8cb997
                        default=None,
Packit 8cb997
                        help="The CA certificate subject DN (default "
Packit 8cb997
                        "CN=Certificate Authority,O=<realm-name>). RDNs are "
Packit 8cb997
                        "in LDAP order (most specific RDN first).")
Packit 8cb997
    parser.add_argument("--ca-signing-algorithm", dest="ca_signing_algorithm",
Packit 8cb997
                        choices=("SHA1withRSA", "SHA256withRSA",
Packit 8cb997
                                 "SHA512withRSA"),
Packit 8cb997
                        default=None,
Packit 8cb997
                        help="Signing algorithm of the IPA CA certificate")
Packit 8cb997
    # dns
Packit 8cb997
    parser.add_argument("--allow-zone-overlap", dest="allow_zone_overlap",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="Create DNS zone even if it already exists")
Packit 8cb997
    parser.add_argument("--reverse-zone", dest="reverse_zones",
Packit 8cb997
                        metavar="REVERSE_ZONE", action="append", default=None,
Packit 8cb997
                        help="The reverse DNS zone to use. This option can "
Packit 8cb997
                        "be used multiple times")
Packit 8cb997
    parser.add_argument("--no-reverse", dest="no_reverse",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="Do not create new reverse DNS zone")
Packit 8cb997
    parser.add_argument("--auto-reverse", dest="auto_reverse",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="Create necessary reverse zones")
Packit 8cb997
    parser.add_argument("--zonemgr", dest="zonemgr",
Packit 8cb997
                        default=None,
Packit 8cb997
                        help="DNS zone manager e-mail address. Defaults to "
Packit 8cb997
                        "hostmaster@DOMAIN")
Packit 8cb997
    parser.add_argument("--forwarder", dest="forwarders",
Packit 8cb997
                        action="append", default=None,
Packit 8cb997
                        help="Add a DNS forwarder. This option can be used "
Packit 8cb997
                        "multiple times")
Packit 8cb997
    parser.add_argument("--no-forwarders", dest="no_forwarders",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="Do not add any DNS forwarders, use root "
Packit 8cb997
                        "servers instead")
Packit 8cb997
    parser.add_argument("--auto-forwarders", dest="auto_forwarders",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="Use DNS forwarders configured in "
Packit 8cb997
                        "/etc/resolv.conf")
Packit 8cb997
    parser.add_argument("-forward-policy-", dest="forward_policy",
Packit 8cb997
                        choices=("only", "first"), default=None,
Packit 8cb997
                        help="DNS forwarding policy for global forwarders")
Packit 8cb997
    parser.add_argument("--no-dnssec-validation", dest="no_dnssec_validation",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="Disable DNSSEC validation")
Packit 8cb997
    # ad trust
Packit 8cb997
    parser.add_argument("--enable-compat", dest="enable_compat",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="Enable support for trusted domains for old "
Packit 8cb997
                        "clients")
Packit 8cb997
    parser.add_argument("--netbios-name", dest="netbios_name",
Packit 8cb997
                        default=None,
Packit 8cb997
                        help="NetBIOS name of the IPA domain")
Packit 8cb997
    parser.add_argument("--rid-base", dest="rid_base",
Packit 8cb997
                        default=None, type=int,
Packit 8cb997
                        help="Start value for mapping UIDs and GIDs to RIDs")
Packit 8cb997
    parser.add_argument("--secondary-rid-base", dest="secondary_rid_base",
Packit 8cb997
                        default=None, type=int,
Packit 8cb997
                        help="Start value of the secondary range for mapping "
Packit 8cb997
                        "UIDs and GIDs to RIDs")
Packit 8cb997
    # deprecated
Packit 8cb997
    parser.add_argument("--domain-level", type=int,
Packit 8cb997
                        help="IPA domain level (deprecated)")
Packit 8cb997
    # uninstall
Packit 8cb997
    parser.add_argument("--ignore-topology-disconnect",
Packit 8cb997
                        dest="ignore_topology_disconnect",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="do not check whether server uninstall "
Packit 8cb997
                        "disconnects the topology (domain level 1+)")
Packit 8cb997
    parser.add_argument("--ignore-last-of-role", dest="ignore_last_of_role",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="do not check whether server uninstall removes "
Packit 8cb997
                        "last CA/DNS server or DNSSec master (domain level "
Packit 8cb997
                        "1+)")
Packit 8cb997
    # logging and output
Packit 8cb997
    parser.add_argument("-v", "--verbose", dest="verbose",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="print debugging information")
Packit 8cb997
    parser.add_argument("-d", "--debug", dest="verbose",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="alias for --verbose (deprecated)")
Packit 8cb997
    parser.add_argument("-q", "--quiet", dest="quiet",
Packit 8cb997
                        action="store_true",
Packit 8cb997
                        help="output only errors")
Packit 8cb997
    parser.add_argument("--log-file", dest="log_file",
Packit 8cb997
                        help="log to the given file")
Packit 8cb997
Packit 8cb997
    # ansible
Packit 8cb997
    parser.add_argument("--ipaserver-install-packages",
Packit 8cb997
                        dest="ipaserver_install_packages",
Packit 8cb997
                        choices=("yes", "no"), default=None,
Packit 8cb997
                        help="The bool value defines if the needed packages "
Packit 8cb997
                        "are installed on the node. Default: yes")
Packit 8cb997
    parser.add_argument("--ipaserver-setup-firewalld",
Packit 8cb997
                        dest="ipaserver_setup_firewalld",
Packit 8cb997
                        choices=("yes", "no"), default=None,
Packit 8cb997
                        help="The value defines if the needed services will "
Packit 8cb997
                        "automatically be openen in the firewall managed by "
Packit 8cb997
                        "firewalld. Default: yes")
Packit 8cb997
    parser.add_argument("--ipaserver-external-cert-files-from-controller",
Packit 8cb997
                        dest="ipaserver_external_cert_files_from_controller",
Packit 8cb997
                        default=None, action="append",
Packit 8cb997
                        help="Files containing the IPA CA certificates and "
Packit 8cb997
                        "the external CA certificate chains on the "
Packit 8cb997
                        "controller that will be copied to the ipaserver "
Packit 8cb997
                        "host to /root folder.")
Packit 8cb997
    parser.add_argument("--ipaserver-copy-csr-to-controller",
Packit 8cb997
                        dest="ipaserver_copy_csr_to_controller",
Packit 8cb997
                        choices=("yes", "no"), default=None,
Packit 8cb997
                        help="Copy the generated CSR from the ipaserver to "
Packit 8cb997
                        "the controller as <hostname>-ipa.csr.")
Packit 8cb997
    # playbook
Packit 8cb997
    parser.add_argument("--playbook-dir",
Packit 8cb997
                        dest="playbook_dir",
Packit 8cb997
                        default=None,
Packit 8cb997
                        help="If defined will be used as to create inventory "
Packit 8cb997
                        "file and playbook in. The files will not be removed "
Packit 8cb997
                        "after the playbook processing ended.")
Packit 8cb997
    parser.add_argument("--become-method",
Packit 8cb997
                        dest="become_method",
Packit 8cb997
                        default="sudo",
Packit 8cb997
                        help="privilege escalation method to use "
Packit 8cb997
                        "(default=sudo), use `ansible-doc -t become -l` to "
Packit 8cb997
                        "list valid choices.")
Packit 8cb997
    parser.add_argument("--ansible-verbose",
Packit 8cb997
                        dest="ansible_verbose",
Packit 8cb997
                        type=int, default=None,
Packit 8cb997
                        help="privilege escalation method to use "
Packit 8cb997
                        "(default=sudo), use `ansible-doc -t become -l` to "
Packit 8cb997
                        "list valid choices.")
Packit 8cb997
Packit 8cb997
    options, args = parser.parse_known_args()
Packit 8cb997
Packit 8cb997
    if options.playbook_dir and not os.path.isdir(options.playbook_dir):
Packit 8cb997
        parser.error("playbook dir does not exist")
Packit 8cb997
Packit 8cb997
    if options.log_file:
Packit 8cb997
        parser.error("log_file is not supported")
Packit 8cb997
Packit 8cb997
    if len(args) < 1:
Packit 8cb997
        parser.error("ansible host not set")
Packit 8cb997
    elif len(args) > 1:
Packit 8cb997
        parser.error("too many arguments: %s" % ",".join(args))
Packit 8cb997
Packit 8cb997
    return options, args
Packit 8cb997
Packit 8cb997
Packit 8cb997
def run_cmd(args):
Packit 8cb997
    """
Packit 8cb997
    Execute an external command.
Packit 8cb997
    """
Packit 8cb997
    p_out = subprocess.PIPE
Packit 8cb997
    p_err = subprocess.STDOUT
Packit 8cb997
    try:
Packit 8cb997
        p = subprocess.Popen(args, stdout=p_out, stderr=p_err,
Packit 8cb997
                             close_fds=True, bufsize=1,
Packit 8cb997
                             universal_newlines=True)
Packit 8cb997
        while True:
Packit 8cb997
            line = p.stdout.readline()
Packit 8cb997
            if p.poll() is not None and line == "":
Packit 8cb997
                break
Packit 8cb997
            sys.stdout.write(line)
Packit 8cb997
    except KeyboardInterrupt:
Packit 8cb997
        p.wait()
Packit 8cb997
        raise
Packit 8cb997
    else:
Packit 8cb997
        p.wait()
Packit 8cb997
        return p.returncode
Packit 8cb997
Packit 8cb997
Packit 8cb997
def main(options, args):
Packit 8cb997
    if options.playbook_dir:
Packit 8cb997
        playbook_dir = options.playbook_dir
Packit 8cb997
    else:
Packit 8cb997
        temp_dir = tempfile.mkdtemp(prefix='ansible-ipa-server')
Packit 8cb997
        playbook_dir = temp_dir
Packit 8cb997
Packit 8cb997
    inventory = os.path.join(playbook_dir, "ipaserver-inventory")
Packit 8cb997
    playbook = os.path.join(playbook_dir, "ipaserver-playbook.yml")
Packit 8cb997
Packit 8cb997
    with open(inventory, 'w') as f:
Packit 8cb997
        f.write("[ipaserver]\n")
Packit 8cb997
        f.write("%s\n" % args[0])
Packit 8cb997
        f.write("\n")
Packit 8cb997
        f.write("[ipaserver:vars]\n")
Packit 8cb997
        # basic
Packit 8cb997
        if options.dm_password:
Packit 8cb997
            f.write("ipadm_password=%s\n" % options.dm_password)
Packit 8cb997
        if options.admin_password:
Packit 8cb997
            f.write("ipaadmin_password=%s\n" % options.admin_password)
Packit 8cb997
        if options.ip_addresses:
Packit 8cb997
            f.write("ipaserver_ip_addresses=%s\n" %
Packit 8cb997
                    ",".join(options.ip_addresses))
Packit 8cb997
        if options.domain:
Packit 8cb997
            f.write("ipaserver_domain=%s\n" % options.domain)
Packit 8cb997
        if options.realm:
Packit 8cb997
            f.write("ipaserver_realm=%s\n" % options.realm)
Packit 8cb997
        if options.hostname:
Packit 8cb997
            f.write("ipaserver_hostname=%s\n" % options.hostname)
Packit 8cb997
        if options.ca_cert_file:
Packit 8cb997
            f.write("ipaserver_ca_cert_files=%s\n" % options.ca_cert_file)
Packit 8cb997
        if options.pki_config_override:
Packit 8cb997
            f.write("ipaserver_pki_config_override=yes\n")
Packit 8cb997
        if options.no_host_dns:
Packit 8cb997
            f.write("ipaserver_no_host_dns=yes\n")
Packit 8cb997
        # server
Packit 8cb997
        if options.setup_adtrust:
Packit 8cb997
            f.write("ipaserver_setup_adtrust=yes\n")
Packit 8cb997
        if options.setup_kra:
Packit 8cb997
            f.write("ipaserver_setup_kra=yes\n")
Packit 8cb997
        if options.setup_dns:
Packit 8cb997
            f.write("ipaserver_setup_dns=yes\n")
Packit 8cb997
        if options.idstart:
Packit 8cb997
            f.write("ipaserver_idstart=%s\n" % options.idstart)
Packit 8cb997
        if options.idmax:
Packit 8cb997
            f.write("ipaserver_idmax=%s\n" % options.idmax)
Packit 8cb997
        if options.no_hbac_allow:
Packit 8cb997
            f.write("ipaserver_no_hbac_allow=yes\n")
Packit 8cb997
        if options.no_pkinit:
Packit 8cb997
            f.write("ipaserver_no_pkinit=yes\n")
Packit 8cb997
        if options.no_ui_redirect:
Packit 8cb997
            f.write("ipaserver_no_ui_redirect=yes\n")
Packit 8cb997
        if options.dirsrv_config_file:
Packit 8cb997
            f.write("ipaserver_dirsrv_config_file=%s\n" %
Packit 8cb997
                    options.dirsrv_config_file)
Packit 8cb997
        # ssl certificate
Packit 8cb997
        if options.dirsrv_cert_files:
Packit 8cb997
            f.write("ipaserver_dirsrv_cert_files=%s\n" %
Packit 8cb997
                    ",".join(options.dirsrv_cert_files))
Packit 8cb997
        if options.http_cert_files:
Packit 8cb997
            f.write("ipaserver_http_cert_files=%s\n" %
Packit 8cb997
                    ",".join(options.http_cert_files))
Packit 8cb997
        if options.pkinit_cert_files:
Packit 8cb997
            f.write("ipaserver_pkinit_cert_files=%s\n" %
Packit 8cb997
                    ",".join(options.pkinit_cert_files))
Packit 8cb997
        if options.dirsrv_pin:
Packit 8cb997
            f.write("ipaserver_dirsrv_pin=%s\n" % options.dirsrv_pin)
Packit 8cb997
        if options.http_pin:
Packit 8cb997
            f.write("ipaserver_http_pin=%s\n" % options.http_pin)
Packit 8cb997
        if options.pkinit_pin:
Packit 8cb997
            f.write("ipaserver_pkinit_pin=%s\n" % options.pkinit_pin)
Packit 8cb997
        if options.dirsrv_cert_name:
Packit 8cb997
            f.write("ipaserver_dirsrv_cert_name=%s\n" %
Packit 8cb997
                    options.dirsrv_cert_name)
Packit 8cb997
        if options.http_cert_name:
Packit 8cb997
            f.write("ipaserver_http_cert_name=%s\n" % options.http_cert_name)
Packit 8cb997
        if options.pkinit_cert_name:
Packit 8cb997
            f.write("ipaserver_pkinit_cert_name=%s\n" %
Packit 8cb997
                    options.pkinit_cert_name)
Packit 8cb997
        # client
Packit 8cb997
        if options.mkhomedir:
Packit 8cb997
            f.write("ipaclient_mkhomedir=yes\n")
Packit 8cb997
        if options.ntp_servers:
Packit 8cb997
            f.write("ipaclient_ntp_servers=%s\n" %
Packit 8cb997
                    ",".join(options.ntp_servers))
Packit 8cb997
        if options.ntp_pool:
Packit 8cb997
            f.write("ipaclient_ntp_pool=%s\n" % options.ntp_pool)
Packit 8cb997
        if options.no_ntp:
Packit 8cb997
            f.write("ipaclient_no_ntp=yes\n")
Packit 8cb997
        if options.ssh_trust_dns:
Packit 8cb997
            f.write("ipaclient_ssh_trust_dns=yes\n")
Packit 8cb997
        if options.no_ssh:
Packit 8cb997
            f.write("ipaclient_no_ssh=yes\n")
Packit 8cb997
        if options.no_sshd:
Packit 8cb997
            f.write("ipaclient_no_sshd=yes\n")
Packit 8cb997
        if options.no_dns_sshfp:
Packit 8cb997
            f.write("ipaclient_no_dns_sshfp=yes\n")
Packit 8cb997
        # certificate system
Packit 8cb997
        if options.external_ca:
Packit 8cb997
            f.write("ipaserver_external_ca=yes\n")
Packit 8cb997
        if options.external_ca_type:
Packit 8cb997
            f.write("ipaserver_external_ca_type=%s\n" %
Packit 8cb997
                    options.external_ca_type)
Packit 8cb997
        if options.external_ca_profile:
Packit 8cb997
            f.write("ipaserver_external_ca_profile=%s\n" %
Packit 8cb997
                    options.external_ca_profile)
Packit 8cb997
        if options.external_cert_files:
Packit 8cb997
            f.write("ipaserver_external_cert_files=%s\n" %
Packit 8cb997
                    ",".join(options.external_cert_files))
Packit 8cb997
        if options.subject_base:
Packit 8cb997
            f.write("ipaserver_subject_base=%s\n" % options.subject_base)
Packit 8cb997
        if options.ca_subject:
Packit 8cb997
            f.write("ipaserver_ca_subject=%s\n" % options.ca_subject)
Packit 8cb997
        if options.ca_signing_algorithm:
Packit 8cb997
            f.write("ipaserver_ca_signing_algorithm=%s\n" %
Packit 8cb997
                    options.ca_signing_algorithm)
Packit 8cb997
        # dns
Packit 8cb997
        if options.allow_zone_overlap:
Packit 8cb997
            f.write("ipaserver_allow_zone_overlap=yes\n")
Packit 8cb997
        if options.reverse_zones:
Packit 8cb997
            f.write("ipaserver_reverse_zones=%s\n" %
Packit 8cb997
                    ",".join(options.reverse_zones))
Packit 8cb997
        if options.no_reverse:
Packit 8cb997
            f.write("ipaserver_no_reverse=yes\n")
Packit 8cb997
        if options.auto_reverse:
Packit 8cb997
            f.write("ipaserver_auto_reverse=yes\n")
Packit 8cb997
        if options.zonemgr:
Packit 8cb997
            f.write("ipaserver_zonemgr=%s\n" % options.zonemgr)
Packit 8cb997
        if options.forwarders:
Packit 8cb997
            f.write("ipaserver_forwarders=%s\n" %
Packit 8cb997
                    ",".join(options.forwarders))
Packit 8cb997
        if options.no_forwarders:
Packit 8cb997
            f.write("ipaserver_no_forwarders=yes\n")
Packit 8cb997
        if options.auto_forwarders:
Packit 8cb997
            f.write("ipaserver_auto_forwarders=yes\n")
Packit 8cb997
        if options.forward_policy:
Packit 8cb997
            f.write("ipaserver_forward_policy=%s\n" % options.forward_policy)
Packit 8cb997
        if options.no_dnssec_validation:
Packit 8cb997
            f.write("ipaserver_no_dnssec_validation=yes\n")
Packit 8cb997
        # ad trust
Packit 8cb997
        if options.enable_compat:
Packit 8cb997
            f.write("ipaserver_enable_compat=yes\n")
Packit 8cb997
        if options.netbios_name:
Packit 8cb997
            f.write("ipaserver_netbios_name=%s\n" % options.netbios_name)
Packit 8cb997
        if options.rid_base:
Packit 8cb997
            f.write("ipaserver_rid_base=%s\n" % options.rid_base)
Packit 8cb997
        if options.secondary_rid_base:
Packit 8cb997
            f.write("ipaserver_secondary_rid_base=%s\n" %
Packit 8cb997
                    options.secondary_rid_base)
Packit 8cb997
        # uninstall
Packit 8cb997
        if options.ignore_topology_disconnect:
Packit 8cb997
            f.write("ipaserver_ignore_topology_disconnect=yes\n")
Packit 8cb997
        if options.ignore_last_of_role:
Packit 8cb997
            f.write("ipaserver_ignore_last_of_role=yes\n")
Packit 8cb997
        # ansible
Packit 8cb997
        if options.ipaserver_install_packages:
Packit 8cb997
            f.write("ipaserver_install_packages=%s\n" %
Packit 8cb997
                    options.ipaserver_install_packages)
Packit 8cb997
        if options.ipaserver_setup_firewalld:
Packit 8cb997
            f.write("ipaserver_setup_firewalld=%s\n" %
Packit 8cb997
                    options.ipaserver_setup_firewalld)
Packit 8cb997
        if options.ipaserver_external_cert_files_from_controller:
Packit 8cb997
            f.write("ipaserver_external_cert_files_from_controller=%s\n" %
Packit 8cb997
                    ",".join(
Packit 8cb997
                        options.ipaserver_external_cert_files_from_controller))
Packit 8cb997
        if options.ipaserver_copy_csr_to_controller:
Packit 8cb997
            f.write("ipaserver_copy_csr_to_controller=%s\n" %
Packit 8cb997
                    options.ipaserver_copy_csr_to_controller)
Packit 8cb997
Packit 8cb997
    if options.uninstall:
Packit 8cb997
        state = "absent"
Packit 8cb997
    else:
Packit 8cb997
        state = "present"
Packit 8cb997
Packit 8cb997
    with open(playbook, 'w') as f:
Packit 8cb997
        f.write("---\n")
Packit 8cb997
        f.write("- name: Playbook to configure IPA server\n")
Packit 8cb997
        f.write("  hosts: ipaserver\n")
Packit 8cb997
        f.write("  become: true\n")
Packit 8cb997
        if options.become_method:
Packit 8cb997
            f.write("  become_method: %s\n" % options.become_method)
Packit 8cb997
        f.write("\n")
Packit 8cb997
        f.write("  roles:\n")
Packit 8cb997
        f.write("  - role: ipaserver\n")
Packit 8cb997
        f.write("    state: %s\n" % state)
Packit 8cb997
Packit 8cb997
    cmd = [ 'ansible-playbook' ]
Packit 8cb997
    if options.ansible_verbose:
Packit 8cb997
        cmd.append("-"+"v"*options.ansible_verbose)
Packit 8cb997
    cmd.extend(['-i', inventory, playbook])
Packit 8cb997
    try:
Packit 8cb997
        returncode = run_cmd(cmd)
Packit 8cb997
        if returncode != 0:
Packit 8cb997
            raise RuntimeError()
Packit 8cb997
    finally:
Packit 8cb997
        if not options.playbook_dir:
Packit 8cb997
            shutil.rmtree(temp_dir, ignore_errors=True)
Packit 8cb997
Packit 8cb997
Packit 8cb997
options, args = parse_options()
Packit 8cb997
try:
Packit 8cb997
    main(options, args)
Packit 8cb997
except KeyboardInterrupt:
Packit 8cb997
    sys.exit(1)
Packit 8cb997
except SystemExit as e:
Packit 8cb997
    sys.exit(e)
Packit 8cb997
except RuntimeError as e:
Packit 8cb997
    sys.exit(e)
Packit 8cb997
except Exception as e:
Packit 8cb997
    if options.verbose:
Packit 8cb997
        traceback.print_exc(file=sys.stdout)
Packit 8cb997
    else:
Packit 8cb997
        print("Re-run %s with --verbose option to get more information" %
Packit 8cb997
              sys.argv[0])
Packit 8cb997
Packit 8cb997
    print("Unexpected error: %s" % str(e))
Packit 8cb997
    sys.exit(1)