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.
Files changed (166) hide show
  1. {ops-cli-2.2.0/src/ops_cli.egg-info → ops_cli-2.3.0}/PKG-INFO +160 -4
  2. {ops-cli-2.2.0 → ops_cli-2.3.0}/README.md +9 -2
  3. {ops-cli-2.2.0 → ops_cli-2.3.0}/requirements.txt +41 -42
  4. {ops-cli-2.2.0 → ops_cli-2.3.0}/setup.py +1 -1
  5. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/config.py +37 -6
  6. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/inventory.py +1 -1
  7. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/ssh.py +19 -1
  8. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/ec2inventory.py +90 -115
  9. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/cns.py +7 -7
  10. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/ec2.py +7 -5
  11. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/sshconfig.py +1 -1
  12. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/simplevault.py +116 -46
  13. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/terraform/terraform_cmd_generator.py +7 -3
  14. {ops-cli-2.2.0 → ops_cli-2.3.0/src/ops_cli.egg-info}/PKG-INFO +160 -4
  15. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops_cli.egg-info/requires.txt +47 -44
  16. {ops-cli-2.2.0 → ops_cli-2.3.0}/LICENSE +0 -0
  17. {ops-cli-2.2.0 → ops_cli-2.3.0}/MANIFEST.in +0 -0
  18. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/.opsconfig.yaml +0 -0
  19. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/README.md +0 -0
  20. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/clusters/kubeconfigs/README.md +0 -0
  21. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/clusters/my-kubernetes-cluster.yaml +0 -0
  22. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/backends.tf.jinja2 +0 -0
  23. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/common_variables.tf.jinja2 +0 -0
  24. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/configure-local-kubectl.tf.jinja2 +0 -0
  25. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/eks-cluster-autoscaler.tf.jinja2 +0 -0
  26. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/eks-cluster.tf.jinja2 +0 -0
  27. {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
  28. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/eks-worker-nodes.tf.jinja2 +0 -0
  29. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/outputs.tf.jinja2 +0 -0
  30. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/providers.tf.jinja2 +0 -0
  31. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/scripts/fileexist.sh +0 -0
  32. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/variables.tf.jinja2 +0 -0
  33. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/aws-eks/vpc.tf.jinja2 +0 -0
  34. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/common/backends.tf.jinja2 +0 -0
  35. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/common/common_variables.tf.jinja2 +0 -0
  36. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/common/providers.tf.jinja2 +0 -0
  37. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/backends.tf.jinja2 +0 -0
  38. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/cluster-autoscaler.tf +0 -0
  39. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/common_variables.tf.jinja2 +0 -0
  40. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/dashboard.tf +0 -0
  41. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/kube-state-metrics.tf +0 -0
  42. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/kube2iam.tf +0 -0
  43. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/provider_helm.tf.jinja2 +0 -0
  44. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/providers.tf.jinja2 +0 -0
  45. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm/variables.tf.jinja2 +0 -0
  46. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm-init/backends.tf.jinja2 +0 -0
  47. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/compositions/generic/helm-init/helm-init.tf.jinja2 +0 -0
  48. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/aws-kubernetes/update.sh +0 -0
  49. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/.opsconfig.yaml +0 -0
  50. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/README.md +0 -0
  51. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/install_stress_tool.yaml +0 -0
  52. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/setup.yaml +0 -0
  53. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/setup12.yaml +0 -0
  54. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/templates/cassandra-env.sh +0 -0
  55. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/templates/cassandra_defaults.yaml +0 -0
  56. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/templates/cassandra_defaults_12.yaml +0 -0
  57. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible/templates/stress.yaml +0 -0
  58. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/ansible.cfg +0 -0
  59. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/cluster1.yaml +0 -0
  60. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/cluster2.yaml +0 -0
  61. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/main/main.tf.jinja2 +0 -0
  62. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/main/variables.tf.jinja2 +0 -0
  63. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/modules/cassandra/main.tf.jinja2 +0 -0
  64. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/modules/macros.tf.jinja2 +0 -0
  65. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/modules/shared_iam/default_policy.json +0 -0
  66. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/modules/vpc/main.tf.jinja2 +0 -0
  67. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/cassandra-stress/terraform/user_data +0 -0
  68. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/README.md +0 -0
  69. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/cluster/dev/dev.yaml +0 -0
  70. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/cluster/prod/prod.yaml +0 -0
  71. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/inventory/hosts +0 -0
  72. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/password_dev.txt +0 -0
  73. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/password_prod.txt +0 -0
  74. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/playbook/example.yaml +0 -0
  75. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/vault/vault_dev.yaml +0 -0
  76. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/ansible-vault/vault/vault_prod.yaml +0 -0
  77. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/inventory/.opsconfig.yaml +0 -0
  78. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/inventory/README.md +0 -0
  79. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/inventory/local_inventory/hosts +0 -0
  80. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/inventory/my-aws-cluster.yaml +0 -0
  81. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/inventory/my-azure-cluster.yaml +0 -0
  82. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/packer/README.md +0 -0
  83. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/packer/clusters/ubuntu.yaml +0 -0
  84. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/packer/packer/ubuntu.json +0 -0
  85. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/.gitignore +0 -0
  86. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/README.md +0 -0
  87. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/ansible.cfg +0 -0
  88. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/playbooks/site.yaml +0 -0
  89. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/roles/common/tasks/main.yaml +0 -0
  90. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/roles/db/tasks/main.yaml +0 -0
  91. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/roles/web/tasks/main.yaml +0 -0
  92. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/ansible/tasks/copy-key.yaml +0 -0
  93. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/clusters/example.yaml +0 -0
  94. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/main/main.tf.jinja2 +0 -0
  95. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/main/shared_variables.tf +0 -0
  96. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/db/instance.tf.jinja2 +0 -0
  97. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/db/main.tf.jinja2 +0 -0
  98. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/macros.tf.jinja2 +0 -0
  99. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/shared_iam/default_policy.json +0 -0
  100. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/vpc/main.tf.jinja2 +0 -0
  101. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/web/elb.tf.jinja2 +0 -0
  102. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/web/instance.tf.jinja2 +0 -0
  103. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/modules/web/main.tf.jinja2 +0 -0
  104. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-and-ansible/terraform/user_data +0 -0
  105. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/.opsconfig.yaml +0 -0
  106. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/README.md +0 -0
  107. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/compositions/terraform/cluster/main.tf +0 -0
  108. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/compositions/terraform/network/main.tf +0 -0
  109. {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
  110. {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
  111. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/config/env=dev/cluster=cluster1/conf.yaml +0 -0
  112. {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
  113. {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
  114. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/config/env=dev/cluster=cluster2/conf.yaml +0 -0
  115. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/config/env=dev/default.yaml +0 -0
  116. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/modules/cluster/main.tf +0 -0
  117. {ops-cli-2.2.0 → ops_cli-2.3.0}/examples/features/terraform-hierarchical/modules/network/main.tf +0 -0
  118. {ops-cli-2.2.0 → ops_cli-2.3.0}/setup.cfg +0 -0
  119. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/__init__.py +0 -0
  120. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/__init__.py +0 -0
  121. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/callback_plugins/__init__.py +0 -0
  122. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/filter_plugins/__init__.py +0 -0
  123. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/filter_plugins/commonfilters.py +0 -0
  124. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/vars_plugins/__init__.py +0 -0
  125. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/vars_plugins/clusterconfig.py +0 -0
  126. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/ansible/vars_plugins/opsconfig.py +0 -0
  127. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/__init__.py +0 -0
  128. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/aws.py +0 -0
  129. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/config_generator.py +0 -0
  130. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/helmfile.py +0 -0
  131. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/packer.py +0 -0
  132. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/parser.py +0 -0
  133. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/playbook.py +0 -0
  134. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/run.py +0 -0
  135. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/sync.py +0 -0
  136. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/cli/terraform.py +0 -0
  137. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ansible/ansible.cfg +0 -0
  138. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ansible/tasks/deploy_prometheus_alert_rules.yml +0 -0
  139. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ansible/tasks/install_rpm.yml +0 -0
  140. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ansible/tasks/remove_prometheus_alert_rules.yml +0 -0
  141. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ssh/ssh.config +0 -0
  142. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ssh/ssh.scb.proxy.config.tpl +0 -0
  143. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/ssh/ssh.tunnel.config +0 -0
  144. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/data/terraform/terraformrc +0 -0
  145. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/git_utils.py +0 -0
  146. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/hierarchical/__init__.py +0 -0
  147. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/hierarchical/composition_config_generator.py +0 -0
  148. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/SKMS.py +0 -0
  149. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/__init__.py +0 -0
  150. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/azurerm.py +0 -0
  151. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/caching.py +0 -0
  152. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/generator.py +0 -0
  153. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/__init__.py +0 -0
  154. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/azr.py +0 -0
  155. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/legacy_pcs.py +0 -0
  156. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/inventory/plugin/skms.py +0 -0
  157. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/jinja/__init__.py +0 -0
  158. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/main.py +0 -0
  159. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/opsconfig.py +0 -0
  160. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/simpleconsul.py +0 -0
  161. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/simplessm.py +0 -0
  162. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops/terraform/__init__.py +0 -0
  163. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops_cli.egg-info/SOURCES.txt +0 -0
  164. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops_cli.egg-info/dependency_links.txt +0 -0
  165. {ops-cli-2.2.0 → ops_cli-2.3.0}/src/ops_cli.egg-info/entry_points.txt +0 -0
  166. {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
1
+ Metadata-Version: 2.2
2
2
  Name: ops-cli
3
- Version: 2.2.0
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
  [![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)
@@ -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.2.0 stable release
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.2.0 bash
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.2.0 stable release
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.2.0 bash
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.2.0
3
- ansible-core==2.15.2; python_version >= '3.9'
4
- awscli==1.29.12
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.28.0; python_version >= '3.7'
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.7
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
- boto==2.49.0
90
- boto3==1.28.12
91
- botocore==1.31.12; python_version >= '3.7'
92
- cachetools==5.3.1; python_version >= '3.7'
93
- certifi==2023.7.22; python_version >= '3.6'
94
- cffi==1.15.1
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==41.0.2; python_version >= '3.7'
98
- deepmerge==1.1.0
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.10; python_version >= '3.7'
101
- gitpython==3.1.32
102
- google-auth==2.22.0; python_version >= '3.6'
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.1
106
- idna==3.4; python_version >= '3.5'
107
- inflection==0.5.1
108
- isodate==0.6.1
109
- jinja2==3.1.2
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==2.1.3; python_version >= '3.7'
114
- msal==1.23.0
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==23.1; python_version >= '3.7'
117
+ packaging==24.2; python_version >= '3.8'
119
118
  passgen==1.1.1
120
119
  pathlib2==2.3.7.post1
121
- pyasn1==0.5.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'
122
- pyasn1-modules==0.3.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'
123
- pycparser==2.21
124
- pyhcl==0.4.4
125
- pyjwt==2.8.0; python_version >= '3.7'
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.8.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.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.31.0; python_version >= '3.7'
130
- requests-oauthlib==1.3.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
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.6.1; python_version >= '3.7'
134
- setuptools==68.0.0; python_version >= '3.7'
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.16.0
137
- smmap==5.0.0; python_version >= '3.6'
138
- typing-extensions==4.7.1; python_version >= '3.7'
139
- urllib3==1.26.16; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'
140
- websocket-client==1.6.1; python_version >= '3.7'
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.2.0',
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 load_extra_vars
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('ec2_id', '')
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.rstrip("/inventory"),
307
+ self.ansible_inventory.generated_path.removesuffix("/inventory"),
290
308
  args.auto_scb_port,
291
309
  scb_proxy_port
292
310
  )