ops-cli 2.2.0__tar.gz → 2.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ops-cli-2.2.0/src/ops_cli.egg-info → ops_cli-2.3.0}/PKG-INFO +160 -4
- {ops-cli-2.2.0 → ops_cli-2.3.0}/README.md +9 -2
- {ops-cli-2.2.0 → ops_cli-2.3.0}/requirements.txt +41 -42
- {ops-cli-2.2.0 → ops_cli-2.3.0}/setup.py +1 -1
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/config.py +37 -6
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/inventory.py +1 -1
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/ssh.py +19 -1
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/ec2inventory.py +90 -115
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/cns.py +7 -7
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/ec2.py +7 -5
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/sshconfig.py +1 -1
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/simplevault.py +116 -46
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/terraform/terraform_cmd_generator.py +7 -3
- {ops-cli-2.2.0 → ops_cli-2.3.0/src/ops_cli.egg-info}/PKG-INFO +160 -4
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops_cli.egg-info/requires.txt +47 -44
- {ops-cli-2.2.0 → ops_cli-2.3.0}/LICENSE +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/MANIFEST.in +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/.opsconfig.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/README.md +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/clusters/kubeconfigs/README.md +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/clusters/my-kubernetes-cluster.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/backends.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/common_variables.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/configure-local-kubectl.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/eks-cluster-autoscaler.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/eks-cluster.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/eks-worker-nodes-auth-configmap.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/eks-worker-nodes.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/outputs.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/providers.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/scripts/fileexist.sh +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/variables.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/vpc.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/common/backends.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/common/common_variables.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/common/providers.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/backends.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/cluster-autoscaler.tf +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/common_variables.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/dashboard.tf +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/kube-state-metrics.tf +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/kube2iam.tf +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/provider_helm.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/providers.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/variables.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm-init/backends.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm-init/helm-init.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/update.sh +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/.opsconfig.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/README.md +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/install_stress_tool.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/setup.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/setup12.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/templates/cassandra-env.sh +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/templates/cassandra_defaults.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/templates/cassandra_defaults_12.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/templates/stress.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible.cfg +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/cluster1.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/cluster2.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/main/main.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/main/variables.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/modules/cassandra/main.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/modules/macros.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/modules/shared_iam/default_policy.json +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/modules/vpc/main.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/user_data +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/README.md +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/cluster/dev/dev.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/cluster/prod/prod.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/inventory/hosts +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/password_dev.txt +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/password_prod.txt +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/playbook/example.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/vault/vault_dev.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/vault/vault_prod.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/inventory/.opsconfig.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/inventory/README.md +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/inventory/local_inventory/hosts +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/inventory/my-aws-cluster.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/inventory/my-azure-cluster.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/packer/README.md +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/packer/clusters/ubuntu.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/packer/packer/ubuntu.json +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/.gitignore +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/README.md +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/ansible.cfg +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/playbooks/site.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/roles/common/tasks/main.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/roles/db/tasks/main.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/roles/web/tasks/main.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/tasks/copy-key.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/clusters/example.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/main/main.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/main/shared_variables.tf +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/db/instance.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/db/main.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/macros.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/shared_iam/default_policy.json +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/vpc/main.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/web/elb.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/web/instance.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/web/main.tf.jinja2 +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/user_data +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/.opsconfig.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/README.md +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/compositions/terraform/cluster/main.tf +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/compositions/terraform/network/main.tf +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/config/env=dev/cluster=cluster1/composition=cluster/conf.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/config/env=dev/cluster=cluster1/composition=network/conf.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/config/env=dev/cluster=cluster1/conf.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/config/env=dev/cluster=cluster2/composition=cluster/conf.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/config/env=dev/cluster=cluster2/composition=network/conf.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/config/env=dev/cluster=cluster2/conf.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/config/env=dev/default.yaml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/modules/cluster/main.tf +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/modules/network/main.tf +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/setup.cfg +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/__init__.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/__init__.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/callback_plugins/__init__.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/filter_plugins/__init__.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/filter_plugins/commonfilters.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/vars_plugins/__init__.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/vars_plugins/clusterconfig.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/vars_plugins/opsconfig.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/__init__.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/aws.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/config_generator.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/helmfile.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/packer.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/parser.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/playbook.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/run.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/sync.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/terraform.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ansible/ansible.cfg +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ansible/tasks/deploy_prometheus_alert_rules.yml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ansible/tasks/install_rpm.yml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ansible/tasks/remove_prometheus_alert_rules.yml +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ssh/ssh.config +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ssh/ssh.scb.proxy.config.tpl +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ssh/ssh.tunnel.config +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/terraform/terraformrc +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/git_utils.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/hierarchical/__init__.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/hierarchical/composition_config_generator.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/SKMS.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/__init__.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/azurerm.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/caching.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/generator.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/__init__.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/azr.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/legacy_pcs.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/skms.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/jinja/__init__.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/main.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/opsconfig.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/simpleconsul.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/simplessm.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/terraform/__init__.py +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops_cli.egg-info/SOURCES.txt +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops_cli.egg-info/dependency_links.txt +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops_cli.egg-info/entry_points.txt +0 -0
- {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops_cli.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: ops-cli
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Ops - wrapper for Terraform, Ansible, and SSH for cloud automation
|
|
5
5
|
Home-page: https://github.com/adobe/ops-cli
|
|
6
6
|
Author: Adobe
|
|
@@ -23,6 +23,155 @@ Classifier: Topic :: Text Processing :: Markup :: HTML
|
|
|
23
23
|
Requires-Python: >=3.5
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
25
25
|
License-File: LICENSE
|
|
26
|
+
Requires-Dist: adal==1.2.7
|
|
27
|
+
Requires-Dist: ansible==8.7.0; python_version >= "3.9"
|
|
28
|
+
Requires-Dist: ansible-core==2.15.13; python_version >= "3.9"
|
|
29
|
+
Requires-Dist: awscli==1.32.6; python_version >= "3.8"
|
|
30
|
+
Requires-Dist: azure==4.0.0
|
|
31
|
+
Requires-Dist: azure-applicationinsights==0.1.1
|
|
32
|
+
Requires-Dist: azure-batch==4.1.3
|
|
33
|
+
Requires-Dist: azure-common==1.1.28
|
|
34
|
+
Requires-Dist: azure-core==1.32.0; python_version >= "3.8"
|
|
35
|
+
Requires-Dist: azure-cosmosdb-nspkg==2.0.2
|
|
36
|
+
Requires-Dist: azure-cosmosdb-table==1.0.6
|
|
37
|
+
Requires-Dist: azure-datalake-store==0.0.53
|
|
38
|
+
Requires-Dist: azure-eventgrid==1.3.0
|
|
39
|
+
Requires-Dist: azure-graphrbac==0.40.0
|
|
40
|
+
Requires-Dist: azure-keyvault==1.1.0
|
|
41
|
+
Requires-Dist: azure-loganalytics==0.1.1
|
|
42
|
+
Requires-Dist: azure-mgmt==4.0.0
|
|
43
|
+
Requires-Dist: azure-mgmt-advisor==1.0.1
|
|
44
|
+
Requires-Dist: azure-mgmt-applicationinsights==0.1.1
|
|
45
|
+
Requires-Dist: azure-mgmt-authorization==0.50.0
|
|
46
|
+
Requires-Dist: azure-mgmt-batch==5.0.1
|
|
47
|
+
Requires-Dist: azure-mgmt-batchai==2.0.0
|
|
48
|
+
Requires-Dist: azure-mgmt-billing==0.2.0
|
|
49
|
+
Requires-Dist: azure-mgmt-cdn==3.1.0
|
|
50
|
+
Requires-Dist: azure-mgmt-cognitiveservices==3.0.0
|
|
51
|
+
Requires-Dist: azure-mgmt-commerce==1.0.1
|
|
52
|
+
Requires-Dist: azure-mgmt-compute==4.6.2
|
|
53
|
+
Requires-Dist: azure-mgmt-consumption==2.0.0
|
|
54
|
+
Requires-Dist: azure-mgmt-containerinstance==1.5.0
|
|
55
|
+
Requires-Dist: azure-mgmt-containerregistry==2.8.0
|
|
56
|
+
Requires-Dist: azure-mgmt-containerservice==4.4.0
|
|
57
|
+
Requires-Dist: azure-mgmt-cosmosdb==0.4.1
|
|
58
|
+
Requires-Dist: azure-mgmt-datafactory==0.6.0
|
|
59
|
+
Requires-Dist: azure-mgmt-datalake-analytics==0.6.0
|
|
60
|
+
Requires-Dist: azure-mgmt-datalake-nspkg==3.0.1
|
|
61
|
+
Requires-Dist: azure-mgmt-datalake-store==0.5.0
|
|
62
|
+
Requires-Dist: azure-mgmt-datamigration==1.0.0
|
|
63
|
+
Requires-Dist: azure-mgmt-devspaces==0.1.0
|
|
64
|
+
Requires-Dist: azure-mgmt-devtestlabs==2.2.0
|
|
65
|
+
Requires-Dist: azure-mgmt-dns==2.1.0
|
|
66
|
+
Requires-Dist: azure-mgmt-eventgrid==1.0.0
|
|
67
|
+
Requires-Dist: azure-mgmt-eventhub==2.6.0
|
|
68
|
+
Requires-Dist: azure-mgmt-hanaonazure==0.1.1
|
|
69
|
+
Requires-Dist: azure-mgmt-iotcentral==0.1.0
|
|
70
|
+
Requires-Dist: azure-mgmt-iothub==0.5.0
|
|
71
|
+
Requires-Dist: azure-mgmt-iothubprovisioningservices==0.2.0
|
|
72
|
+
Requires-Dist: azure-mgmt-keyvault==1.1.0
|
|
73
|
+
Requires-Dist: azure-mgmt-loganalytics==0.2.0
|
|
74
|
+
Requires-Dist: azure-mgmt-logic==3.0.0
|
|
75
|
+
Requires-Dist: azure-mgmt-machinelearningcompute==0.4.1
|
|
76
|
+
Requires-Dist: azure-mgmt-managementgroups==0.1.0
|
|
77
|
+
Requires-Dist: azure-mgmt-managementpartner==0.1.1
|
|
78
|
+
Requires-Dist: azure-mgmt-maps==0.1.0
|
|
79
|
+
Requires-Dist: azure-mgmt-marketplaceordering==0.1.0
|
|
80
|
+
Requires-Dist: azure-mgmt-media==1.0.1
|
|
81
|
+
Requires-Dist: azure-mgmt-monitor==0.5.2
|
|
82
|
+
Requires-Dist: azure-mgmt-msi==0.2.0
|
|
83
|
+
Requires-Dist: azure-mgmt-network==2.7.0
|
|
84
|
+
Requires-Dist: azure-mgmt-notificationhubs==2.1.0
|
|
85
|
+
Requires-Dist: azure-mgmt-nspkg==3.0.2
|
|
86
|
+
Requires-Dist: azure-mgmt-policyinsights==0.1.0
|
|
87
|
+
Requires-Dist: azure-mgmt-powerbiembedded==2.0.0
|
|
88
|
+
Requires-Dist: azure-mgmt-rdbms==1.9.0
|
|
89
|
+
Requires-Dist: azure-mgmt-recoveryservices==0.3.0
|
|
90
|
+
Requires-Dist: azure-mgmt-recoveryservicesbackup==0.3.0
|
|
91
|
+
Requires-Dist: azure-mgmt-redis==5.0.0
|
|
92
|
+
Requires-Dist: azure-mgmt-relay==0.1.0
|
|
93
|
+
Requires-Dist: azure-mgmt-reservations==0.2.1
|
|
94
|
+
Requires-Dist: azure-mgmt-resource==2.2.0
|
|
95
|
+
Requires-Dist: azure-mgmt-scheduler==2.0.0
|
|
96
|
+
Requires-Dist: azure-mgmt-search==2.1.0
|
|
97
|
+
Requires-Dist: azure-mgmt-servicebus==0.5.3
|
|
98
|
+
Requires-Dist: azure-mgmt-servicefabric==0.2.0
|
|
99
|
+
Requires-Dist: azure-mgmt-signalr==0.1.1
|
|
100
|
+
Requires-Dist: azure-mgmt-sql==0.9.1
|
|
101
|
+
Requires-Dist: azure-mgmt-storage==2.0.0
|
|
102
|
+
Requires-Dist: azure-mgmt-subscription==0.2.0
|
|
103
|
+
Requires-Dist: azure-mgmt-trafficmanager==0.50.0
|
|
104
|
+
Requires-Dist: azure-mgmt-web==0.35.0
|
|
105
|
+
Requires-Dist: azure-nspkg==3.0.2
|
|
106
|
+
Requires-Dist: azure-servicebus==0.21.1
|
|
107
|
+
Requires-Dist: azure-servicefabric==6.3.0.0
|
|
108
|
+
Requires-Dist: azure-servicemanagement-legacy==0.20.8
|
|
109
|
+
Requires-Dist: azure-storage-blob==1.5.0
|
|
110
|
+
Requires-Dist: azure-storage-common==1.4.2
|
|
111
|
+
Requires-Dist: azure-storage-file==1.4.0
|
|
112
|
+
Requires-Dist: azure-storage-queue==1.4.0
|
|
113
|
+
Requires-Dist: backports.functools-lru-cache==1.6.6; python_version >= "2.6"
|
|
114
|
+
Requires-Dist: boto3==1.34.6; python_version >= "3.8"
|
|
115
|
+
Requires-Dist: botocore==1.34.6; python_version >= "3.8"
|
|
116
|
+
Requires-Dist: cachetools==5.5.0; python_version >= "3.7"
|
|
117
|
+
Requires-Dist: certifi==2024.12.14; python_version >= "3.6"
|
|
118
|
+
Requires-Dist: cffi==1.17.1; python_version >= "3.8"
|
|
119
|
+
Requires-Dist: charset-normalizer==3.4.1; python_version >= "3.7"
|
|
120
|
+
Requires-Dist: colorama==0.4.4; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3, 3.4"
|
|
121
|
+
Requires-Dist: cryptography==44.0.0; python_version >= "3.7" and python_full_version not in "3.9.0, 3.9.1"
|
|
122
|
+
Requires-Dist: deepmerge==1.1.1
|
|
123
|
+
Requires-Dist: docutils==0.16; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3, 3.4"
|
|
124
|
+
Requires-Dist: gitdb==4.0.12; python_version >= "3.7"
|
|
125
|
+
Requires-Dist: gitpython==3.1.44; python_version >= "3.7"
|
|
126
|
+
Requires-Dist: google-auth==2.37.0; python_version >= "3.7"
|
|
127
|
+
Requires-Dist: hashmerge==0.2
|
|
128
|
+
Requires-Dist: himl==0.15.2; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
|
|
129
|
+
Requires-Dist: hvac==1.2.1; python_full_version >= "3.6.2" and python_full_version < "4.0.0"
|
|
130
|
+
Requires-Dist: idna==3.10; python_version >= "3.6"
|
|
131
|
+
Requires-Dist: inflection==0.5.1; python_version >= "3.5"
|
|
132
|
+
Requires-Dist: isodate==0.7.2; python_version >= "3.7"
|
|
133
|
+
Requires-Dist: jinja2==3.1.4; python_version >= "3.7"
|
|
134
|
+
Requires-Dist: jmespath==1.0.1; python_version >= "3.7"
|
|
135
|
+
Requires-Dist: kubernetes==26.1.0; python_version >= "3.6"
|
|
136
|
+
Requires-Dist: lru-cache==0.2.3
|
|
137
|
+
Requires-Dist: markupsafe==3.0.2; python_version >= "3.9"
|
|
138
|
+
Requires-Dist: msal==1.31.1; python_version >= "3.7"
|
|
139
|
+
Requires-Dist: msrest==0.7.1; python_version >= "3.6"
|
|
140
|
+
Requires-Dist: msrestazure==0.6.4
|
|
141
|
+
Requires-Dist: oauthlib==3.2.2; python_version >= "3.6"
|
|
142
|
+
Requires-Dist: packaging==24.2; python_version >= "3.8"
|
|
143
|
+
Requires-Dist: passgen==1.1.1
|
|
144
|
+
Requires-Dist: pathlib2==2.3.7.post1
|
|
145
|
+
Requires-Dist: pyasn1==0.6.1; python_version >= "3.8"
|
|
146
|
+
Requires-Dist: pyasn1-modules==0.4.1; python_version >= "3.8"
|
|
147
|
+
Requires-Dist: pycparser==2.22; python_version >= "3.8"
|
|
148
|
+
Requires-Dist: pyhcl==0.4.5
|
|
149
|
+
Requires-Dist: pyjwt[crypto]==2.10.1; python_version >= "3.9"
|
|
150
|
+
Requires-Dist: python-consul==1.1.0
|
|
151
|
+
Requires-Dist: python-dateutil==2.9.0.post0; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2"
|
|
152
|
+
Requires-Dist: pyyaml==6.0.1; python_version >= "3.6"
|
|
153
|
+
Requires-Dist: requests==2.32.3; python_version >= "3.8"
|
|
154
|
+
Requires-Dist: requests-oauthlib==2.0.0; python_version >= "3.4"
|
|
155
|
+
Requires-Dist: resolvelib==1.0.1
|
|
156
|
+
Requires-Dist: rsa==4.7.2; python_version >= "3.5" and python_version < "4"
|
|
157
|
+
Requires-Dist: s3transfer==0.10.4; python_version >= "3.8"
|
|
158
|
+
Requires-Dist: setuptools==75.8.0; python_version >= "3.9"
|
|
159
|
+
Requires-Dist: simpledi==0.4.1
|
|
160
|
+
Requires-Dist: six==1.17.0; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2"
|
|
161
|
+
Requires-Dist: smmap==5.0.2; python_version >= "3.7"
|
|
162
|
+
Requires-Dist: typing-extensions==4.12.2; python_version >= "3.8"
|
|
163
|
+
Requires-Dist: urllib3==2.0.7; python_version >= "3.7"
|
|
164
|
+
Requires-Dist: websocket-client==1.8.0; python_version >= "3.8"
|
|
165
|
+
Dynamic: author
|
|
166
|
+
Dynamic: author-email
|
|
167
|
+
Dynamic: classifier
|
|
168
|
+
Dynamic: description
|
|
169
|
+
Dynamic: description-content-type
|
|
170
|
+
Dynamic: home-page
|
|
171
|
+
Dynamic: license
|
|
172
|
+
Dynamic: requires-dist
|
|
173
|
+
Dynamic: requires-python
|
|
174
|
+
Dynamic: summary
|
|
26
175
|
|
|
27
176
|
# Ops CLI
|
|
28
177
|
[](https://github.com/adobe/ops-cli/actions/workflows/release.yml) [](https://github.com/adobe/ops-cli/pkgs/container/ops-cli) [](https://github.com/adobe/ops-cli/blob/master/LICENSE)
|
|
@@ -68,6 +217,7 @@ It can be used to add a layer of templating (using jinja2) on top of Terraform f
|
|
|
68
217
|
* [Terraform landscape](#terraform-landscape)
|
|
69
218
|
* [SSH](#ssh)
|
|
70
219
|
* [SSHPass](#sshpass)
|
|
220
|
+
* [Balabit SCB](#scb)
|
|
71
221
|
* [Play](#play)
|
|
72
222
|
* [Run command](#run-command)
|
|
73
223
|
* [Sync files](#sync-files)
|
|
@@ -176,7 +326,7 @@ workon ops
|
|
|
176
326
|
# uninstall previous `ops` version (if you have it)
|
|
177
327
|
pip uninstall ops --yes
|
|
178
328
|
|
|
179
|
-
# install ops-cli v2.
|
|
329
|
+
# install ops-cli v2.3.0 stable release
|
|
180
330
|
pip install --upgrade ops-cli
|
|
181
331
|
```
|
|
182
332
|
|
|
@@ -192,7 +342,7 @@ You can try out `ops-cli`, by using docker. The docker image has all required pr
|
|
|
192
342
|
|
|
193
343
|
To start out a container, running the latest `ops-cli` docker image run:
|
|
194
344
|
```sh
|
|
195
|
-
docker run -it ghcr.io/adobe/ops-cli:2.
|
|
345
|
+
docker run -it ghcr.io/adobe/ops-cli:2.3.0 bash
|
|
196
346
|
```
|
|
197
347
|
|
|
198
348
|
After the container has started, you can start using `ops-cli`:
|
|
@@ -718,6 +868,12 @@ Which will translate behind the scenes in :
|
|
|
718
868
|
This 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.
|
|
719
869
|
The reference is by means of fixed form jinja call added to the cluster file, which ends up interpreted later during the templating phase.
|
|
720
870
|
|
|
871
|
+
#### Vault auth
|
|
872
|
+
Ops checks if a valid vault token is present in `~/.vault-token` or in the environment variable `VAULT_TOKEN`. If not, it will try to authenticate using the method defined in `OPS_VAULT_AUTH_METHOD` environment variable.
|
|
873
|
+
The following methods are supported:
|
|
874
|
+
- `okta` - use the Vault Okta auth method (default)
|
|
875
|
+
- `ldap` - use the Vault ldap auth method
|
|
876
|
+
|
|
721
877
|
### Amazon Secrets Manager (SSM)
|
|
722
878
|
|
|
723
879
|
Amazon 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.
|
|
@@ -42,6 +42,7 @@ It can be used to add a layer of templating (using jinja2) on top of Terraform f
|
|
|
42
42
|
* [Terraform landscape](#terraform-landscape)
|
|
43
43
|
* [SSH](#ssh)
|
|
44
44
|
* [SSHPass](#sshpass)
|
|
45
|
+
* [Balabit SCB](#scb)
|
|
45
46
|
* [Play](#play)
|
|
46
47
|
* [Run command](#run-command)
|
|
47
48
|
* [Sync files](#sync-files)
|
|
@@ -150,7 +151,7 @@ workon ops
|
|
|
150
151
|
# uninstall previous `ops` version (if you have it)
|
|
151
152
|
pip uninstall ops --yes
|
|
152
153
|
|
|
153
|
-
# install ops-cli v2.
|
|
154
|
+
# install ops-cli v2.3.0 stable release
|
|
154
155
|
pip install --upgrade ops-cli
|
|
155
156
|
```
|
|
156
157
|
|
|
@@ -166,7 +167,7 @@ You can try out `ops-cli`, by using docker. The docker image has all required pr
|
|
|
166
167
|
|
|
167
168
|
To start out a container, running the latest `ops-cli` docker image run:
|
|
168
169
|
```sh
|
|
169
|
-
docker run -it ghcr.io/adobe/ops-cli:2.
|
|
170
|
+
docker run -it ghcr.io/adobe/ops-cli:2.3.0 bash
|
|
170
171
|
```
|
|
171
172
|
|
|
172
173
|
After the container has started, you can start using `ops-cli`:
|
|
@@ -692,6 +693,12 @@ Which will translate behind the scenes in :
|
|
|
692
693
|
This 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.
|
|
693
694
|
The reference is by means of fixed form jinja call added to the cluster file, which ends up interpreted later during the templating phase.
|
|
694
695
|
|
|
696
|
+
#### Vault auth
|
|
697
|
+
Ops checks if a valid vault token is present in `~/.vault-token` or in the environment variable `VAULT_TOKEN`. If not, it will try to authenticate using the method defined in `OPS_VAULT_AUTH_METHOD` environment variable.
|
|
698
|
+
The following methods are supported:
|
|
699
|
+
- `okta` - use the Vault Okta auth method (default)
|
|
700
|
+
- `ldap` - use the Vault ldap auth method
|
|
701
|
+
|
|
695
702
|
### Amazon Secrets Manager (SSM)
|
|
696
703
|
|
|
697
704
|
Amazon 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.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
adal==1.2.7
|
|
2
|
-
ansible==8.
|
|
3
|
-
ansible-core==2.15.
|
|
4
|
-
awscli==1.
|
|
2
|
+
ansible==8.7.0; python_version >= '3.9'
|
|
3
|
+
ansible-core==2.15.13; python_version >= '3.9'
|
|
4
|
+
awscli==1.32.6; python_version >= '3.8'
|
|
5
5
|
azure==4.0.0
|
|
6
6
|
azure-applicationinsights==0.1.1
|
|
7
7
|
azure-batch==4.1.3
|
|
8
8
|
azure-common==1.1.28
|
|
9
|
-
azure-core==1.
|
|
9
|
+
azure-core==1.32.0; python_version >= '3.8'
|
|
10
10
|
azure-cosmosdb-nspkg==2.0.2
|
|
11
11
|
azure-cosmosdb-table==1.0.6
|
|
12
12
|
azure-datalake-store==0.0.53
|
|
@@ -80,61 +80,60 @@ azure-mgmt-web==0.35.0
|
|
|
80
80
|
azure-nspkg==3.0.2
|
|
81
81
|
azure-servicebus==0.21.1
|
|
82
82
|
azure-servicefabric==6.3.0.0
|
|
83
|
-
azure-servicemanagement-legacy==0.20.
|
|
83
|
+
azure-servicemanagement-legacy==0.20.8
|
|
84
84
|
azure-storage-blob==1.5.0
|
|
85
85
|
azure-storage-common==1.4.2
|
|
86
86
|
azure-storage-file==1.4.0
|
|
87
87
|
azure-storage-queue==1.4.0
|
|
88
88
|
backports.functools-lru-cache==1.6.6; python_version >= '2.6'
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
charset-normalizer==3.2.0; python_full_version >= '3.7.0'
|
|
89
|
+
boto3==1.34.6; python_version >= '3.8'
|
|
90
|
+
botocore==1.34.6; python_version >= '3.8'
|
|
91
|
+
cachetools==5.5.0; python_version >= '3.7'
|
|
92
|
+
certifi==2024.12.14; python_version >= '3.6'
|
|
93
|
+
cffi==1.17.1; python_version >= '3.8'
|
|
94
|
+
charset-normalizer==3.4.1; python_version >= '3.7'
|
|
96
95
|
colorama==0.4.4; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
|
|
97
|
-
cryptography==
|
|
98
|
-
deepmerge==1.1.
|
|
96
|
+
cryptography==44.0.0; python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'
|
|
97
|
+
deepmerge==1.1.1
|
|
99
98
|
docutils==0.16; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
|
|
100
|
-
gitdb==4.0.
|
|
101
|
-
gitpython==3.1.
|
|
102
|
-
google-auth==2.
|
|
99
|
+
gitdb==4.0.12; python_version >= '3.7'
|
|
100
|
+
gitpython==3.1.44; python_version >= '3.7'
|
|
101
|
+
google-auth==2.37.0; python_version >= '3.7'
|
|
103
102
|
hashmerge==0.2
|
|
104
|
-
himl==0.15.0
|
|
105
|
-
hvac==1.1.
|
|
106
|
-
idna==3.
|
|
107
|
-
inflection==0.5.1
|
|
108
|
-
isodate==0.
|
|
109
|
-
jinja2==3.1.
|
|
103
|
+
himl==0.15.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
|
|
104
|
+
hvac==1.2.1; python_full_version >= '3.6.2' and python_full_version < '4.0.0'
|
|
105
|
+
idna==3.10; python_version >= '3.6'
|
|
106
|
+
inflection==0.5.1; python_version >= '3.5'
|
|
107
|
+
isodate==0.7.2; python_version >= '3.7'
|
|
108
|
+
jinja2==3.1.4; python_version >= '3.7'
|
|
110
109
|
jmespath==1.0.1; python_version >= '3.7'
|
|
111
|
-
kubernetes==26.1.0
|
|
110
|
+
kubernetes==26.1.0; python_version >= '3.6'
|
|
112
111
|
lru-cache==0.2.3
|
|
113
|
-
markupsafe==
|
|
114
|
-
msal==1.
|
|
112
|
+
markupsafe==3.0.2; python_version >= '3.9'
|
|
113
|
+
msal==1.31.1; python_version >= '3.7'
|
|
115
114
|
msrest==0.7.1; python_version >= '3.6'
|
|
116
115
|
msrestazure==0.6.4
|
|
117
116
|
oauthlib==3.2.2; python_version >= '3.6'
|
|
118
|
-
packaging==
|
|
117
|
+
packaging==24.2; python_version >= '3.8'
|
|
119
118
|
passgen==1.1.1
|
|
120
119
|
pathlib2==2.3.7.post1
|
|
121
|
-
pyasn1==0.
|
|
122
|
-
pyasn1-modules==0.
|
|
123
|
-
pycparser==2.
|
|
124
|
-
pyhcl==0.4.
|
|
125
|
-
pyjwt==2.
|
|
120
|
+
pyasn1==0.6.1; python_version >= '3.8'
|
|
121
|
+
pyasn1-modules==0.4.1; python_version >= '3.8'
|
|
122
|
+
pycparser==2.22; python_version >= '3.8'
|
|
123
|
+
pyhcl==0.4.5
|
|
124
|
+
pyjwt[crypto]==2.10.1; python_version >= '3.9'
|
|
126
125
|
python-consul==1.1.0
|
|
127
|
-
python-dateutil==2.
|
|
126
|
+
python-dateutil==2.9.0.post0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'
|
|
128
127
|
pyyaml==6.0.1; python_version >= '3.6'
|
|
129
|
-
requests==2.
|
|
130
|
-
requests-oauthlib==
|
|
128
|
+
requests==2.32.3; python_version >= '3.8'
|
|
129
|
+
requests-oauthlib==2.0.0; python_version >= '3.4'
|
|
131
130
|
resolvelib==1.0.1
|
|
132
131
|
rsa==4.7.2; python_version >= '3.5' and python_version < '4'
|
|
133
|
-
s3transfer==0.
|
|
134
|
-
setuptools==
|
|
132
|
+
s3transfer==0.10.4; python_version >= '3.8'
|
|
133
|
+
setuptools==75.8.0; python_version >= '3.9'
|
|
135
134
|
simpledi==0.4.1
|
|
136
|
-
six==1.
|
|
137
|
-
smmap==5.0.
|
|
138
|
-
typing-extensions==4.
|
|
139
|
-
urllib3==
|
|
140
|
-
websocket-client==1.
|
|
135
|
+
six==1.17.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'
|
|
136
|
+
smmap==5.0.2; python_version >= '3.7'
|
|
137
|
+
typing-extensions==4.12.2; python_version >= '3.8'
|
|
138
|
+
urllib3==2.0.7; python_version >= '3.7'
|
|
139
|
+
websocket-client==1.8.0; python_version >= '3.8'
|
|
@@ -23,7 +23,7 @@ _mydir = os.path.abspath(os.path.dirname(sys.argv[0]))
|
|
|
23
23
|
_requires = [r for r in open(os.path.sep.join((_mydir, 'requirements.txt')), "r").read().split('\n') if len(r) > 1]
|
|
24
24
|
setup(
|
|
25
25
|
name='ops-cli',
|
|
26
|
-
version='2.
|
|
26
|
+
version='2.3.0',
|
|
27
27
|
description='Ops - wrapper for Terraform, Ansible, and SSH for cloud automation',
|
|
28
28
|
long_description=_readme + '\n\n',
|
|
29
29
|
long_description_content_type='text/markdown',
|
|
@@ -8,21 +8,22 @@
|
|
|
8
8
|
# OF ANY KIND, either express or implied. See the License for the specific language
|
|
9
9
|
# governing permissions and limitations under the License.
|
|
10
10
|
|
|
11
|
-
import collections
|
|
12
11
|
import os
|
|
13
|
-
|
|
14
12
|
import yaml
|
|
15
13
|
|
|
16
14
|
from ansible.module_utils.common.collections import ImmutableDict
|
|
17
15
|
from ansible.parsing.dataloader import DataLoader
|
|
18
|
-
from ansible.plugins.loader import PluginLoader
|
|
19
16
|
from ansible.template import Templar
|
|
20
|
-
from ansible.utils.vars import
|
|
17
|
+
from ansible.utils.vars import combine_vars
|
|
21
18
|
from ansible.vars.manager import VariableManager
|
|
22
19
|
from ops.cli import display
|
|
23
20
|
from ansible import constants as C
|
|
24
21
|
from ansible import context
|
|
25
22
|
import logging
|
|
23
|
+
from ansible.errors import AnsibleOptionsError
|
|
24
|
+
from ansible.module_utils._text import to_text
|
|
25
|
+
from ansible.parsing.splitter import parse_kv
|
|
26
|
+
from collections.abc import MutableMapping
|
|
26
27
|
|
|
27
28
|
logger = logging.getLogger(__name__)
|
|
28
29
|
|
|
@@ -34,6 +35,38 @@ def get_cluster_name(cluster_config_path):
|
|
|
34
35
|
'/')[-1].replace('.yaml', '').replace('.yml', '')
|
|
35
36
|
|
|
36
37
|
|
|
38
|
+
def load_extra_vars(loader):
|
|
39
|
+
"""
|
|
40
|
+
Overriding Ansible function using version before slight var loading optimization
|
|
41
|
+
in order to avoid caching issues https://github.com/ansible/ansible/pull/78835/files
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
extra_vars = {}
|
|
45
|
+
for extra_vars_opt in context.CLIARGS.get('extra_vars', tuple()):
|
|
46
|
+
data = None
|
|
47
|
+
extra_vars_opt = to_text(extra_vars_opt, errors='surrogate_or_strict')
|
|
48
|
+
if extra_vars_opt is None or not extra_vars_opt:
|
|
49
|
+
continue
|
|
50
|
+
|
|
51
|
+
if extra_vars_opt.startswith(u"@"):
|
|
52
|
+
# Argument is a YAML file (JSON is a subset of YAML)
|
|
53
|
+
data = loader.load_from_file(extra_vars_opt[1:])
|
|
54
|
+
elif extra_vars_opt[0] in [u'/', u'.']:
|
|
55
|
+
raise AnsibleOptionsError("Please prepend extra_vars filename '%s' with '@'" % extra_vars_opt)
|
|
56
|
+
elif extra_vars_opt[0] in [u'[', u'{']:
|
|
57
|
+
# Arguments as YAML
|
|
58
|
+
data = loader.load(extra_vars_opt)
|
|
59
|
+
else:
|
|
60
|
+
# Arguments as Key-value
|
|
61
|
+
data = parse_kv(extra_vars_opt)
|
|
62
|
+
|
|
63
|
+
if isinstance(data, MutableMapping):
|
|
64
|
+
extra_vars = combine_vars(extra_vars, data)
|
|
65
|
+
else:
|
|
66
|
+
raise AnsibleOptionsError("Invalid extra vars data supplied. '%s' could not be made into a dictionary" % extra_vars_opt)
|
|
67
|
+
return extra_vars
|
|
68
|
+
|
|
69
|
+
|
|
37
70
|
class ClusterConfig(object):
|
|
38
71
|
def __init__(self, cluster_config_generator,
|
|
39
72
|
ops_config, cluster_config_path):
|
|
@@ -119,7 +152,6 @@ class JinjaConfigGenerator(object):
|
|
|
119
152
|
context_cliargs['extra_vars'] = tuple(extra_vars)
|
|
120
153
|
|
|
121
154
|
context.CLIARGS = ImmutableDict(context_cliargs)
|
|
122
|
-
setattr(load_extra_vars, 'extra_vars', {})
|
|
123
155
|
variable_manager._extra_vars = load_extra_vars(
|
|
124
156
|
loader=data_loader)
|
|
125
157
|
|
|
@@ -159,7 +191,6 @@ class ClusterConfigGenerator(object):
|
|
|
159
191
|
context_cliargs['extra_vars'] = tuple(extra_vars)
|
|
160
192
|
|
|
161
193
|
context.CLIARGS = ImmutableDict(context_cliargs)
|
|
162
|
-
setattr(load_extra_vars, 'extra_vars', {})
|
|
163
194
|
variable_manager._extra_vars = load_extra_vars(
|
|
164
195
|
loader=data_loader)
|
|
165
196
|
|
|
@@ -53,7 +53,7 @@ class InventoryRunner(object):
|
|
|
53
53
|
group_names = [group.name for group in host.get_groups()]
|
|
54
54
|
group_names = sorted(group_names)
|
|
55
55
|
group_string = ", ".join(group_names)
|
|
56
|
-
host_id = host.vars.get('
|
|
56
|
+
host_id = host.vars.get('ec2_InstanceId', '')
|
|
57
57
|
if host_id != '':
|
|
58
58
|
name_and_id = "%s -- %s" % (stringc(host.name,
|
|
59
59
|
'blue'), stringc(host_id, 'blue'))
|
|
@@ -92,6 +92,12 @@ class SshParserConfig(SubParserConfig):
|
|
|
92
92
|
help='When using Shell Control Box (SCB) and creating a proxy,'
|
|
93
93
|
'a random port is generated, which will be used in the ssh config '
|
|
94
94
|
'for all playbook, run and sync operations')
|
|
95
|
+
parser.add_argument(
|
|
96
|
+
'--ssh-dest-user',
|
|
97
|
+
type=str,
|
|
98
|
+
dest='ssh_dest_user',
|
|
99
|
+
help='SSH User for the destination host, different from the bastion or SCB user. '
|
|
100
|
+
'Useful when LDAP is not working on the destination host.')
|
|
95
101
|
|
|
96
102
|
def get_help(self):
|
|
97
103
|
return 'SSH or create an SSH tunnel to a server in the cluster'
|
|
@@ -260,6 +266,12 @@ class SshRunner(object):
|
|
|
260
266
|
ssh_config = args.ssh_config or self.ops_config.get(
|
|
261
267
|
'ssh.config') or self.ansible_inventory.get_ssh_config()
|
|
262
268
|
|
|
269
|
+
ssh_host_bastion, ssh_host_dest = None, None
|
|
270
|
+
if args.ssh_dest_user:
|
|
271
|
+
ssh_host_parts = ssh_host.split('--')
|
|
272
|
+
ssh_host_bastion = ssh_host_parts[0]
|
|
273
|
+
ssh_host_dest = ssh_host_parts[1] if len(ssh_host_parts) > 1 else None
|
|
274
|
+
|
|
263
275
|
scb_ssh_host = None
|
|
264
276
|
if scb_enabled:
|
|
265
277
|
# scb->bastion->host vs scb->bastion
|
|
@@ -280,13 +292,19 @@ class SshRunner(object):
|
|
|
280
292
|
else:
|
|
281
293
|
if scb_enabled:
|
|
282
294
|
command = f"ssh -F {ssh_config} {ssh_user}@{scb_ssh_host}"
|
|
295
|
+
if args.ssh_dest_user and ssh_host_dest:
|
|
296
|
+
command = (f"ssh -F {ssh_config} -t {ssh_user}@{ssh_host_bastion}@{scb_host} "
|
|
297
|
+
f"ssh {args.ssh_dest_user}@{ssh_host_dest}")
|
|
283
298
|
else:
|
|
284
299
|
command = f"ssh -F {ssh_config} {ssh_host}"
|
|
300
|
+
if args.ssh_dest_user and ssh_host_dest:
|
|
301
|
+
command = (f"ssh -F {ssh_config} -t {ssh_user}@{ssh_host_bastion} "
|
|
302
|
+
f"ssh {args.ssh_dest_user}@{ssh_host_dest}")
|
|
285
303
|
|
|
286
304
|
if args.proxy:
|
|
287
305
|
if scb_enabled:
|
|
288
306
|
proxy_port = args.local or SshConfigGenerator.generate_ssh_scb_proxy_port(
|
|
289
|
-
self.ansible_inventory.generated_path.
|
|
307
|
+
self.ansible_inventory.generated_path.removesuffix("/inventory"),
|
|
290
308
|
args.auto_scb_port,
|
|
291
309
|
scb_proxy_port
|
|
292
310
|
)
|