示例#1
0
    def __call__(self, argv, help):
        inject_ansible_paths()
        import ansible.constants as C
        from ansible.runner import Runner
        from ansible import errors
        from ansible import callbacks
        from ploy_ansible.inventory import Inventory
        from ansible import utils
        parser = utils.base_parser(
            constants=C,
            runas_opts=True,
            subset_opts=True,
            output_opts=True,
            check_opts=True,
            diff_opts=False,
            usage='%s ansible <host-pattern> [options]' % self.ctrl.progname
        )
        parser.remove_option('-i')
        parser.remove_option('-k')
        parser.add_option(
            '-a', '--args', dest='module_args',
            help="module arguments", default=C.DEFAULT_MODULE_ARGS)
        parser.add_option(
            '-m', '--module-name', dest='module_name',
            help="module name to execute (default=%s)" % C.DEFAULT_MODULE_NAME,
            default=C.DEFAULT_MODULE_NAME)
        options, args = parser.parse_args(argv)
        if len(args) == 0 or len(args) > 1:
            parser.print_help()
            sys.exit(1)

        # su and sudo command line arguments need to be mutually exclusive
        if (hasattr(options, 'su')
                and (options.su or options.su_user or options.ask_su_pass)
                and (options.sudo or options.sudo_user or options.ask_sudo_pass)):
            parser.error("Sudo arguments ('--sudo', '--sudo-user', and '--ask-sudo-pass') "
                         "and su arguments ('-su', '--su-user', and '--ask-su-pass') are "
                         "mutually exclusive")

        if hasattr(options, 'ask_vault_pass') and (options.ask_vault_pass and options.vault_password_file):
                parser.error("--ask-vault-pass and --vault-password-file are mutually exclusive")

        cbs = callbacks.CliRunnerCallbacks()
        cbs.options = options
        pattern = args[0]
        patch_connect(self.ctrl)
        inventory_manager = Inventory(self.ctrl)
        if options.subset:
            inventory_manager.subset(options.subset)
        sudopass = None
        su_pass = None
        vault_pass = None
        kw = {}
        options.ask_sudo_pass = options.ask_sudo_pass or C.DEFAULT_ASK_SUDO_PASS
        kw['ask_sudo_pass'] = options.ask_sudo_pass
        if hasattr(options, 'ask_su_pass'):
            options.ask_su_pass = options.ask_su_pass or C.DEFAULT_ASK_SU_PASS
            kw['ask_su_pass'] = options.ask_sudo_pass
        if hasattr(options, 'ask_vault_pass'):
            options.ask_vault_pass = options.ask_vault_pass or C.DEFAULT_ASK_VAULT_PASS
            kw['ask_vault_pass'] = options.ask_vault_pass
        passwds = utils.ask_passwords(**kw)
        if len(passwds) == 2:
            (sshpass, sudopass) = passwds
        elif len(passwds) == 3:
            (sshpass, sudopass, su_pass) = passwds
        else:
            (sshpass, sudopass, su_pass, vault_pass) = passwds
        if getattr(options, 'vault_password_file', None):
            this_path = os.path.expanduser(options.vault_password_file)
            try:
                f = open(this_path, "rb")
                tmp_vault_pass = f.read().strip()
                f.close()
            except (OSError, IOError), e:
                raise errors.AnsibleError("Could not read %s: %s" % (this_path, e))

            if not options.ask_vault_pass:
                vault_pass = tmp_vault_pass