def cli(*args, **kwargs): ''' pyinfra manages the state of one or more servers. It can be used for app/service deployment, config management and ad-hoc command execution. Documentation: pyinfra.readthedocs.io # INVENTORY \b + a file (inventory.py) + hostname (host.net) + Comma separated hostnames: host-1.net,host-2.net,@local # OPERATIONS \b # Run one or more deploys against the inventory pyinfra INVENTORY deploy_web.py [deploy_db.py]... \b # Run a single operation against the inventory pyinfra INVENTORY server.user pyinfra home=/home/pyinfra \b # Execute an arbitrary command on the inventory pyinfra INVENTORY exec -- echo "hello world" \b # Run one or more facts on the inventory pyinfra INVENTORY fact linux_distribution [users]... pyinfra INVENTORY all-facts ''' try: _main(*args, **kwargs) except PyinfraError as e: # Re-raise any internal exceptions that aren't handled by click as # CliErrors which are. if not isinstance(e, click.ClickException): message = getattr(e, 'message', e.args[0]) raise CliError(message) raise except UnexpectedExternalError: # Pass unexpected external exceptions through as-is raise except Exception as e: # Re-raise any unexpected internal exceptions as UnexpectedInternalError raise UnexpectedInternalError(e) finally: if pseudo_state.isset() and pseudo_state.initialised: # Triggers any executor disconnect requirements disconnect_all(pseudo_state)
def _exit(): if pseudo_state.isset() and pseudo_state.failed_hosts: sys.exit(1) sys.exit(0)