{ "info": { "author": "Adobe", "author_email": "noreply@adobe.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup :: HTML" ], "description": "# Ops CLI\n[![Build status](https://github.com/adobe/ops-cli/actions/workflows/release.yml/badge.svg)](https://github.com/adobe/ops-cli/actions/workflows/release.yml) [![Docker image](https://img.shields.io/badge/Docker-ghcr.io/adobe/opscli-brightgreen.svg?style=flat-square)](https://github.com/adobe/ops-cli/pkgs/container/ops-cli) [![License](https://img.shields.io/github/license/adobe/ops-cli)](https://github.com/adobe/ops-cli/blob/master/LICENSE)\n\n**From version 2.0 onward, `ops-cli` requires Python3. \nIf you're still using Python2, use `ops-cli` version <2.0**\n\n**ops-cli** is a python wrapper for [Terraform](https://www.terraform.io/), [Ansible](https://www.ansible.com/) and SSH for cloud automation. \n\nWe use multiple tools to manage our infrastructure at Adobe. The purpose of `ops-cli` is to gather the common cluster configurations in a single place and, based on these, interact with the above mentioned tools. In this way, we can avoid duplication and can quickly spin up new clusters (either production or development ones). All we need to do is customize the cluster configuration file ([example here](https://github.com/adobe/ops-cli/blob/master/examples/aws-kubernetes/clusters/my-kubernetes-cluster.yaml)).\n\n`ops-cli` integrates with the Azure and AWS cli, in order to provide inventory, ssh, sync, tunnel and the possibility to run ansible playbooks on a fleet of EC2 instances.\nIt can be used to add a layer of templating (using jinja2) on top of Terraform files. This is useful for removing duplicated code when it comes to spinning up infrastructure across multiple environments (stage/sandbox/prod) and across teams. Useful for both AWS and [Kubernetes deployments](https://github.com/adobe/ops-cli/tree/master/examples/aws-kubernetes).\n\n# Table of Contents\n\n\n * [How it works?](#how-it-works)\n * [Use cases](#use-cases)\n * [Manage AWS EC2 instances](#manage-aws-ec2-instances)\n * [Terraform](#terraform)\n * [Run terraform by using hierarchical configs](#run-terraform-by-using-hierarchical-configs)\n * [Create Kubernetes cluster (using AWS EKS)](#create-kubernetes-cluster-using-aws-eks)\n * [Installing](#installing)\n * [Local](#local)\n * [Virtualenv](#virtualenv)\n * [Ops tool installation](#ops-tool-installation)\n * [Python 3](#python-3)\n * [Terraform](#terraform-1)\n * [Using docker image](#using-docker-image)\n * [Configuring](#configuring)\n * [AWS](#aws)\n * [Azure](#azure)\n * [Examples](#examples)\n * [Usage help](#usage-help)\n * [More help](#more-help)\n * [Tool configuration: .opsconfig.yaml](#tool-configuration-opsconfigyaml)\n * [Inventory](#inventory)\n * [AWS example](#aws-example)\n * [Azure example](#azure-example)\n * [Inventory usage](#inventory-usage)\n * [Terraform](#terraform-2)\n * [Terraform landscape](#terraform-landscape)\n * [SSH](#ssh)\n * [SSHPass](#sshpass)\n * [Play](#play)\n * [Run command](#run-command)\n * [Sync files](#sync-files)\n * [Noop](#noop)\n * [Packer](#packer)\n * [Secrets Management](#secrets-management)\n * [Vault](#vault)\n * [Amazon Secrets Manager (SSM)](#amazon-secrets-manager-ssm)\n * [Using jinja2 filters in playbooks and terraform templates](#using-jinja2-filters-in-playbooks-and-terraform-templates)\n * [SKMS](#skms)\n * [Development](#development)\n * [Install ops in development mode](#install-ops-in-development-mode)\n * [Running tests](#running-tests)\n * [Troubleshooting](#troubleshooting)\n * [License](#license)\n\n\n\n\n\n# How it works?\n\nYou define a cluster configuration, using a yaml file. The yaml file contains different kind of sections, one for each plugin. For instance, you could have a section for Terraform files, a section for AWS instructions, Kubernetes Helm charts and so forth.\n\n# Use cases\n\n## Manage AWS EC2 instances\n\nOnce you define your cluster configuration, you can run `ops` commands such as seeing the instance inventory.\n```sh\n# fetch instances from AWS and prints them\nops clusters/mycluster.yaml inventory --limit webapp \n```\n\nThis would output something like:\n![ops](https://user-images.githubusercontent.com/952836/52021401-9f553c80-24fd-11e9-802c-155f5a0e7f63.png)\n\nThen you can run `ssh`, `play`, `run`, `sync` etc.\n\n```sh\n# SSH to one of the nodes (can handle bastion as well)\nops clusters/mycluster.yaml ssh webapp-01\n\n# run a deployment playbook via ansible\nops clusters/mycluster.yaml play ansible/playbooks/task/webapp/deployment.yaml -- -e version=5.36.2 -u ec2-user --limit webapp\n\n# run command on all selected nodes\nops clusters/mycluster.yaml run \"sudo yum upgrade myawesomeapp; sudo service myawesomeapp restart\" -- -u ec2-user --limit '\"aam_app_group=canary;az=us-east-1a\"'\n\n# copy file to all servers\nops clusters/mycluster.yaml sync /tmp/myfile webapp: -l ec2-user\n\n# create a tunnel\nops clusters/stage.yaml ssh --tunnel --local 8080 --remote 8080 stage-thanos-1 -l ec2-user\n```\n\nSee [examples/features/inventory](https://github.com/adobe/ops-cli/tree/master/examples/features/inventory)\n\n## Terraform\n\n```sh\n# Performs jinja templating (if any) and runs terraform plan\nops clusters/mycluster.yaml terraform --path-name aws-eks plan\n\n# Run terraform apply, with the possibility to sync the tf state files remotely (currently, AWS S3 bucket is supported + DynamoDB for locking). \nops clusters/mycluster.yaml terraform --path-name aws-eks apply\n```\n\n![ops-terraform](https://user-images.githubusercontent.com/952836/52021396-9bc1b580-24fd-11e9-9da8-00fb68bd5c72.png)\n\n## Run terraform by using hierarchical configs\n\nSee [examples/features/terraform-hierarchical](https://github.com/adobe/ops-cli/tree/master/examples/features/terraform-hierarchical)\n\n## Create Kubernetes cluster (using AWS EKS)\n\nSee [examples/aws-kubernetes](https://github.com/adobe/ops-cli/tree/master/examples/aws-kubernetes)\n\n# Installing\n\n## Local\n\n### Virtualenv\nHere is a link about how to install and use virtualenv: \nhttps://virtualenv.pypa.io/en/stable/\n\n### Ops tool installation\n\n#### Python 3\n```sh\n# Make sure pip is up to date\ncurl https://bootstrap.pypa.io/get-pip.py | python3\n\n# Install virtualenv\npip install --upgrade virtualenv\npip install --upgrade virtualenvwrapper\n\necho 'export WORKON_HOME=$HOME/.virtualenvs' >> ~/.bash_profile\necho 'source /usr/local/bin/virtualenvwrapper.sh' >> ~/.bash_profile\nsource ~/.bash_profile\n\n# create virtualenv\nmkvirtualenv ops\nworkon ops\n\n# uninstall previous `ops` version (if you have it)\npip uninstall ops --yes\n\n# install ops-cli v2.1.7 stable release\npip install --upgrade ops-cli\n```\n\n\n### Terraform\nOptionally, install terraform to be able to access terraform plugin. See https://www.terraform.io/intro/getting-started/install.html\nAlso for pretty formatting of terraform plan output you can install https://github.com/coinbase/terraform-landscape (use gem install for MacOS)\n\n\n## Using docker image\n\nYou can try out `ops-cli`, by using docker. The docker image has all required prerequisites (python, terraform, helm, git, ops-cli etc).\n\nTo start out a container, running the latest `ops-cli` docker image run:\n```sh\ndocker run -it ghcr.io/adobe/ops-cli:2.1.7 bash\n```\n\nAfter the container has started, you can start using `ops-cli`:\n```sh\nops help\n# usage: ops [-h] [--root-dir ROOT_DIR] [--verbose] [-e EXTRA_VARS]\n# cluster_config_path\n# {inventory,terraform,packer,ssh,play,run,sync,noop} ...\n\ngit clone https://github.com/adobe/ops-cli.git\ncd ops-cli\nls examples\n# aws-kubernetes\n# cassandra-stress\n# features\n\ncd examples/aws-kubernetes\nops clusters/my-kubernetes-cluster.yaml terraform --path-name aws-eks plan\n# in order to setup aws-kubernetes follow the steps from https://github.com/adobe/ops-cli/blob/master/examples/aws-kubernetes/README.md\n```\n\n\n## Configuring\n\n### AWS\nIf you plan to use ops with AWS, you must configure credentials for each account\n```shell\n$ aws configure --profile aws_account_name\n```\n\n### Azure\nTBD\n\n## Examples\n\nSee [examples/](https://github.com/adobe/ops-cli/tree/master/examples) folder:\n- cassandra-stress - n-node cassandra cluster used for stress-testing; a basic stress profile is included\n- spin up a Kubernetes cluster\n- distinct `ops` features\n\n## Usage help\nTo see all commands and a short description run `ops --help`\n```\nusage: ops [-h] [--root-dir ROOT_DIR] [--verbose] [-e EXTRA_VARS]\n cluster_config_path\n {inventory,terraform,packer,ssh,play,run,sync,noop} ...\n\nRun commands against a cluster definition\n\npositional arguments:\n cluster_config_path The cluster config path cluster.yaml\n {inventory,terraform,packer,ssh,play,run,sync,noop}\n inventory Show current inventory data\n terraform Wrap common terraform tasks with full templated\n configuration support\n packer Wrap common packer tasks and inject variables from a\n cluster file\n ssh SSH or create an SSH tunnel to a server in the cluster\n play Run an Ansible playbook\n run Runs a command against hosts in the cluster\n sync Sync files from/to a cluster\n noop used to initialize the full container for api usage\n\noptional arguments:\n -h, --help show this help message and exit\n --root-dir ROOT_DIR The root of the resource tree - it can be an absolute\n path or relative to the current dir\n --verbose, -v Get more verbose output from commands\n -e EXTRA_VARS, --extra-vars EXTRA_VARS\n Extra variables to use. Eg: -e ssh_user=ssh_user\n```\n\n## More help\n\nEach sub-command includes additional help information that you can get by running:\n`ops examples/inventory/aam.yaml sync --help`\n\n## Tool configuration: .opsconfig.yaml\n\nSome tool settings are available via a [.opsconfig.yaml](https://github.com/adobe/ops/blob/master/src/ops/opsconfig.py) configuration file.\nThe file is looked-up in `/etc/opswrapper/.opsconfig.yaml`, then in `~/.opsconfig.yaml` and then in the project folder starting from the current dir and up to the root dir.\nAll the files found this way are merged together so that you can set some global defaults, then project defaults in the root dir of the project and\noverwrite them for individual envs. Eg: `~/.opsconfig.yaml`, `/project/.opsconfig.yaml`, `/project/clusters/dev/.opsconfig.yaml`\n\n### Inventory\n\nThe `inventory` command will list all the servers in a given cluster and cache the results for further operations on them (for instance, SSHing to a given node or running an ansible playbook).\n\nYou can always filter which nodes you want to display or use to run an ansible playbook on, by using the `--limit` argument (eg. `--limit webapp`). The extra filter is applied on the instance tags, which includes the instance name.\n\nThe way `inventory` works is by doing a describe command in AWS/Azure. The describe command matches all the nodes that have the tag \"cluster\" equal to the cluster name you have defined.\n\nIn order to configure it, you need to add the `inventory` section in your cluster configuration file ([example here](https://github.com/adobe/ops-cli/blob/master/examples/features/inventory/my-aws-cluster.yaml)).\n\n#### AWS example\n```\n---\ninventory:\n - plugin: cns\n args:\n clusters:\n - region: us-east-1\n boto_profile: aam-npe # make sure you have this profile in your ~/.aws/credentials file\n names: [mycluster1] # this assumes the EC2 nodes have the Tag Name \"cluster\" with Value \"mycluster1\"\n```\n\n#### Azure example\n```\n---\ninventory:\n - plugin: azr\n args:\n tags: environment=prod\n locations: westeurope,northeurope\n```\n\n#### Inventory usage\n```\nusage: ops cluster_config_path inventory [-h] [-e EXTRA_VARS]\n [--refresh-cache] [--limit LIMIT]\n [--facts]\n\noptional arguments:\n -h, --help show this help message and exit\n -e EXTRA_VARS, --extra-vars EXTRA_VARS\n Extra variables to use. Eg: -e ssh_user=ssh_user\n --refresh-cache Refresh the cache for the inventory\n --limit LIMIT Limit run to a specific server subgroup. Eg: --limit\n newton-dcs\n --facts Show inventory facts for the given hosts\n```\n\n### Terraform\n```\nusage: ops cluster_config_path terraform [-h] [--var VAR] [--module MODULE]\n [--resource RESOURCE] [--name NAME]\n [--plan]\n subcommand\n\npositional arguments:\n subcommand apply | console | destroy | import | output | plan |\n refresh | show | taint | template | untaint\n\noptional arguments:\n -h, --help show this help message and exit\n --var VAR the output var to show\n --module MODULE for use with \"taint\", \"untaint\" and \"import\". The\n module to use. e.g.: vpc\n --resource RESOURCE for use with \"taint\", \"untaint\" and \"import\". The\n resource to target. e.g.: aws_instance.nat\n --name NAME for use with \"import\". The name or ID of the imported\n resource. e.g.: i-abcd1234\n --plan for use with \"show\", show the plan instead of the\n statefile\n --skip-refresh for use with \"plan\". Skip refresh of statefile\n --raw-output for use with \"plan\". Show raw plan output without piping through terraform landscape (if terraform landscape is not enabled in opsconfig.yaml this will have no impact)\n --path-name PATH_NAME in case multiple terraform paths are defined, this\n allows to specify which one to use when running\n terraform\n\n Examples:\n # Create a new cluster with Terraform\n ops clusters/qe1.yaml terraform plan\n ops clusters/qe1.yaml terraform apply\n\n # Update an existing cluster\n ops clusters/qe1.yaml terraform plan\n ops clusters/qe1.yaml terraform apply\n\n # Get rid of a cluster and all of its components\n ops clusters/qe1.yaml terraform destroy\n\n # Retrieve all output from a previously created Terraform cluster\n ops clusters/qe1.yaml terraform output\n\n # Retrieve a specific output from a previously created Terraform cluster\n ops clusters/qe1.yaml terraform output --var nat_public_ip\n\n # Refresh a statefile (no longer part of plan)\n ops clusters/qe1.yaml terraform refresh\n\n # Taint a resource- forces a destroy, then recreate on next plan/apply\n ops clusters/qe1.yaml terraform taint --module vpc --resource aws_instance.nat\n\n # Untaint a resource\n ops clusters/qe1.yaml terraform untaint --module vpc --resource aws_instance.nat\n\n # Show the statefile in human-readable form\n ops clusters/qe1.yaml terraform show\n\n # Show the plan in human-readable form\n ops clusters/qe1.yaml terraform show --plan\n\n # View parsed jinja on the terminal\n ops clusters/qe1.yaml terraform template\n\n # Import an unmanaged existing resource to a statefile\n ops clusters/qe1.yaml terraform import --module vpc --resource aws_instance.nat --name i-abcd1234\n\n # Use the Terraform Console on a cluster\n ops clusters/qe1.yaml terraform console\n\n # Validate the syntax of Terraform files\n ops clusters/qe1.yaml terraform validate\n\n # Specify which terraform path to use\n ops clusters/qe1.yaml terraform plan --path-name terraformFolder1\n```\n#### Terraform landscape\nFor pretty formatting of terraform plan output you can install https://github.com/coinbase/terraform-landscape (use gem install for MacOS). \nTo make `ops` use it you need to add `terraform.landscape: True` in opsconfig.yaml file.\n\n### SSH\n```\nusage: ops cluster_config_path ssh [-h] [-e EXTRA_VARS] [-l USER]\n [--ssh-config SSH_CONFIG] [--index INDEX]\n [--tunnel] [--ipaddress] [--local LOCAL]\n [--remote REMOTE] [--proxy] [--nossh]\n role [ssh_opts [ssh_opts ...]]\n\npositional arguments:\n role Server role to ssh to. Eg: dcs\n ssh_opts Manual ssh options\n\noptional arguments:\n -h, --help show this help message and exit\n -e EXTRA_VARS, --extra-vars EXTRA_VARS\n Extra variables to use. Eg: -e ssh_user=ssh_user\n -l USER, --user USER SSH User\n --ssh-config SSH_CONFIG\n Ssh config file name in the ./ansible dir\n --index INDEX Index of the server from the group\n --tunnel Use SSH tunnel, must pass --local and --remote\n --ipaddress\n --local LOCAL local port for ssh proxy or ssh tunnel\n --remote REMOTE remote port for ssh tunnel\n --proxy Use SSH proxy, must pass --local\n --nossh Port tunnel a machine that does not have SSH. Implies\n --ipaddress, and --tunnel; requires --local and\n --remote\n --keygen Create a ssh keys pair to use with this infrastructure\n --noscb Disable use of Shell Control Box (SCB) even it is\n enabled in the cluster config\n --auto_scb_port When using Shell Control Box (SCB) and creating a\n proxy,a random port is generated, which will be used\n in the ssh config for all playbook, run and sync\n operations\n\n Examples:\n # SSH using current username as remote username\n ops clusters/qe1.yaml ssh nagios\n\n # SSH using a different username\n ops clusters/qe1.yaml ssh nagios -l ec2-user\n\n # SSH to the second nagios instance\n ops clusters/qe1.yaml ssh nagios --index 2\n\n # SSH to a specific hostname, instead of the tagged role\n ops clusters/qe1.yaml ssh full-hostname-here-1\n\n # Create an SSH tunnel to Nagios forwarding the remote port 80 to local port 8080\n ops clusters/qe1.yaml ssh --tunnel --remote 80 --local 8080 nagios\n\n # Create an SSH tunnel to a host where the service is NOT listening on `localhost`\n ops clusters/qe1.yaml ssh --tunnel --remote 80 --local 8080 nagios --ipaddress\n\n # Create an SSH tunnel to a host with an open port which does NOT have SSH itself (Windows)\n # Note that the connection will be made from the Bastion host\n ops clusters/qe1.yaml ssh --tunnel --local 3389 --remote 3389 --nossh windowshost\n\n # Create a proxy to a remote server that listens on a local port\n ops clusters/qe1.yaml ssh --proxy --local 8080 bastion\n\n # In case Shell Control Box (SCB) is configured and enabled on the cluster a proxy which\n # will be used by all ops play, run and sync operations, can be created either using\n # either the port configured the cluster config file or an auto generated port.\n # In this case --local param must not be used\n # Example for using the port configured in the cluster config\n ops clusters/qe1.yaml ssh bastion --proxy\n # Example for using the auto generated port\n ops clusters/qe1.yaml ssh bastion --proxy --auto_scb_port\n\n\n # Disable use of Shell Control Box (SCB) even it is enabled in the cluster config\n ops clusters/qe1.yaml ssh bastion --noscb\n```\n\n#### SSHPass\n\nIn case you want to use the OSX Keychain to store your password and reuse across multiple nodes (e.g. running a playbook on 300 nodes and not having to enter the password for every node) follow the tutorial below:\n\n1. Open `Keychain Access` app on OSX\n 1. Create a new keychain (`File -> New Keychain`), let's say `aam`\n 2. Select the `aam` keychain and add a new password entry in this (`File -> New Password Item`):\n - Name: `idm`\n - Kind: `application password`\n - Account: `your_ldap_account` (e.g. `johnsmith`)\n - Where: `idm`\n\n2. Create `$HOME/bin` dir - this is where the scripts below are saved\n\n3. Create `~/bin/askpass` script and update the ldap account there:\n\n ```bash\n cat > ~/bin/askpass <<\"EOF\"\n #!/usr/bin/env bash\n /usr/bin/security find-generic-password -a -s idm -w $HOME/Library/Keychains/aam.keychain\n EOF\n chmod +x ~/bin/askpass\n ```\n\n1. Checkout [notty github repo](https://github.com/pharaujo/notty), build and move the binary to `$HOME/bin/`\n\n1. Create `~/bin/sshpass` script:\n\n ```bash\n cat > $HOME/bin/sshpass <<\"EOF\"\n #!/usr/bin/env bash\n export DISPLAY=:99\n export SSH_ASKPASS=\"$HOME/bin/askpass\"\n [[ $1 == -d* ]] && shift\n $HOME/bin/notty $@\n EOF\n\n chmod +x $HOME/bin/sshpass\n ```\n\n1. Verify the setup works:\n\n ```bash\n # Connect to bastion\n ~/bin/sshpass ssh -o StrictHostKeyChecking=no -l <52.5.5.5>\n ```\n\n1. Run `ops` tool\n\n#### SCB\nShell Control Box (SCB) is an activity monitoring appliance from Balabit (now One Identity) that controls privileged access to remote servers.\n`ops` has support for using SCB as ssh proxy for the following operations: `ssh, tunnel, proxy, ansible play, run and sync`\n\nIn order to use SCB an extra section needs to be added to the cluster config file:\n```\nscb:\n enabled: true\n host: \"scb.example.com\"\n proxy_port: 2222 # optional\n```\nHaving this config all ssh operations will be done via the scb host, unless the `--noscb` flag is used.\n\nWhen using `SCB`, `SSHPass` will not be used.\n\nFor ansible `play`, `run` and `sync` operations to work via SCB a proxy needs to be created first and then run `ops` in a different terminal window or tab:\n```\n# 1. Create a proxy in a terminal window\n# Example for using the port configured in the cluster config\nops clusters/qe1.yaml ssh bastion --proxy\n# Example for using the auto generated port\nops clusters/qe1.yaml ssh bastion --proxy --auto_scb_port\n\n# 2. Run the play/run/sync command normally in a different terminal window or tab\n# A message will indicate the scb proxy is used\nops clusters/qe1.yaml play ansible/plays/cluster/configure.yaml\n...\nConnecting via scb proxy at 127.0.0.1:2222.\nThis proxy should have already been started and running in a different terminal window.\nIf there are connection issues double check that the proxy is running.\n...\n```\n\n### Play\n\nRun an ansible playbook.\n\n```\nusage: ops cluster_config_path play [-h] [-e EXTRA_VARS] [--ask-sudo-pass]\n [--limit LIMIT] [--noscb]\n playbook_path\n [ansible_args [ansible_args ...]]\n\npositional arguments:\n playbook_path The playbook path\n ansible_args Extra ansible args\n\noptional arguments:\n -h, --help show this help message and exit\n -e EXTRA_VARS, --extra-vars EXTRA_VARS\n Extra variables to use. Eg: -e ssh_user=ssh_user\n --ask-sudo-pass Ask sudo pass for commands that need sudo\n --limit LIMIT Limit run to a specific server subgroup. Eg: --limit\n newton-dcs\n --noscb Disable use of Shell Control Box (SCB) even if it is\n enabled in the cluster config\n\n Examples:\n # Run an ansible playbook\n ops clusters/qe1.yaml play ansible/plays/cluster/configure.yaml\n\n # Limit the run of a playbook to a subgroup\n ops clusters/qe1.yaml play ansible/plays/cluster/configure.yaml -- --limit dcs\n\n # Overwrite or set a variable\n ops clusters/qe1.yaml play ansible/plays/cluster/configure.yaml -- -e city=paris\n\n # Filter with tags\n ops clusters/qe1.yaml play ansible/plays/cluster/configure.yaml -- -t common\n\n # Run a playbook and overwrite the default user\n ops clusters/qe1.yaml play ansible/plays/cluster/configure.yaml -- -u ec2-user\n```\n\n### Run command\n\nRun a bash command on the selected nodes.\n\n```\nusage: ops cluster_config_path run [-h] [--ask-sudo-pass] [--limit LIMIT]\n [--noscb]\n host_pattern shell_command\n [extra_args [extra_args ...]]\n\npositional arguments:\n host_pattern Limit the run to the following hosts\n shell_command Shell command you want to run\n extra_args Extra ansible arguments\n\noptional arguments:\n -h, --help show this help message and exit\n --ask-sudo-pass Ask sudo pass for commands that need sudo\n --limit LIMIT Limit run to a specific server subgroup. Eg: --limit\n newton-dcs\n --noscb Disable use of Shell Control Box (SCB) even if it is\n enabled in the cluster config\n\n Examples:\n # Last 5 installed packages on each host\n ops qe1.yaml run all 'sudo grep Installed /var/log/yum.log | tail -5'\n\n # See nodetool status on each cassandra node\n ops qe1.yaml run qe1-cassandra 'nodetool status'\n\n # Complex limits\n ops qe1.yaml run 'qe1-cassandra,!qe1-cassandra-0' 'nodetool status'\n\n # Show how to pass other args\n```\n\n### Sync files\n\nPerforms `rsync` to/from a given set of nodes.\n\n```\nusage: ops cluster_config_path sync [-h] [-l USER] [--noscb]\n src dest [opts [opts ...]]\n\npositional arguments:\n src Source dir\n dest Dest dir\n opts Rsync opts\n\noptional arguments:\n -h, --help show this help message and exit\n -l USER, --user USER Value for remote user that will be used for ssh\n --noscb Disable use of Shell Control Box (SCB) even if it is\n enabled in the cluster config\n\n rsync wrapper for ops inventory conventions\n\n Example:\n\n # rsync from remote dcs role\n ops cluster.yml sync 'dcs[0]:/usr/local/demdex/conf' /tmp/configurator-data --user remote_user\n\n # extra rsync options\n ops cluster.yml sync 'dcs[0]:/usr/local/demdex/conf' /tmp/configurator-data -l remote_user -- --progress\n```\n\n### Noop\n```\nusage: ops cluster_config_path noop [-h]\n\noptional arguments:\n -h, --help show this help message and exit\n```\n\n### Packer\n\nRuns [packer](https://www.packer.io/intro/), for creating images.\n\n```\nusage: ops cluster_config_path packer [-h] subcommand\n\npositional arguments:\n subcommand build | validate\n\noptional arguments:\n -h, --help show this help message and exit\n\n Examples:\n # Validate a packer file\n ops clusters/centos7.yaml packer validate\n\n # Build a packer file\n ops clusters/centos7.yaml packer build\n```\n\n## Secrets Management\n\nThere are cases where you need to reference sensitive data in your `cluster.yaml` file (credentials, passwords, tokens etc). Given that the cluster configuration file can be stored in a version control system (such as Git), the best practice is to not put sensitive data in the file itself. Instead, we can use `ops-cli` to fetch the desired credentials from a secrets manager such as Vault or Amazon SSM, at runtime.\n\n### Vault\n\nOps can manage the automatic generation of secrets and their push in Vault, without actually persisting the secrets in the cluster file.\nA cluster file will only need to use a construct like the following:\n```\ndb_password: \"{{'secret/campaign/generated_password'|managed_vault_secret(policy=128)}}\"\n```\nWhich will translate behind the scenes in :\n- look up in vault the secrets at secret/campaign/generated_password in the default key 'value' (Adobe convention that can be overridden with the key parameter)\n- if the value there is missing, generate a new secret using the engine passgen with a policy of length 128 characters\n- return the generated value\n- if the value at that path already exist, just return that value.\nThis allows us to just refer in cluster files a secret that actually exists in vault and make sure we only generate it once - if it was already created by os or any other system, we will just use what is already there.\nThe reference is by means of fixed form jinja call added to the cluster file, which ends up interpreted later during the templating phase.\n\n### Amazon Secrets Manager (SSM)\n\nAmazon offers the possibility to use their [Secrets Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) in order to manage configuration data such as credentials, passwords and license keys.\n\nWe can use `ops-cli` to fetch the sensitive data from SSM, at runtime. Just define this in your cluster configuration file (eg. `mycluster.yaml`).\n\n```\ndb_password: \"{{ '/my/ssm/path' | read_ssm(aws_profile='myprofile') }}\"\n```\n\n`ops-cli` will read the SSM value by running a command similar to: `AWS_PROFILE=aam-npe aws ssm get-parameter --name \"/my/ssm/path\" --region us-east-1 --with-decryption`.\nNote that you can specify the AWS region via `read_ssm(aws_profile='myprofile', region_name='us-west-2')`.\n\n\n## Using jinja2 filters in playbooks and terraform templates\n\nYou can register your own jinja2 filters that you can use in the cluster config file, terraform templates and ansible playbooks\n\nAll ops commands look for filters in the following locations:\n- the python path\n- the .opsconfig.yaml [ansible.filter_plugins](https://github.com/adobe/ops/blob/master/src/ops/opsconfig.py#L58) setting (defaults to plugins/filter_plugins)\n\nExample simple filter:\n\n```\n# plugins/filter_plugin/myfilters.py\n\ndef my_filter(string):\n return 'filtered: ' + string\n\n\nclass FilterModule(object):\n def filters(self):\n return {\n 'my_filter': my_filter\n }\n\n# usage in playbook, templates, cluster config\n# test_custom_filters: \"{{ 'value' | my_filter }}\"\n```\n\n## SKMS\nCreate a file in `~/.skms/credentials.yaml` which looks like the following:\n```yaml\nendpoint: \"api.skms.mycompany.com\"\nusername: \npassword: \n```\n\n# Development\n\n## Install `ops` in development mode\n\n```\ngit clone https://github.com/adobe/ops-cli.git\ncd ops\n# Install openssl\nbrew install openssl libyaml\nenv LDFLAGS=\"-L$(brew --prefix openssl)/lib\" CFLAGS=\"-I$(brew --prefix openssl)/include\" python setup.py develop\n```\n\n## Running tests\n\n- on your machine: `py.test tests`\n\n# Troubleshooting\n\n- Permission issues when installing: you should install the tool in a python virtualenv\n\n- Exception when running: `ops`\n `pkg_resources._vendor.packaging.requirements.InvalidRequirement: Invalid requirement, parse error at \"'!= 2.4'\"`\n\n Caused by a broken paramiko version, reinstall paramiko: `pip2 uninstall paramiko; pip2 install paramiko`\n\n- Exception when installing ops because the cryptography package fails to install:\n\nEither install the tool in a virtualenv or:\n\n```\n brew install libffi\n brew link libffi --force\n brew install openssl \n brew link openssl --force\n```\n\n# License\n[Apache License 2.0](/LICENSE)\n\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/adobe/ops-cli", "keywords": "", "license": "Apache2", "maintainer": "", "maintainer_email": "", "name": "ops-cli", "package_url": "https://pypi.org/project/ops-cli/", "platform": "", "project_url": "https://pypi.org/project/ops-cli/", "project_urls": { "Homepage": "https://github.com/adobe/ops-cli" }, "release_url": "https://pypi.org/project/ops-cli/2.1.7/", "requires_dist": [ "adal (==1.2.7)", "ansible (==2.9.25)", "awscli (==1.20.33)", "azure-applicationinsights (==0.1.0)", "azure-batch (==4.1.3)", "azure-common (==1.1.27)", "azure-cosmosdb-nspkg (==2.0.2)", "azure-cosmosdb-table (==1.0.6)", "azure-datalake-store (==0.0.52)", "azure-eventgrid (==1.3.0)", "azure-graphrbac (==0.40.0)", "azure-keyvault (==1.1.0)", "azure-loganalytics (==0.1.0)", "azure-mgmt-advisor (==1.0.1)", "azure-mgmt-applicationinsights (==0.1.1)", "azure-mgmt-authorization (==0.50.0)", "azure-mgmt-batch (==5.0.1)", "azure-mgmt-batchai (==2.0.0)", "azure-mgmt-billing (==0.2.0)", "azure-mgmt-cdn (==3.1.0)", "azure-mgmt-cognitiveservices (==3.0.0)", "azure-mgmt-commerce (==1.0.1)", "azure-mgmt-compute (==4.6.2)", "azure-mgmt-consumption (==2.0.0)", "azure-mgmt-containerinstance (==1.5.0)", "azure-mgmt-containerregistry (==2.8.0)", "azure-mgmt-containerservice (==4.4.0)", "azure-mgmt-cosmosdb (==0.4.1)", "azure-mgmt-datafactory (==0.6.0)", "azure-mgmt-datalake-analytics (==0.6.0)", "azure-mgmt-datalake-nspkg (==3.0.1)", "azure-mgmt-datalake-store (==0.5.0)", "azure-mgmt-datamigration (==1.0.0)", "azure-mgmt-devspaces (==0.1.0)", "azure-mgmt-devtestlabs (==2.2.0)", "azure-mgmt-dns (==2.1.0)", "azure-mgmt-eventgrid (==1.0.0)", "azure-mgmt-eventhub (==2.6.0)", "azure-mgmt-hanaonazure (==0.1.1)", "azure-mgmt-iotcentral (==0.1.0)", "azure-mgmt-iothub (==0.5.0)", "azure-mgmt-iothubprovisioningservices (==0.2.0)", "azure-mgmt-keyvault (==1.1.0)", "azure-mgmt-loganalytics (==0.2.0)", "azure-mgmt-logic (==3.0.0)", "azure-mgmt-machinelearningcompute (==0.4.1)", "azure-mgmt-managementgroups (==0.1.0)", "azure-mgmt-managementpartner (==0.1.1)", "azure-mgmt-maps (==0.1.0)", "azure-mgmt-marketplaceordering (==0.1.0)", "azure-mgmt-media (==1.0.0)", "azure-mgmt-monitor (==0.5.2)", "azure-mgmt-msi (==0.2.0)", "azure-mgmt-network (==2.7.0)", "azure-mgmt-notificationhubs (==2.1.0)", "azure-mgmt-nspkg (==3.0.2)", "azure-mgmt-policyinsights (==0.1.0)", "azure-mgmt-powerbiembedded (==2.0.0)", "azure-mgmt-rdbms (==1.9.0)", "azure-mgmt-recoveryservices (==0.3.0)", "azure-mgmt-recoveryservicesbackup (==0.3.0)", "azure-mgmt-redis (==5.0.0)", "azure-mgmt-relay (==0.1.0)", "azure-mgmt-reservations (==0.2.1)", "azure-mgmt-resource (==2.2.0)", "azure-mgmt-scheduler (==2.0.0)", "azure-mgmt-search (==2.1.0)", "azure-mgmt-servicebus (==0.5.3)", "azure-mgmt-servicefabric (==0.2.0)", "azure-mgmt-signalr (==0.1.1)", "azure-mgmt-sql (==0.9.1)", "azure-mgmt-storage (==2.0.0)", "azure-mgmt-subscription (==0.2.0)", "azure-mgmt-trafficmanager (==0.50.0)", "azure-mgmt-web (==0.35.0)", "azure-mgmt (==4.0.0)", "azure-nspkg (==3.0.2)", "azure-servicebus (==0.21.1)", "azure-servicefabric (==6.3.0.0)", "azure-servicemanagement-legacy (==0.20.7)", "azure-storage-blob (==1.5.0)", "azure-storage-common (==1.4.2)", "azure-storage-file (==1.4.0)", "azure-storage-queue (==1.4.0)", "azure (==4.0.0)", "boto3 (==1.18.33)", "boto (==2.49.0)", "certifi (==2021.10.8)", "cffi (==1.15.0)", "gitpython (==3.1.24)", "hashmerge (==0.2)", "himl (==0.7.3)", "hvac (==0.11.0)", "inflection (==0.3.1)", "isodate (==0.6.0)", "jinja2 (==2.11.3)", "kubernetes (==18.20.0)", "lru-cache (==0.2.3)", "msrest (==0.6.21)", "msrestazure (==0.6.4)", "passgen (==1.1.1)", "pathlib2 (==2.3.6)", "pyasn1-modules (==0.2.8)", "pyasn1 (==0.4.8)", "python-consul (==1.1.0)", "pyyaml (==5.4.1)", "requests-oauthlib (==1.3.0)", "simpledi (==0.3)", "six (==1.16.0)", "typing-extensions (==3.10.0.2) ; python_version < \"3.10\"", "backports.functools-lru-cache (==1.6.4) ; python_version >= \"2.6\"", "docutils (==0.15.2) ; python_version >= \"2.6\" and python_version not in \"3.0, 3.1, 3.2\"", "jmespath (==0.10.0) ; python_version >= \"2.6\" and python_version not in \"3.0, 3.1, 3.2\"", "python-dateutil (==2.8.2) ; python_version >= \"2.7\" and python_version not in \"3.0, 3.1, 3.2\"", "pycparser (==2.20) ; python_version >= \"2.7\" and python_version not in \"3.0, 3.1, 3.2, 3.3\"", "colorama (==0.4.3) ; python_version >= \"2.7\" and python_version not in \"3.0, 3.1, 3.2, 3.3, 3.4\"", "urllib3 (==1.26.7) ; python_version >= \"2.7\" and python_version not in \"3.0, 3.1, 3.2, 3.3, 3.4\" and python_version < \"4\"", "requests (==2.26.0) ; python_version >= \"2.7\" and python_version not in \"3.0, 3.1, 3.2, 3.3, 3.4, 3.5\"", "charset-normalizer (==2.0.7) ; python_version >= \"3\"", "deepmerge (==0.3.0) ; python_version >= \"3\"", "idna (==3.3) ; python_version >= \"3\"", "gitdb (==4.0.7) ; python_version >= \"3.4\"", "smmap (==4.0.0) ; python_version >= \"3.5\"", "rsa (==4.7.2) ; python_version >= \"3.5\" and python_version < \"4\"", "botocore (==1.21.33) ; python_version >= \"3.6\"", "cryptography (==35.0.0) ; python_version >= \"3.6\"", "google-auth (==2.3.0) ; python_version >= \"3.6\"", "markupsafe (==2.0.1) ; python_version >= \"3.6\"", "oauthlib (==3.1.1) ; python_version >= \"3.6\"", "pyjwt (==2.2.0) ; python_version >= \"3.6\"", "s3transfer (==0.5.0) ; python_version >= \"3.6\"", "websocket-client (==1.2.1) ; python_version >= \"3.6\"", "cachetools (==4.2.4) ; python_version ~= \"3.5\"" ], "requires_python": ">=3.5", "summary": "Ops - wrapper for Terraform, Ansible, and SSH for cloud automation", "version": "2.1.7", "yanked": false, "yanked_reason": null }, "last_serial": 11725253, "releases": { "1.10.0": [ { "comment_text": "", "digests": { "md5": "e39cc1a509c61e5f543400c4a926949f", "sha256": "17cb9f6e2eaee866189e260d20d0a32ef9651c40580f97ed03ead561f5b9a8e1" }, "downloads": -1, "filename": "ops-cli-1.10.0.tar.gz", "has_sig": false, "md5_digest": "e39cc1a509c61e5f543400c4a926949f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 134032, "upload_time": "2019-08-27T18:19:53", "upload_time_iso_8601": "2019-08-27T18:19:53.037615Z", "url": "https://files.pythonhosted.org/packages/6f/9d/7acefdb94a3413b748c6ab300eef1ed8b0ff64684f1b92e1d64639f6e272/ops-cli-1.10.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.10.1": [ { "comment_text": "", "digests": { "md5": "e648d54def51867905fa37d4a2519a33", "sha256": "216e0aecb13022f18ebfce87198e8e3b2f9c3fcb6a67ce9ab0c8718506b6ce00" }, "downloads": -1, "filename": "ops-cli-1.10.1.tar.gz", "has_sig": false, "md5_digest": "e648d54def51867905fa37d4a2519a33", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 134081, "upload_time": "2019-08-29T14:47:48", "upload_time_iso_8601": "2019-08-29T14:47:48.959740Z", "url": "https://files.pythonhosted.org/packages/aa/d4/91af8beb326a43736e067bce566736fe695bdbb48cd30859aed5215e7ba1/ops-cli-1.10.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.0": [ { "comment_text": "", "digests": { "md5": "8c2ae37b5cfda9ce5db1574d9ca10899", "sha256": "f4c38c74ba72367f96cac71c5089e1b3764873ecd45e265daefc1ea3edf577be" }, "downloads": -1, "filename": "ops-cli-1.11.0.tar.gz", "has_sig": false, "md5_digest": "8c2ae37b5cfda9ce5db1574d9ca10899", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 134080, "upload_time": "2019-08-29T14:48:45", "upload_time_iso_8601": "2019-08-29T14:48:45.641310Z", "url": "https://files.pythonhosted.org/packages/53/52/5ba9dda48f05f7a1ae3028048a3cb2d730455fc03b9c3648777e01dfb5b4/ops-cli-1.11.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.1": [ { "comment_text": "", "digests": { "md5": "e500850597263aefc3f79c6749fd94b9", "sha256": "4642ea2c5677ed7d4f44b25f2f2b0c07273bb01a54504b5d2347c2ac31c6b297" }, "downloads": -1, "filename": "ops-cli-1.11.1.tar.gz", "has_sig": false, "md5_digest": "e500850597263aefc3f79c6749fd94b9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 134061, "upload_time": "2019-08-29T16:09:50", "upload_time_iso_8601": "2019-08-29T16:09:50.898507Z", "url": "https://files.pythonhosted.org/packages/fd/66/de4772b6346dd87b3a27a97993b3615d3516652078fbf9275fe5e00027ba/ops-cli-1.11.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.10": [ { "comment_text": "", "digests": { "md5": "f9f0d85823b4d747c3c84177dac1e0f4", "sha256": "4854339f1564b0a60c607621b52d249062ade872a045e98bce1a09f4aa117c26" }, "downloads": -1, "filename": "ops-cli-1.11.10.tar.gz", "has_sig": false, "md5_digest": "f9f0d85823b4d747c3c84177dac1e0f4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 133936, "upload_time": "2019-10-23T11:47:51", "upload_time_iso_8601": "2019-10-23T11:47:51.730788Z", "url": "https://files.pythonhosted.org/packages/d9/8d/87eb36da8d9558cdfa5e58753a468280dc6d506daaa600e516a6670b30b2/ops-cli-1.11.10.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.11": [ { "comment_text": "", "digests": { "md5": "3a242e96fd9fc9850c5a9327b20cbd9b", "sha256": "a1194ae37fec769e552e98f7a1c0e5a99d9ee8e76387429b021b0c7a900ea80d" }, "downloads": -1, "filename": "ops-cli-1.11.11.tar.gz", "has_sig": false, "md5_digest": "3a242e96fd9fc9850c5a9327b20cbd9b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 133936, "upload_time": "2019-10-23T13:18:34", "upload_time_iso_8601": "2019-10-23T13:18:34.621508Z", "url": "https://files.pythonhosted.org/packages/54/8b/b253e4c1a5956e0b558b5456a50c012a6e11df592f2435a43dad20e967ef/ops-cli-1.11.11.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.12": [ { "comment_text": "", "digests": { "md5": "5b563b5a4eb4c04d2ac213b048176f87", "sha256": "3b6a7bcf27f666b0bea34ad0cffeb5c330342fc41a49cc795ae54b8f5b009f46" }, "downloads": -1, "filename": "ops-cli-1.11.12.tar.gz", "has_sig": false, "md5_digest": "5b563b5a4eb4c04d2ac213b048176f87", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 133908, "upload_time": "2019-11-05T14:58:40", "upload_time_iso_8601": "2019-11-05T14:58:40.135681Z", "url": "https://files.pythonhosted.org/packages/c8/86/bf92593203e8f24cbf7cfbee5b5e81e1151128c14d75bf241f921c31e3c1/ops-cli-1.11.12.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.2": [ { "comment_text": "", "digests": { "md5": "29c4d5c43643df77d48f9073016ca7d1", "sha256": "124f6d98255fc6c104fb32e22effb65d209c7be53346bf20dcabf2ea65b2843c" }, "downloads": -1, "filename": "ops-cli-1.11.2.tar.gz", "has_sig": false, "md5_digest": "29c4d5c43643df77d48f9073016ca7d1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 134105, "upload_time": "2019-08-29T16:50:24", "upload_time_iso_8601": "2019-08-29T16:50:24.242137Z", "url": "https://files.pythonhosted.org/packages/42/11/b8ef00dadbfddf87cf7bfe9fa040b0968f970d21e88873aff44c0dc9eb59/ops-cli-1.11.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.3": [ { "comment_text": "", "digests": { "md5": "d274caa0a0cf08e85fa8524fad9130e0", "sha256": "1f306d7da322d9d41a67156f8f9a6719b3074fb7728444db9d40c7bb0b6866a6" }, "downloads": -1, "filename": "ops-cli-1.11.3.tar.gz", "has_sig": false, "md5_digest": "d274caa0a0cf08e85fa8524fad9130e0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 134249, "upload_time": "2019-09-10T14:31:57", "upload_time_iso_8601": "2019-09-10T14:31:57.889620Z", "url": "https://files.pythonhosted.org/packages/63/79/82fae39e6bdc710149f6ea0f3b4f630e5cfb619f9376413039cbd6c6d51e/ops-cli-1.11.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.4": [ { "comment_text": "", "digests": { "md5": "2b5a11ccf529c192876f3f3adaef5d21", "sha256": "14e3dd9a623e5391797c538ad0e87c5f827ae894e4a47b7886716e9e70d982e5" }, "downloads": -1, "filename": "ops-cli-1.11.4.tar.gz", "has_sig": false, "md5_digest": "2b5a11ccf529c192876f3f3adaef5d21", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 134251, "upload_time": "2019-10-04T03:36:02", "upload_time_iso_8601": "2019-10-04T03:36:02.563594Z", "url": "https://files.pythonhosted.org/packages/50/a0/0169d7e967c5a1ff21387206b72c27bc83fd46ef73a4b7891611982b18b7/ops-cli-1.11.4.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.5": [ { "comment_text": "", "digests": { "md5": "d49c93892a9cac5c9620d8f311631a33", "sha256": "eb2c70ad303023dcc09f27a174b231bf550f96ad07021b7aec7bcc5389c689c3" }, "downloads": -1, "filename": "ops-cli-1.11.5.tar.gz", "has_sig": false, "md5_digest": "d49c93892a9cac5c9620d8f311631a33", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 134429, "upload_time": "2019-10-04T17:12:36", "upload_time_iso_8601": "2019-10-04T17:12:36.643905Z", "url": "https://files.pythonhosted.org/packages/75/e7/1a985252f708a201e79143c71cfaabd8614665b199ea388b0c243a4364eb/ops-cli-1.11.5.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.6": [ { "comment_text": "", "digests": { "md5": "dee04034b0c7af648a8e2459c63bf586", "sha256": "a6b55e08fbed8849f276a0e60d02535b8357f38ab3dcaf0e6f2744a144b1318c" }, "downloads": -1, "filename": "ops-cli-1.11.6.tar.gz", "has_sig": false, "md5_digest": "dee04034b0c7af648a8e2459c63bf586", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 128878, "upload_time": "2019-10-07T15:55:04", "upload_time_iso_8601": "2019-10-07T15:55:04.430777Z", "url": "https://files.pythonhosted.org/packages/2d/a8/768c390eb9d56803cf4780a21e1a8689ff7b6cd7165964148c6e501bd412/ops-cli-1.11.6.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.7": [ { "comment_text": "", "digests": { "md5": "795cd414b150d33df71731cd4d91996e", "sha256": "cd072af8ed6ed76e1faebc414926e53d644c03d94b2ce966c8ed38e6e11b5fa7" }, "downloads": -1, "filename": "ops-cli-1.11.7.tar.gz", "has_sig": false, "md5_digest": "795cd414b150d33df71731cd4d91996e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 129696, "upload_time": "2019-10-17T14:32:34", "upload_time_iso_8601": "2019-10-17T14:32:34.770853Z", "url": "https://files.pythonhosted.org/packages/cc/41/46b89231bbfd4a5936e814679c5df8ed9407e8617a5a004115264a916769/ops-cli-1.11.7.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.8": [ { "comment_text": "", "digests": { "md5": "0fe6ec2b6de20dbf6c9079559ce5c4ea", "sha256": "54e070c80679f67053492e1c02f6ecc45e090746121dc4452cfd6d239180b6fd" }, "downloads": -1, "filename": "ops-cli-1.11.8.tar.gz", "has_sig": false, "md5_digest": "0fe6ec2b6de20dbf6c9079559ce5c4ea", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 133115, "upload_time": "2019-10-18T18:55:48", "upload_time_iso_8601": "2019-10-18T18:55:48.015215Z", "url": "https://files.pythonhosted.org/packages/0a/28/b810be1525efabcc2dd3d2bc5b90927308db8a0298bf1d931a4c8bde5db7/ops-cli-1.11.8.tar.gz", "yanked": false, "yanked_reason": null } ], "1.11.9": [ { "comment_text": "", "digests": { "md5": "0694069467e605d1b86eb8f28a460845", "sha256": "c827aa2a83a71e9a019cfd2d5b3be0cf5b989067a7dad13a22285c29db5c7769" }, "downloads": -1, "filename": "ops-cli-1.11.9.tar.gz", "has_sig": false, "md5_digest": "0694069467e605d1b86eb8f28a460845", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 134099, "upload_time": "2019-10-23T08:22:34", "upload_time_iso_8601": "2019-10-23T08:22:34.375814Z", "url": "https://files.pythonhosted.org/packages/ba/12/c027c5e28531da59dd15e23385670799abc1a1b80a798397320a1f52c373/ops-cli-1.11.9.tar.gz", "yanked": false, "yanked_reason": null } ], "1.12.1": [ { "comment_text": "", "digests": { "md5": "7d1020811e068cdb2c17bc5d1d10e8cc", "sha256": "d78a606b72f2c54bc7547df1a16de41c384a22b83bcc2a91bd35183185d69af3" }, "downloads": -1, "filename": "ops_cli-1.12.1-py3-none-any.whl", "has_sig": false, "md5_digest": "7d1020811e068cdb2c17bc5d1d10e8cc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 96712, "upload_time": "2019-11-12T12:17:00", "upload_time_iso_8601": "2019-11-12T12:17:00.206745Z", "url": "https://files.pythonhosted.org/packages/8c/10/1f504602478e347662e124ece408d5ef4fd31114f8c0b8afbfcbabb55503/ops_cli-1.12.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b12e294c3a1481cf5d32a531071dedd6", "sha256": "8a84a1c0a488e61392661a0c61bf7bf529b764ec2009e2263e07f39d6b8fb0b1" }, "downloads": -1, "filename": "ops-cli-1.12.1.tar.gz", "has_sig": false, "md5_digest": "b12e294c3a1481cf5d32a531071dedd6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 135903, "upload_time": "2019-11-12T12:17:02", "upload_time_iso_8601": "2019-11-12T12:17:02.113879Z", "url": "https://files.pythonhosted.org/packages/37/85/f3f01601cc6ccc5c4cf6bbd84e2d3f9648ea13b7e4d1ad6060555a2941b9/ops-cli-1.12.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.12.2": [ { "comment_text": "", "digests": { "md5": "27a4a5cb1dfea97ee85a0f04e455f5ac", "sha256": "092efc796c1d6ad567e77010b411534597b50df44317dbc52a71625901006433" }, "downloads": -1, "filename": "ops_cli-1.12.2-py3-none-any.whl", "has_sig": false, "md5_digest": "27a4a5cb1dfea97ee85a0f04e455f5ac", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 96715, "upload_time": "2019-11-12T14:06:14", "upload_time_iso_8601": "2019-11-12T14:06:14.439043Z", "url": "https://files.pythonhosted.org/packages/5d/85/624ac87ef967a44d5a3d6c24a73b004e917fd044d6dadf74e68c985d7e72/ops_cli-1.12.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4d5acb1f9d805b7c5ef73dfcb8ef5d91", "sha256": "28de2e99d371cb36fa18b5259f5720f6e33b1cc36ace25b8b2672aaa5b6ccadc" }, "downloads": -1, "filename": "ops-cli-1.12.2.tar.gz", "has_sig": false, "md5_digest": "4d5acb1f9d805b7c5ef73dfcb8ef5d91", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 135901, "upload_time": "2019-11-12T14:06:16", "upload_time_iso_8601": "2019-11-12T14:06:16.530377Z", "url": "https://files.pythonhosted.org/packages/34/09/53872c7700ae20da046405bd56761321a254aa78a13768dfbf17bb1b39cd/ops-cli-1.12.2.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.10": [ { "comment_text": "", "digests": { "md5": "657a32006178fb948ae353881c15f0d8", "sha256": "71652c7cefee61ba2be98103d7552d083a7abca78514859877504250afad92f9" }, "downloads": -1, "filename": "ops_cli-2.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "657a32006178fb948ae353881c15f0d8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98195, "upload_time": "2021-09-01T10:29:33", "upload_time_iso_8601": "2021-09-01T10:29:33.427837Z", "url": "https://files.pythonhosted.org/packages/3c/f7/5e8f2b69023781df249858ad36f67b3ec3a72fd32a336ab4a67e0f5f70e5/ops_cli-2.0.10-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e2f70140f5c160f8a7839cd828e37048", "sha256": "ff865e1607bc7e113eb3c7a9ba4552fa65c6fdcd3b9990d1a423598352fb6e23" }, "downloads": -1, "filename": "ops-cli-2.0.10.tar.gz", "has_sig": false, "md5_digest": "e2f70140f5c160f8a7839cd828e37048", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139708, "upload_time": "2021-09-01T10:29:35", "upload_time_iso_8601": "2021-09-01T10:29:35.310414Z", "url": "https://files.pythonhosted.org/packages/ad/e7/6c634be4b5768182b5766335f31c31811673a55bd7679967638db860de6c/ops-cli-2.0.10.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.11": [ { "comment_text": "", "digests": { "md5": "dcb040fddcea30d5b1446d33fedd7177", "sha256": "450a2528205a210cdab61fe2b7170a138cf0730875ccb088ad5072d5ad7d9487" }, "downloads": -1, "filename": "ops_cli-2.0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "dcb040fddcea30d5b1446d33fedd7177", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98163, "upload_time": "2021-09-01T10:35:47", "upload_time_iso_8601": "2021-09-01T10:35:47.306783Z", "url": "https://files.pythonhosted.org/packages/f1/49/059596b92d5e24e2d5cc5f991ea457caf0af86c039ac67241881e6349e1f/ops_cli-2.0.11-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "530c92fd8f72e2e02085495cedebc8c0", "sha256": "a1dcb624fb9b5348e16e6f3a40eb0c3e27aaa0e79f535781abaeb7d410e039aa" }, "downloads": -1, "filename": "ops-cli-2.0.11.tar.gz", "has_sig": false, "md5_digest": "530c92fd8f72e2e02085495cedebc8c0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139610, "upload_time": "2021-09-01T10:35:49", "upload_time_iso_8601": "2021-09-01T10:35:49.003349Z", "url": "https://files.pythonhosted.org/packages/68/b6/c0c5756eb1c6c9166f77d61cfd875d048a36307b1623be5a80e85e2cfc0b/ops-cli-2.0.11.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "0f20c327a3bc38f260cf4aa53330b1a8", "sha256": "9edd78f8dd62dd23168cb20c03239f9753c90a5ab30382f809742f900facd08d" }, "downloads": -1, "filename": "ops_cli-2.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "0f20c327a3bc38f260cf4aa53330b1a8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98083, "upload_time": "2019-11-12T12:09:18", "upload_time_iso_8601": "2019-11-12T12:09:18.812975Z", "url": "https://files.pythonhosted.org/packages/20/7f/43fab6480ad7d92dd21ef8d627464216d9480050375531d1d0ea126e47ce/ops_cli-2.0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a825a64d05669baaed4e0299877a70c6", "sha256": "21fc6842501b6d1a12d1a6afe87b2885c555261fcaeb4aac7e7c509732d29885" }, "downloads": -1, "filename": "ops-cli-2.0.3.tar.gz", "has_sig": false, "md5_digest": "a825a64d05669baaed4e0299877a70c6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 136274, "upload_time": "2019-11-12T12:09:20", "upload_time_iso_8601": "2019-11-12T12:09:20.368445Z", "url": "https://files.pythonhosted.org/packages/5d/81/e4c2281dbbde9295b64fc93d761de7d1ecbf7264b4e7bca8e80289131969/ops-cli-2.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.4": [ { "comment_text": "", "digests": { "md5": "0a33e64e940c0aac4f1f48044ee151fd", "sha256": "b582f270af47d5f80fc7d54234fb6929fbe2ad7aa3b7796cebd69f166f2725c2" }, "downloads": -1, "filename": "ops_cli-2.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "0a33e64e940c0aac4f1f48044ee151fd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98091, "upload_time": "2019-12-16T13:52:01", "upload_time_iso_8601": "2019-12-16T13:52:01.335526Z", "url": "https://files.pythonhosted.org/packages/93/75/3702ae033f82d3c040cd5c0c88fa8a16f2163102571ddbd6f9285ae4e02e/ops_cli-2.0.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a51c642ddaf4c339086834b8c30492b0", "sha256": "3368400958c0fe4ad4fe9c8ee507083591b5423b25d187ea3f37cb511c0f56d0" }, "downloads": -1, "filename": "ops-cli-2.0.4.tar.gz", "has_sig": false, "md5_digest": "a51c642ddaf4c339086834b8c30492b0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 136321, "upload_time": "2019-12-16T13:52:02", "upload_time_iso_8601": "2019-12-16T13:52:02.991674Z", "url": "https://files.pythonhosted.org/packages/9b/f6/f5ed707a8003d1c5281a0c373f0816ed258b4069eb992286e4f754cc4bb9/ops-cli-2.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.6": [ { "comment_text": "", "digests": { "md5": "aab75a327bc4c7eae9686ecf5106cf6c", "sha256": "039726d4ef5e4fa2b340e9408b2c62d282194bd78427a73166ef9fa464b211ee" }, "downloads": -1, "filename": "ops_cli-2.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "aab75a327bc4c7eae9686ecf5106cf6c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98218, "upload_time": "2021-09-01T09:42:39", "upload_time_iso_8601": "2021-09-01T09:42:39.329016Z", "url": "https://files.pythonhosted.org/packages/65/4e/95849a2d57ca7f9ce07d550ae3873012bfe2e4020f105632445be2f09989/ops_cli-2.0.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "98dc79fed5cb9f9f4017525ac66e72b3", "sha256": "b8e2bbd8e4102f33f33d2b9a7aa05e14b860c990428012a3868081ccace1ef21" }, "downloads": -1, "filename": "ops-cli-2.0.6.tar.gz", "has_sig": false, "md5_digest": "98dc79fed5cb9f9f4017525ac66e72b3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139781, "upload_time": "2021-09-01T09:42:40", "upload_time_iso_8601": "2021-09-01T09:42:40.625543Z", "url": "https://files.pythonhosted.org/packages/3c/d2/10e2f9a0c43bef6f5ae373609f872a11ae78b1846d6904165b1f6b2ea32a/ops-cli-2.0.6.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.7": [ { "comment_text": "", "digests": { "md5": "94ee576c1662af4afc1fd27b2893deb9", "sha256": "1e2f7bef927f305b735fd598ee6e75d040c436d174bcb8380c904dd28a8bfe9b" }, "downloads": -1, "filename": "ops_cli-2.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "94ee576c1662af4afc1fd27b2893deb9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98220, "upload_time": "2021-09-01T10:02:26", "upload_time_iso_8601": "2021-09-01T10:02:26.926466Z", "url": "https://files.pythonhosted.org/packages/6b/dc/87af01485cfbeac1ed06ccedc0fb2d39cd2bed032711743772757252ad8c/ops_cli-2.0.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "caed0f760905090c2c4d8520e66a0a60", "sha256": "d478e6b62a95ac785f7fd202bf8e64a0f820a668de27675810c09b5dc69ee2db" }, "downloads": -1, "filename": "ops-cli-2.0.7.tar.gz", "has_sig": false, "md5_digest": "caed0f760905090c2c4d8520e66a0a60", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139811, "upload_time": "2021-09-01T10:02:28", "upload_time_iso_8601": "2021-09-01T10:02:28.567779Z", "url": "https://files.pythonhosted.org/packages/ec/f8/b6d4d7e5402df545bdd42dc425f2bdb4f1edd07b5905414d42c5eeefe637/ops-cli-2.0.7.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.8": [ { "comment_text": "", "digests": { "md5": "75378fca2d018c3be68ab8a8d7799ebb", "sha256": "0f6cae9887c3dd156d0dbe3c42fdb79f99b2fb6d7e49412176ceacba6546e356" }, "downloads": -1, "filename": "ops_cli-2.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "75378fca2d018c3be68ab8a8d7799ebb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98181, "upload_time": "2021-09-01T10:06:06", "upload_time_iso_8601": "2021-09-01T10:06:06.476803Z", "url": "https://files.pythonhosted.org/packages/6f/a7/c524a54926a5afdb57a55514c654025f6460d52ef128e8cf8fd59baa22eb/ops_cli-2.0.8-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0b9e48bd190caa13b062ed4287b1997f", "sha256": "a28131d5ed96a8b6c3e3f260713030a68c4e34e41086536187091060ffeaaf23" }, "downloads": -1, "filename": "ops-cli-2.0.8.tar.gz", "has_sig": false, "md5_digest": "0b9e48bd190caa13b062ed4287b1997f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139740, "upload_time": "2021-09-01T10:06:07", "upload_time_iso_8601": "2021-09-01T10:06:07.978800Z", "url": "https://files.pythonhosted.org/packages/e2/a9/8b10dea2e620f25b13310749b06341ff7def48e8d9e2b59a9e922b04ce0f/ops-cli-2.0.8.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.9": [ { "comment_text": "", "digests": { "md5": "e9a2c28fefaa5c8476f285b48c48d43f", "sha256": "34746c077b57a4c15424836279b10c9b15397ef5ae7b9abe7a778994c0ca47de" }, "downloads": -1, "filename": "ops_cli-2.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "e9a2c28fefaa5c8476f285b48c48d43f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98181, "upload_time": "2021-09-01T10:20:48", "upload_time_iso_8601": "2021-09-01T10:20:48.940309Z", "url": "https://files.pythonhosted.org/packages/79/96/5a1015017097158980fb6eff2b1b8225865780ddb8138cbdf7d3d51b4855/ops_cli-2.0.9-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "22582bb39fdbaa901143d0b074ebf0e0", "sha256": "116e8defb439d8f5a56d3264ce0efbaf63074f74c43f76b76f9392d9d38af268" }, "downloads": -1, "filename": "ops-cli-2.0.9.tar.gz", "has_sig": false, "md5_digest": "22582bb39fdbaa901143d0b074ebf0e0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139731, "upload_time": "2021-09-01T10:20:50", "upload_time_iso_8601": "2021-09-01T10:20:50.253633Z", "url": "https://files.pythonhosted.org/packages/2f/33/a1a6da066c600767c4759095d52eb385328ac1c2514802925094fbb8e52d/ops-cli-2.0.9.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "37065440b306684c9e2ad4601578d0ab", "sha256": "91a28efb9674d1b2724b324d633b16f2bfc4deeba99a87bb4c72f9b20c70dc48" }, "downloads": -1, "filename": "ops_cli-2.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "37065440b306684c9e2ad4601578d0ab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98195, "upload_time": "2021-09-13T13:24:20", "upload_time_iso_8601": "2021-09-13T13:24:20.442272Z", "url": "https://files.pythonhosted.org/packages/a4/8b/c1a413959b4704883ca013a4840d0dce1dfab91f8bf06e4062a0220ab0e3/ops_cli-2.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ae563e8d89a090c8268c2895d38fa236", "sha256": "778a2d33a68b73c9088894c1a17df47cc63d02c6a40ddbf60230b1a800e51597" }, "downloads": -1, "filename": "ops-cli-2.1.0.tar.gz", "has_sig": false, "md5_digest": "ae563e8d89a090c8268c2895d38fa236", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139773, "upload_time": "2021-09-13T13:24:21", "upload_time_iso_8601": "2021-09-13T13:24:21.984101Z", "url": "https://files.pythonhosted.org/packages/5a/8c/cb2a54ab84d8a93611a4000e4445c2186b89640e7845807a7b0cd9fcb496/ops-cli-2.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "fe2aff13bdeb0ac0daa5065cf600b4e0", "sha256": "4d28e2bee6a56330eaeeb5458928cef5af0d6e4fe5f223668096d75704a9ee5f" }, "downloads": -1, "filename": "ops_cli-2.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "fe2aff13bdeb0ac0daa5065cf600b4e0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98230, "upload_time": "2021-09-13T14:04:43", "upload_time_iso_8601": "2021-09-13T14:04:43.242052Z", "url": "https://files.pythonhosted.org/packages/cc/f8/3f7e5938e153b18fe966ee25e071e1deab432422c684317628ace5b4b163/ops_cli-2.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "bd5d4ffdbb294521fcf45503e324fd8b", "sha256": "5ea44e375187d3747c0e5430c554e6344a80b67706f7b438b202d7eff18e3072" }, "downloads": -1, "filename": "ops-cli-2.1.1.tar.gz", "has_sig": false, "md5_digest": "bd5d4ffdbb294521fcf45503e324fd8b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139842, "upload_time": "2021-09-13T14:04:45", "upload_time_iso_8601": "2021-09-13T14:04:45.082794Z", "url": "https://files.pythonhosted.org/packages/98/90/5cac42d21c9b3c7086d88983cc928b079030590c96f7cf89915071c1c9fb/ops-cli-2.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.2": [ { "comment_text": "", "digests": { "md5": "189202f4f94b888b0cb2834f30795d20", "sha256": "7d4a5f185e5ec3d1032be36e602cc487e3442e8f5b448db5a83b3b97b003e29c" }, "downloads": -1, "filename": "ops_cli-2.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "189202f4f94b888b0cb2834f30795d20", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98232, "upload_time": "2021-09-13T14:27:56", "upload_time_iso_8601": "2021-09-13T14:27:56.377535Z", "url": "https://files.pythonhosted.org/packages/92/df/1d0677e97e4c47588d87f21e929e6a3e257db1a09e774bfc8f2a5047183b/ops_cli-2.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9e9aa84c3cdd383bebd1a792497288a9", "sha256": "c0b72380fec8d1e8cca237454f0935208a51bae8f765e7ce697f1c1af16dd085" }, "downloads": -1, "filename": "ops-cli-2.1.2.tar.gz", "has_sig": false, "md5_digest": "9e9aa84c3cdd383bebd1a792497288a9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139772, "upload_time": "2021-09-13T14:27:57", "upload_time_iso_8601": "2021-09-13T14:27:57.642967Z", "url": "https://files.pythonhosted.org/packages/2a/38/f0af9ff7d0dee49e7a9c284e973f314e8107452b8cea9055c830639d0360/ops-cli-2.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.3": [ { "comment_text": "", "digests": { "md5": "6bca9775f58322fb0d4c6a09eef0dfec", "sha256": "3ea0205366695c9d3c90ce88ac68e467e262f6453b4fbd9582e06f7919597910" }, "downloads": -1, "filename": "ops_cli-2.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "6bca9775f58322fb0d4c6a09eef0dfec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98232, "upload_time": "2021-09-13T14:41:36", "upload_time_iso_8601": "2021-09-13T14:41:36.273301Z", "url": "https://files.pythonhosted.org/packages/62/2c/89fe84e180b3079f4e94413a11f01f51f5776148a2be543a66b0cd19bed3/ops_cli-2.1.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8dfdc07d427325236ae36d5e673477ee", "sha256": "e38db2117e51cb2717b8c6d673b9b87144d7337b4d16fbd8c9e389478bac8101" }, "downloads": -1, "filename": "ops-cli-2.1.3.tar.gz", "has_sig": false, "md5_digest": "8dfdc07d427325236ae36d5e673477ee", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139822, "upload_time": "2021-09-13T14:41:38", "upload_time_iso_8601": "2021-09-13T14:41:38.230292Z", "url": "https://files.pythonhosted.org/packages/29/11/fbc2453b1969d92ff47e9b17f627f66cc4d321ba30bcadd93526f0041c23/ops-cli-2.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.4": [ { "comment_text": "", "digests": { "md5": "e46ee54846a05c100b0f11ff93572e13", "sha256": "f76c93516f408aa747965ac23276210ff2f5c90dce2a7ce9b073eee13526bf70" }, "downloads": -1, "filename": "ops_cli-2.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "e46ee54846a05c100b0f11ff93572e13", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98233, "upload_time": "2021-09-13T14:54:08", "upload_time_iso_8601": "2021-09-13T14:54:08.354777Z", "url": "https://files.pythonhosted.org/packages/0f/31/2f1d4166d4fc2c91a998f907e5ac18682dfb4d21782fec6a44e9cb421016/ops_cli-2.1.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9f64b4bcdf50861c13fa62152e5a8e14", "sha256": "d9e4d70eff9e41d545be5579fbca45a65a0b63d8c7b2519319d653c39195a892" }, "downloads": -1, "filename": "ops-cli-2.1.4.tar.gz", "has_sig": false, "md5_digest": "9f64b4bcdf50861c13fa62152e5a8e14", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139789, "upload_time": "2021-09-13T14:54:09", "upload_time_iso_8601": "2021-09-13T14:54:09.906782Z", "url": "https://files.pythonhosted.org/packages/c7/b6/eced2b57f1d3077491b2018b69257c5bf13f7fdde7d613c56e4c349a36aa/ops-cli-2.1.4.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.5": [ { "comment_text": "", "digests": { "md5": "d2faa32bae873f65553d3ad8b10f61a2", "sha256": "7dd4fb53da4a3da243826ff0c722194f6e595e30776ca07e639e1321119d115a" }, "downloads": -1, "filename": "ops_cli-2.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "d2faa32bae873f65553d3ad8b10f61a2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 98232, "upload_time": "2021-09-13T18:51:12", "upload_time_iso_8601": "2021-09-13T18:51:12.209150Z", "url": "https://files.pythonhosted.org/packages/56/80/7c00750ffc942a15ef764f61548c02de436bbb66cdf22009688841ef2c09/ops_cli-2.1.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9cf59fdb2f72d014ae81842589d75251", "sha256": "2938d170b9315b8921896f3d163b98f8b32c4586075dbf18f9ce5469a9f4637c" }, "downloads": -1, "filename": "ops-cli-2.1.5.tar.gz", "has_sig": false, "md5_digest": "9cf59fdb2f72d014ae81842589d75251", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 139794, "upload_time": "2021-09-13T18:51:14", "upload_time_iso_8601": "2021-09-13T18:51:14.938781Z", "url": "https://files.pythonhosted.org/packages/e7/cc/340913475234b64fef041e6fc0a707423091df41d828368ae6f6dc6f42c2/ops-cli-2.1.5.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.6": [ { "comment_text": "", "digests": { "md5": "04b39e5906d7e8d8b648af474651eb3b", "sha256": "663de83f00adcfac6f850d6e9c05298a9f5c7ffa59d04e257b11d97b1bc3bdb1" }, "downloads": -1, "filename": "ops_cli-2.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "04b39e5906d7e8d8b648af474651eb3b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 101386, "upload_time": "2021-10-14T07:27:15", "upload_time_iso_8601": "2021-10-14T07:27:15.980884Z", "url": "https://files.pythonhosted.org/packages/a8/82/3537595ecba123a343fbf7445bb250bea51354d80f79b72ab7adf490c5d8/ops_cli-2.1.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "393cecadda6c9d340d461d0df10299f8", "sha256": "03990b8e720675b740520e09e02b456b227293336bf8f73b7410bea70a783e98" }, "downloads": -1, "filename": "ops-cli-2.1.6.tar.gz", "has_sig": false, "md5_digest": "393cecadda6c9d340d461d0df10299f8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 151657, "upload_time": "2021-10-14T07:27:18", "upload_time_iso_8601": "2021-10-14T07:27:18.408744Z", "url": "https://files.pythonhosted.org/packages/7d/66/89f56743e217f2502f4b9164c428ed3a1a41ae5f060126a8788fe98a43c7/ops-cli-2.1.6.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.7": [ { "comment_text": "", "digests": { "md5": "40f30103115610d27056efba4332cf90", "sha256": "db0ec02894f8536be39c9328b64f71ae2d65dbb9f0b3c322e44c05d68906035e" }, "downloads": -1, "filename": "ops_cli-2.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "40f30103115610d27056efba4332cf90", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 101386, "upload_time": "2021-10-14T14:19:06", "upload_time_iso_8601": "2021-10-14T14:19:06.172881Z", "url": "https://files.pythonhosted.org/packages/bb/fa/82f886159ed4fa29c6b6b7464df2f433f2fab722c41e0e0cb96d939b19a1/ops_cli-2.1.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3571b74fe757ff4a20a4ab2b5f3765af", "sha256": "a355c7d7cd66a1fcf2076d5de993948f01dab7f89dd004723d04c4d56765a6ef" }, "downloads": -1, "filename": "ops-cli-2.1.7.tar.gz", "has_sig": false, "md5_digest": "3571b74fe757ff4a20a4ab2b5f3765af", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 151667, "upload_time": "2021-10-14T14:19:09", "upload_time_iso_8601": "2021-10-14T14:19:09.021118Z", "url": "https://files.pythonhosted.org/packages/b3/69/eb31b44b37bbd31e4c10688481f3964b7541e597c55a2e42eadf75aa6db4/ops-cli-2.1.7.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "40f30103115610d27056efba4332cf90", "sha256": "db0ec02894f8536be39c9328b64f71ae2d65dbb9f0b3c322e44c05d68906035e" }, "downloads": -1, "filename": "ops_cli-2.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "40f30103115610d27056efba4332cf90", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 101386, "upload_time": "2021-10-14T14:19:06", "upload_time_iso_8601": "2021-10-14T14:19:06.172881Z", "url": "https://files.pythonhosted.org/packages/bb/fa/82f886159ed4fa29c6b6b7464df2f433f2fab722c41e0e0cb96d939b19a1/ops_cli-2.1.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3571b74fe757ff4a20a4ab2b5f3765af", "sha256": "a355c7d7cd66a1fcf2076d5de993948f01dab7f89dd004723d04c4d56765a6ef" }, "downloads": -1, "filename": "ops-cli-2.1.7.tar.gz", "has_sig": false, "md5_digest": "3571b74fe757ff4a20a4ab2b5f3765af", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 151667, "upload_time": "2021-10-14T14:19:09", "upload_time_iso_8601": "2021-10-14T14:19:09.021118Z", "url": "https://files.pythonhosted.org/packages/b3/69/eb31b44b37bbd31e4c10688481f3964b7541e597c55a2e42eadf75aa6db4/ops-cli-2.1.7.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }