Skip to content

Deployment Technology Rules Specification 1.0 Release Candidate

Quick Tip #1

Elements in graphs can be clicked to open their type definition!

Quick Tip #2

You can query technology rules for your deployment scenario using vintner utils scenarios!

This document specifies the deployment technology rules. The specification is under active development and is not backwards compatible with any previous versions.

Deployment Technologies

Technology rules are defined in the context of the following deployment technologies.

Ansible

Ansible is an open-source automation tool primarily used for configuration management, application deployment, and task automation. It allows IT administrators and DevOps teams to manage software on servers using SSH, without the need for agents on target nodes. Ansible uses simple, human-readable YAML files called playbooks to define tasks and configurations, enabling consistent management of IT environments across multiple servers. Its main purpose is to simplify the management of software configurations, reduce manual effort, and ensure consistency and reliability in IT operations, making it an ideal tool for automating repetitive tasks and orchestrating complex workflows across diverse environments. Find out more.

Terraform

Terraform is an open-source infrastructure as code (IaC) tool developed by HashiCorp that allows users to define, provision, and manage cloud infrastructure in a consistent, automated, and reproducible way. Using a declarative configuration language called HashiCorp Configuration Language (HCL) or JSON, Terraform enables users to define infrastructure components such as virtual machines, networks, and storage in human-readable configuration files. It supports a wide range of cloud providers, including AWS, Azure, Google Cloud, and many others, allowing for seamless multi-cloud management. By applying these configurations, Terraform creates and manages the defined resources through APIs, making it a powerful tool for automating infrastructure deployment, scaling, and version control. However, Terraform is specifically designed for managing infrastructure and is not intended for managing software on remote targets, which is outside its primary scope. Find out more.

Kubernetes

Kubernetes, also known as K8s, is an open-source system for automating the deployment, scaling, and management of containerized applications, offering production-grade container orchestration. It provides a robust platform for running and managing applications in clusters of servers, ensuring high availability, scalability, and efficient resource utilization. Kubernetes allows users to define the desired state of their applications using declarative manifests, which specify the configuration, deployment, and management of containerized workloads. By continuously monitoring and adjusting the cluster to match these desired states, Kubernetes simplifies the application deployment process, supports automated rollouts and rollbacks, and ensures the self-healing of applications, making it a critical tool for modern software delivery and operational efficiency. Find out more.

Docker Compose

Docker Compose is a tool that enables the definition and running of multi-container applications on a Docker Engine, using a single YAML configuration file. It streamlines the management of complex applications by simplifying the control of services, networks, and volumes, allowing developers to manage the entire stack effortlessly. Compose is particularly suited for development, testing, and single-host deployments, providing a consistent environment across various stages of the application lifecycle. However, it is limited to working within the Docker ecosystem, as it only deploys on Docker Engine, making it an ideal choice for those heavily invested in Docker-based workflows. Find out more.

Derivation Rules

We use the following derivation rules to assess deployment qualities.

  1. (Critical) Custom module vs battle-proven module
  2. (Critical) Imperative vs declarative technology
  3. (Critical) Imperative flow of declarative tasks vs pure declarative tasks (e.g., Ansible Playbook Tasks vs Terraform Module)
  4. Generic vs specialized/ native technology, e.g., Ansible vs Docker to start docker container (up to date modules, bug fixes ...)
  5. Depth of technology toolchain
  6. Number of workarounds
  7. Number of tasks/ resources/ artifacts/ manifests to be defined
  8. Length of the template
  9. Usage of deprecated or not recommended features
  10. More specialized node type, e.g., software.application vs service.application.

Component "docker.engine"

The following scenarios deploy a node template of node type docker.engine with various hosting stacks, artifacts, deployment technologies, and qualities.

Scenario #1

In this scenario, the node template "component" of node type docker.engine is deployed. The node template is hosted on the node template "host 1" of node type local.machine.

component(docker.engine)host 1(local.machine)host

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #2

In this scenario, the node template "component" of node type docker.engine is deployed. The node template is hosted on the node template "host 1" of node type remote.machine.

component(docker.engine)host 1(remote.machine)host

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Component "gcp.service"

The following scenarios deploy a node template of node type gcp.service with various hosting stacks, artifacts, deployment technologies, and qualities.

Scenario #1

In this scenario, the node template "component" of node type gcp.service is deployed. The scenario does not require a specific hosting.

component(gcp.service)

Ansible (Quality: 1)

Ansible provides a declarative module

Terraform (Quality: 1)

Terraform provides a declarative module.

Component "ingress"

The following scenarios deploy a node template of node type ingress with various hosting stacks, artifacts, deployment technologies, and qualities.

Scenario #1

In this scenario, the node template "component" of node type ingress is deployed. The node template is hosted on the node template "host 1" of node type kubernetes.cluster.

component(ingress)host 1(kubernetes.cluster)host

Ansible (Quality: 0.5)

Kubernetes is more specialized.

Kubernetes (Quality: 1)

Kubernetes is the underlying technology.

Terraform (Quality: 0.5)

Kubernetes is more specialized.

Scenario #2

In this scenario, the node template "component" of node type ingress is deployed. The node template is hosted on the node template "host 1" of node type local.machine.

component(ingress)host 1(local.machine)host

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #3

In this scenario, the node template "component" of node type ingress is deployed. The node template is hosted on the node template "host 1" of node type remote.machine.

component(ingress)host 1(remote.machine)host

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Component "mysql.database"

The following scenarios deploy a node template of node type mysql.database with various hosting stacks, artifacts, deployment technologies, and qualities.

Scenario #1

In this scenario, the node template "component" of node type mysql.database is deployed. The node template is hosted on the node template "host 1" of node type mysql.dbms, which is hosted on the node template "host 2" of node type docker.engine, which is hosted on the node template "host 3" of node type local.machine.

component(mysql.database)host 1(mysql.dbms)host 2(docker.engine)host 3(local.machine)hosthosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Docker Compose (Quality: 0)

One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.

Terraform (Quality: 1)

Terraform provides a declarative module.

Scenario #2

In this scenario, the node template "component" of node type mysql.database is deployed. The node template is hosted on the node template "host 1" of node type mysql.dbms, which is hosted on the node template "host 2" of node type docker.engine, which is hosted on the node template "host 3" of node type remote.machine.

component(mysql.database)host 1(mysql.dbms)host 2(docker.engine)host 3(remote.machine)hosthosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Docker Compose (Quality: 0)

One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.

Terraform (Quality: 0.5)

Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.

Scenario #3

In this scenario, the node template "component" of node type mysql.database is deployed. The node template is hosted on the node template "host 1" of node type mysql.dbms, which is hosted on the node template "host 2" of node type gcp.cloudsql.

component(mysql.database)host 1(mysql.dbms)host 2(gcp.cloudsql)hosthost

Ansible (Quality: 0.5)

Primary use case due to the specialization of Ansible. However, need to install and handle GCP CloudSQL Proxy, while the corresponding Terraform module already provides this.

Terraform (Quality: 1)

Terraform provides a declarative module.

Scenario #4

In this scenario, the node template "component" of node type mysql.database is deployed. The node template is hosted on the node template "host 1" of node type mysql.dbms, which is hosted on the node template "host 2" of node type kubernetes.cluster.

component(mysql.database)host 1(mysql.dbms)host 2(kubernetes.cluster)hosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Kubernetes (Quality: 0)

Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.

Terraform (Quality: 0)

Ansible is more specialized.

Scenario #5

In this scenario, the node template "component" of node type mysql.database is deployed. The node template is hosted on the node template "host 1" of node type mysql.dbms, which is hosted on the node template "host 2" of node type local.machine.

component(mysql.database)host 1(mysql.dbms)host 2(local.machine)hosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 1)

Terraform provides a declarative module.

Scenario #6

In this scenario, the node template "component" of node type mysql.database is deployed. The node template is hosted on the node template "host 1" of node type mysql.dbms, which is hosted on the node template "host 2" of node type remote.machine.

component(mysql.database)host 1(mysql.dbms)host 2(remote.machine)hosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 0.5)

Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.

Component "mysql.dbms"

The following scenarios deploy a node template of node type mysql.dbms with various hosting stacks, artifacts, deployment technologies, and qualities.

Scenario #1

In this scenario, the node template "component" of node type mysql.dbms is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type dbms.image. The node template is hosted on the node template "host 1" of node type docker.engine, which is hosted on the node template "host 2" of node type local.machine.

component(mysql.dbms)artifact(dbms.image)host 1(docker.engine)host 2(local.machine)hosthost

Ansible (Quality: 0.5)

Docker Compose is more specialized

Docker Compose (Quality: 1)

Docker is the underlying technology.

Terraform (Quality: 0.5)

Docker Compose is more specialized.

Scenario #2

In this scenario, the node template "component" of node type mysql.dbms is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type dbms.image. The node template is hosted on the node template "host 1" of node type docker.engine, which is hosted on the node template "host 2" of node type remote.machine.

component(mysql.dbms)artifact(dbms.image)host 1(docker.engine)host 2(remote.machine)hosthost

Ansible (Quality: 0.5)

Docker Compose is more specialized

Docker Compose (Quality: 1)

Docker is the underlying technology.

Terraform (Quality: 0.5)

Docker Compose is more specialized.

Scenario #3

In this scenario, the node template "component" of node type mysql.dbms is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type dbms.image. The node template is hosted on the node template "host 1" of node type gcp.cloudsql.

component(mysql.dbms)artifact(dbms.image)host 1(gcp.cloudsql)host

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 1)

Terraform provides a declarative module.

Scenario #4

In this scenario, the node template "component" of node type mysql.dbms is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type dbms.image. The node template is hosted on the node template "host 1" of node type kubernetes.cluster.

component(mysql.dbms)artifact(dbms.image)host 1(kubernetes.cluster)host

Ansible (Quality: 0.5)

Kubernetes is more specialized.

Kubernetes (Quality: 1)

Kubernetes is the underlying technology.

Terraform (Quality: 0.5)

Kubernetes is more specialized.

Scenario #5

In this scenario, the node template "component" of node type mysql.dbms is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type dbms.image. The node template is hosted on the node template "host 1" of node type local.machine.

component(mysql.dbms)artifact(dbms.image)host 1(local.machine)host

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #6

In this scenario, the node template "component" of node type mysql.dbms is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type dbms.image. The node template is hosted on the node template "host 1" of node type remote.machine.

component(mysql.dbms)artifact(dbms.image)host 1(remote.machine)host

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Component "object.storage"

The following scenarios deploy a node template of node type object.storage with various hosting stacks, artifacts, deployment technologies, and qualities.

Scenario #1

In this scenario, the node template "component" of node type object.storage is deployed. The node template is hosted on the node template "host 1" of node type gcp.cloudstorage.

component(object.storage)host 1(gcp.cloudstorage)host

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 1)

Terraform provides a declarative module.

Scenario #2

In this scenario, the node template "component" of node type object.storage is deployed. The node template is hosted on the node template "host 1" of node type minio.server, which is hosted on the node template "host 2" of node type docker.engine, which is hosted on the node template "host 3" of node type local.machine.

component(object.storage)host 1(minio.server)host 2(docker.engine)host 3(local.machine)hosthosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Docker Compose (Quality: 0)

One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.

Terraform (Quality: 1)

Terraform provides a declarative module.

Scenario #3

In this scenario, the node template "component" of node type object.storage is deployed. The node template is hosted on the node template "host 1" of node type minio.server, which is hosted on the node template "host 2" of node type docker.engine, which is hosted on the node template "host 3" of node type remote.machine.

component(object.storage)host 1(minio.server)host 2(docker.engine)host 3(remote.machine)hosthosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Docker Compose (Quality: 0)

One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.

Terraform (Quality: 0.5)

Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.

Scenario #4

In this scenario, the node template "component" of node type object.storage is deployed. The node template is hosted on the node template "host 1" of node type minio.server, which is hosted on the node template "host 2" of node type kubernetes.cluster.

component(object.storage)host 1(minio.server)host 2(kubernetes.cluster)hosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Kubernetes (Quality: 0)

Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.

Terraform (Quality: 0)

Ansible is more specialized.

Component "redis.server"

The following scenarios deploy a node template of node type redis.server with various hosting stacks, artifacts, deployment technologies, and qualities.

Scenario #1

In this scenario, the node template "component" of node type redis.server is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type cache.image. The node template is hosted on the node template "host 1" of node type docker.engine, which is hosted on the node template "host 2" of node type local.machine.

component(redis.server)artifact(cache.image)host 1(docker.engine)host 2(local.machine)hosthost

Ansible (Quality: 0.5)

Docker Compose is more specialized.

Docker Compose (Quality: 1)

Docker is the underlying technology.

Terraform (Quality: 0.5)

Docker Compose is more specialized.

Scenario #2

In this scenario, the node template "component" of node type redis.server is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type cache.image. The node template is hosted on the node template "host 1" of node type docker.engine, which is hosted on the node template "host 2" of node type remote.machine.

component(redis.server)artifact(cache.image)host 1(docker.engine)host 2(remote.machine)hosthost

Ansible (Quality: 0.5)

Docker Compose is more specialized.

Docker Compose (Quality: 1)

Docker is the underlying technology.

Terraform (Quality: 0.5)

Docker Compose is more specialized.

Scenario #3

In this scenario, the node template "component" of node type redis.server is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type cache.image. The node template is hosted on the node template "host 1" of node type gcp.memorystore.

component(redis.server)artifact(cache.image)host 1(gcp.memorystore)host

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 1)

Terraform provides a declarative module.

Scenario #4

In this scenario, the node template "component" of node type redis.server is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type cache.image. The node template is hosted on the node template "host 1" of node type kubernetes.cluster.

component(redis.server)artifact(cache.image)host 1(kubernetes.cluster)host

Ansible (Quality: 0.5)

Kubernetes is more specialized.

Kubernetes (Quality: 1)

Kubernetes is the underlying technology.

Terraform (Quality: 0.5)

Kubernetes is more specialized.

Component "service.application"

The following scenarios deploy a node template of node type service.application with various hosting stacks, artifacts, deployment technologies, and qualities.

Scenario #1

In this scenario, the node template "component" of node type service.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type docker.image. The node template is hosted on the node template "host 1" of node type docker.engine, which is hosted on the node template "host 2" of node type local.machine.

component(service.application)artifact(docker.image)host 1(docker.engine)host 2(local.machine)hosthost

Ansible (Quality: 0.5)

Docker Compose is more specialized.

Docker Compose (Quality: 1)

Docker is the underlying technology.

Terraform (Quality: 0.5)

Docker Compose is more specialized.

Scenario #2

In this scenario, the node template "component" of node type service.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type docker.image. The node template is hosted on the node template "host 1" of node type docker.engine, which is hosted on the node template "host 2" of node type remote.machine.

component(service.application)artifact(docker.image)host 1(docker.engine)host 2(remote.machine)hosthost

Ansible (Quality: 0.5)

Docker Compose is more specialized.

Docker Compose (Quality: 1)

Docker is the underlying technology.

Terraform (Quality: 0.5)

Docker Compose is more specialized.

Scenario #3

In this scenario, the node template "component" of node type service.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type docker.image. The node template is hosted on the node template "host 1" of node type gcp.cloudrun.

component(service.application)artifact(docker.image)host 1(gcp.cloudrun)host

Ansible (Quality: 0)

Custom module with imperative parts, while Terraform provides a declarative module.

Terraform (Quality: 1)

Terraform provides a declarative module.

Scenario #4

In this scenario, the node template "component" of node type service.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type docker.image. The node template is hosted on the node template "host 1" of node type kubernetes.cluster.

component(service.application)artifact(docker.image)host 1(kubernetes.cluster)host

Ansible (Quality: 0.5)

Kubernetes is more specialized.

Kubernetes (Quality: 1)

Kubernetes is the underlying technology.

Terraform (Quality: 0.5)

Kubernetes is more specialized.

Scenario #5

In this scenario, the node template "component" of node type service.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type tar.archive. The node template is hosted on an arbitrary hosting stack of arbitrary length, which is hosted on the node template "host 2" of node type local.machine.

component(service.application)artifact(tar.archive)...host 2(local.machine)hosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible. Special integration for systemd.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #6

In this scenario, the node template "component" of node type service.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type tar.archive. The node template is hosted on an arbitrary hosting stack of arbitrary length, which is hosted on the node template "host 2" of node type remote.machine.

component(service.application)artifact(tar.archive)...host 2(remote.machine)hosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible. Special integration for systemd.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #7

In this scenario, the node template "component" of node type service.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type zip.archive. The node template is hosted on an arbitrary hosting stack of arbitrary length, which is hosted on the node template "host 2" of node type local.machine.

component(service.application)artifact(zip.archive)...host 2(local.machine)hosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible. Special integration for systemd.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #8

In this scenario, the node template "component" of node type service.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type zip.archive. The node template is hosted on an arbitrary hosting stack of arbitrary length, which is hosted on the node template "host 2" of node type remote.machine.

component(service.application)artifact(zip.archive)...host 2(remote.machine)hosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible. Special integration for systemd.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #9

In this scenario, the node template "component" of node type service.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type zip.archive. The node template is hosted on the node template "host 1" of node type gcp.appengine.

component(service.application)artifact(zip.archive)host 1(gcp.appengine)host

Ansible (Quality: 0)

Custom module with imperative parts, while Terraform provides a declarative module.

Terraform (Quality: 1)

Terraform provides a declarative module.

Component "software.application"

The following scenarios deploy a node template of node type software.application with various hosting stacks, artifacts, deployment technologies, and qualities.

Scenario #1

In this scenario, the node template "component" of node type software.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type apt.package. The node template is hosted on an arbitrary hosting stack of arbitrary length, which is hosted on the node template "host 2" of node type local.machine.

component(software.application)artifact(apt.package)...host 2(local.machine)hosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #2

In this scenario, the node template "component" of node type software.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type apt.package. The node template is hosted on an arbitrary hosting stack of arbitrary length, which is hosted on the node template "host 2" of node type remote.machine.

component(software.application)artifact(apt.package)...host 2(remote.machine)hosthost

Ansible (Quality: 1)

Primary use case due to the specialization of Ansible.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #3

In this scenario, the node template "component" of node type software.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type tar.archive. The node template is hosted on an arbitrary hosting stack of arbitrary length, which is hosted on the node template "host 2" of node type local.machine.

component(software.application)artifact(tar.archive)...host 2(local.machine)hosthost

Ansible (Quality: 0.5)

While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #4

In this scenario, the node template "component" of node type software.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type tar.archive. The node template is hosted on an arbitrary hosting stack of arbitrary length, which is hosted on the node template "host 2" of node type remote.machine.

component(software.application)artifact(tar.archive)...host 2(remote.machine)hosthost

Ansible (Quality: 0.5)

While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., "service.application".

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #5

In this scenario, the node template "component" of node type software.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type zip.archive. The node template is hosted on an arbitrary hosting stack of arbitrary length, which is hosted on the node template "host 2" of node type local.machine.

component(software.application)artifact(zip.archive)...host 2(local.machine)hosthost

Ansible (Quality: 0.5)

While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Scenario #6

In this scenario, the node template "component" of node type software.application is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type zip.archive. The node template is hosted on an arbitrary hosting stack of arbitrary length, which is hosted on the node template "host 2" of node type remote.machine.

component(software.application)artifact(zip.archive)...host 2(remote.machine)hosthost

Ansible (Quality: 0.5)

While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.

Terraform (Quality: 0)

Ansible is more specialized. Also using provisioners is a "last resort".

Component "virtual.machine"

The following scenarios deploy a node template of node type virtual.machine with various hosting stacks, artifacts, deployment technologies, and qualities.

Scenario #1

In this scenario, the node template "component" of node type virtual.machine is deployed. This node template is implemented by its deployment artifact "artifact" of artifact type machine.image. The node template is hosted on the node template "host 1" of node type openstack.provider.

component(virtual.machine)artifact(machine.image)host 1(openstack.provider)host

Ansible (Quality: 0.5)

Terraform is more specialized.

Terraform (Quality: 1)

Terraform provides a declarative module.

Appendix A "Rules"

This appendix contains the deployment technology rules.

Rule #1

Attribute Value
Identifier docker.engine::ansible@local.machine
Component docker.engine
Technology ansible
Hosting local.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details "ansible.builtin.shell", "ansible.builtin.group", and "ansible.builtin.user" tasks
Graph
component(docker.engine)host 1(local.machine)host

Rule #2

Attribute Value
Identifier docker.engine::terraform@local.machine
Component docker.engine
Technology terraform
Hosting local.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "local-exec" provider
Graph
component(docker.engine)host 1(local.machine)host

Rule #3

Attribute Value
Identifier docker.engine::ansible@remote.machine
Component docker.engine
Technology ansible
Hosting remote.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details "ansible.builtin.shell", "ansible.builtin.group", and "ansible.builtin.user" tasks
Graph
component(docker.engine)host 1(remote.machine)host

Rule #4

Attribute Value
Identifier docker.engine::terraform@remote.machine
Component docker.engine
Technology terraform
Hosting remote.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "remote-exec" provider
Graph
component(docker.engine)host 1(remote.machine)host

Rule #5

Attribute Value
Identifier gcp.service::ansible
Component gcp.service
Technology ansible
Quality 1
Reason Ansible provides a declarative module
Details "google.cloud.gcp_serviceusage_service" task
Graph
component(gcp.service)

Rule #6

Attribute Value
Identifier gcp.service::terraform
Component gcp.service
Technology terraform
Quality 1
Reason Terraform provides a declarative module.
Details "google_project_service" resource
Graph
component(gcp.service)

Rule #7

Attribute Value
Identifier ingress::ansible@kubernetes.cluster
Component ingress
Technology ansible
Hosting kubernetes.cluster
Quality 0.5
Reason Kubernetes is more specialized.
Details "kubernetes.core.k8s" task
Graph
component(ingress)host 1(kubernetes.cluster)host

Rule #8

Attribute Value
Identifier ingress::kubernetes@kubernetes.cluster
Component ingress
Technology kubernetes
Hosting kubernetes.cluster
Quality 1
Reason Kubernetes is the underlying technology.
Details Kubernetes manifest generated and applied
Graph
component(ingress)host 1(kubernetes.cluster)host

Rule #9

Attribute Value
Identifier ingress::terraform@kubernetes.cluster
Component ingress
Technology terraform
Hosting kubernetes.cluster
Quality 0.5
Reason Kubernetes is more specialized.
Details "kubernetes_service_v1" resource
Graph
component(ingress)host 1(kubernetes.cluster)host

Rule #10

Attribute Value
Identifier ingress::ansible@local.machine
Component ingress
Technology ansible
Hosting local.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details "ansible.builtin.apt_key", "ansible.builtin.apt_repository", "ansible.builtin.apt", "ansible.builtin.copy", and "ansible.builtin.systemd" tasks
Graph
component(ingress)host 1(local.machine)host

Rule #11

Attribute Value
Identifier ingress::terraform@local.machine
Component ingress
Technology terraform
Hosting local.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "local_file" resource to create the installation script and "terraform_data" to execute the script using the "local-exec" provisioner
Graph
component(ingress)host 1(local.machine)host

Rule #12

Attribute Value
Identifier ingress::ansible@remote.machine
Component ingress
Technology ansible
Hosting remote.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details "ansible.builtin.apt_key", "ansible.builtin.apt_repository", "ansible.builtin.apt", "ansible.builtin.copy", and "ansible.builtin.systemd" tasks
Graph
component(ingress)host 1(remote.machine)host

Rule #13

Attribute Value
Identifier ingress::terraform@remote.machine
Component ingress
Technology terraform
Hosting remote.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "terraform_data" resource with an "ssh" connection to the virtual machine to copy the install script using the "file" provisioner on the virtual machine and to execute the script using the "remote-exec" provisioner
Graph
component(ingress)host 1(remote.machine)host

Rule #14

Attribute Value
Identifier mysql.database::ansible@mysql.dbms->docker.engine->local.machine
Component mysql.database
Technology ansible
Hosting mysql.dbms -> docker.engine -> local.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(docker.engine)host 3(local.machine)hosthosthost

Rule #15

Attribute Value
Identifier mysql.database::compose@mysql.dbms->docker.engine->local.machine
Component mysql.database
Technology compose
Hosting mysql.dbms -> docker.engine -> local.machine
Quality 0
Reason One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(docker.engine)host 3(local.machine)hosthosthost

Rule #16

Attribute Value
Identifier mysql.database::terraform@mysql.dbms->docker.engine->local.machine
Component mysql.database
Technology terraform
Hosting mysql.dbms -> docker.engine -> local.machine
Quality 1
Reason Terraform provides a declarative module.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(docker.engine)host 3(local.machine)hosthosthost

Rule #17

Attribute Value
Identifier mysql.database::ansible@mysql.dbms->docker.engine->remote.machine
Component mysql.database
Technology ansible
Hosting mysql.dbms -> docker.engine -> remote.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(docker.engine)host 3(remote.machine)hosthosthost

Rule #18

Attribute Value
Identifier mysql.database::compose@mysql.dbms->docker.engine->remote.machine
Component mysql.database
Technology compose
Hosting mysql.dbms -> docker.engine -> remote.machine
Quality 0
Reason One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(docker.engine)host 3(remote.machine)hosthosthost

Rule #19

Attribute Value
Identifier mysql.database::terraform@mysql.dbms->docker.engine->remote.machine
Component mysql.database
Technology terraform
Hosting mysql.dbms -> docker.engine -> remote.machine
Quality 0.5
Reason Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(docker.engine)host 3(remote.machine)hosthosthost

Rule #20

Attribute Value
Identifier mysql.database::ansible@mysql.dbms->gcp.cloudsql
Component mysql.database
Technology ansible
Hosting mysql.dbms -> gcp.cloudsql
Quality 0.5
Reason Primary use case due to the specialization of Ansible. However, need to install and handle GCP CloudSQL Proxy, while the corresponding Terraform module already provides this.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(gcp.cloudsql)hosthost

Rule #21

Attribute Value
Identifier mysql.database::terraform@mysql.dbms->gcp.cloudsql
Component mysql.database
Technology terraform
Hosting mysql.dbms -> gcp.cloudsql
Quality 1
Reason Terraform provides a declarative module.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(gcp.cloudsql)hosthost

Rule #22

Attribute Value
Identifier mysql.database::ansible@mysql.dbms->kubernetes.cluster
Component mysql.database
Technology ansible
Hosting mysql.dbms -> kubernetes.cluster
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(kubernetes.cluster)hosthost

Rule #23

Attribute Value
Identifier mysql.database::kubernetes@mysql.dbms->kubernetes.cluster
Component mysql.database
Technology kubernetes
Hosting mysql.dbms -> kubernetes.cluster
Quality 0
Reason Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(kubernetes.cluster)hosthost

Rule #24

Attribute Value
Identifier mysql.database::terraform@mysql.dbms->kubernetes.cluster
Component mysql.database
Technology terraform
Hosting mysql.dbms -> kubernetes.cluster
Quality 0
Reason Ansible is more specialized.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(kubernetes.cluster)hosthost

Rule #25

Attribute Value
Identifier mysql.database::ansible@mysql.dbms->local.machine
Component mysql.database
Technology ansible
Hosting mysql.dbms -> local.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(local.machine)hosthost

Rule #26

Attribute Value
Identifier mysql.database::terraform@mysql.dbms->local.machine
Component mysql.database
Technology terraform
Hosting mysql.dbms -> local.machine
Quality 1
Reason Terraform provides a declarative module.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(local.machine)hosthost

Rule #27

Attribute Value
Identifier mysql.database::ansible@mysql.dbms->remote.machine
Component mysql.database
Technology ansible
Hosting mysql.dbms -> remote.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(remote.machine)hosthost

Rule #28

Attribute Value
Identifier mysql.database::terraform@mysql.dbms->remote.machine
Component mysql.database
Technology terraform
Hosting mysql.dbms -> remote.machine
Quality 0.5
Reason Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.
Details
Graph
component(mysql.database)host 1(mysql.dbms)host 2(remote.machine)hosthost

Rule #29

Attribute Value
Identifier mysql.dbms#dbms.image::ansible@docker.engine->local.machine
Component mysql.dbms
Artifact dbms.image
Technology ansible
Hosting docker.engine -> local.machine
Quality 0.5
Reason Docker Compose is more specialized
Details "community.docker.docker_container" task
Graph
component(mysql.dbms)artifact(dbms.image)host 1(docker.engine)host 2(local.machine)hosthost

Rule #30

Attribute Value
Identifier mysql.dbms#dbms.image::compose@docker.engine->local.machine
Component mysql.dbms
Artifact dbms.image
Technology compose
Hosting docker.engine -> local.machine
Quality 1
Reason Docker is the underlying technology.
Details docker-compose manifest generated and applied
Graph
component(mysql.dbms)artifact(dbms.image)host 1(docker.engine)host 2(local.machine)hosthost

Rule #31

Attribute Value
Identifier mysql.dbms#dbms.image::terraform@docker.engine->local.machine
Component mysql.dbms
Artifact dbms.image
Technology terraform
Hosting docker.engine -> local.machine
Quality 0.5
Reason Docker Compose is more specialized.
Details "docker_container" and "docker_image" resources
Graph
component(mysql.dbms)artifact(dbms.image)host 1(docker.engine)host 2(local.machine)hosthost

Rule #32

Attribute Value
Identifier mysql.dbms#dbms.image::ansible@docker.engine->remote.machine
Component mysql.dbms
Artifact dbms.image
Technology ansible
Hosting docker.engine -> remote.machine
Quality 0.5
Reason Docker Compose is more specialized
Details "community.docker.docker_container" task
Graph
component(mysql.dbms)artifact(dbms.image)host 1(docker.engine)host 2(remote.machine)hosthost

Rule #33

Attribute Value
Identifier mysql.dbms#dbms.image::compose@docker.engine->remote.machine
Component mysql.dbms
Artifact dbms.image
Technology compose
Hosting docker.engine -> remote.machine
Quality 1
Reason Docker is the underlying technology.
Details docker-compose manifest generated and applied
Graph
component(mysql.dbms)artifact(dbms.image)host 1(docker.engine)host 2(remote.machine)hosthost

Rule #34

Attribute Value
Identifier mysql.dbms#dbms.image::terraform@docker.engine->remote.machine
Component mysql.dbms
Artifact dbms.image
Technology terraform
Hosting docker.engine -> remote.machine
Quality 0.5
Reason Docker Compose is more specialized.
Details "docker_container" and "docker_image" resources
Graph
component(mysql.dbms)artifact(dbms.image)host 1(docker.engine)host 2(remote.machine)hosthost

Rule #35

Attribute Value
Identifier mysql.dbms#dbms.image::ansible@gcp.cloudsql
Component mysql.dbms
Artifact dbms.image
Technology ansible
Hosting gcp.cloudsql
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details "google.cloud.gcp_sql_instance" and "google.cloud.gcp_sql_user" tasks
Graph
component(mysql.dbms)artifact(dbms.image)host 1(gcp.cloudsql)host

Rule #36

Attribute Value
Identifier mysql.dbms#dbms.image::terraform@gcp.cloudsql
Component mysql.dbms
Artifact dbms.image
Technology terraform
Hosting gcp.cloudsql
Quality 1
Reason Terraform provides a declarative module.
Details "google_sql_database_instance" and "google_sql_user" resources
Graph
component(mysql.dbms)artifact(dbms.image)host 1(gcp.cloudsql)host

Rule #37

Attribute Value
Identifier mysql.dbms#dbms.image::ansible@kubernetes.cluster
Component mysql.dbms
Artifact dbms.image
Technology ansible
Hosting kubernetes.cluster
Quality 0.5
Reason Kubernetes is more specialized.
Details "kubernetes.core.k8s" tasks
Graph
component(mysql.dbms)artifact(dbms.image)host 1(kubernetes.cluster)host

Rule #38

Attribute Value
Identifier mysql.dbms#dbms.image::kubernetes@kubernetes.cluster
Component mysql.dbms
Artifact dbms.image
Technology kubernetes
Hosting kubernetes.cluster
Quality 1
Reason Kubernetes is the underlying technology.
Details Kubernetes manifest generated and applied
Graph
component(mysql.dbms)artifact(dbms.image)host 1(kubernetes.cluster)host

Rule #39

Attribute Value
Identifier mysql.dbms#dbms.image::terraform@kubernetes.cluster
Component mysql.dbms
Artifact dbms.image
Technology terraform
Hosting kubernetes.cluster
Quality 0.5
Reason Kubernetes is more specialized.
Details "kubernetes_deployment_v1" and "kubernetes_service_v1" resources
Graph
component(mysql.dbms)artifact(dbms.image)host 1(kubernetes.cluster)host

Rule #40

Attribute Value
Identifier mysql.dbms#dbms.image::ansible@local.machine
Component mysql.dbms
Artifact dbms.image
Technology ansible
Hosting local.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details "ansible.builtin.apt", "ansible.builtin.systemd", "ansible.builtin.copy", "ansible.builtin.lineinfile", and "community.mysql.mysql_user" tasks
Graph
component(mysql.dbms)artifact(dbms.image)host 1(local.machine)host

Rule #41

Attribute Value
Identifier mysql.dbms#dbms.image::terraform@local.machine
Component mysql.dbms
Artifact dbms.image
Technology terraform
Hosting local.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "local_file" resource to create the installation script and "terraform_data" to execute the script using the "local-exec" provisioner
Graph
component(mysql.dbms)artifact(dbms.image)host 1(local.machine)host

Rule #42

Attribute Value
Identifier mysql.dbms#dbms.image::ansible@remote.machine
Component mysql.dbms
Artifact dbms.image
Technology ansible
Hosting remote.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details "ansible.builtin.apt", "ansible.builtin.systemd", "ansible.builtin.copy", "ansible.builtin.lineinfile", and "community.mysql.mysql_user" tasks
Graph
component(mysql.dbms)artifact(dbms.image)host 1(remote.machine)host

Rule #43

Attribute Value
Identifier mysql.dbms#dbms.image::terraform@remote.machine
Component mysql.dbms
Artifact dbms.image
Technology terraform
Hosting remote.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "terraform_data" resource with an "ssh" connection to the virtual machine to copy the install script using the "file" provisioner on the virtual machine and to execute the script using the "remote-exec" provisioner
Graph
component(mysql.dbms)artifact(dbms.image)host 1(remote.machine)host

Rule #44

Attribute Value
Identifier object.storage::ansible@gcp.cloudstorage
Component object.storage
Technology ansible
Hosting gcp.cloudstorage
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details
Graph
component(object.storage)host 1(gcp.cloudstorage)host

Rule #45

Attribute Value
Identifier object.storage::terraform@gcp.cloudstorage
Component object.storage
Technology terraform
Hosting gcp.cloudstorage
Quality 1
Reason Terraform provides a declarative module.
Details
Graph
component(object.storage)host 1(gcp.cloudstorage)host

Rule #46

Attribute Value
Identifier object.storage::ansible@minio.server->docker.engine->local.machine
Component object.storage
Technology ansible
Hosting minio.server -> docker.engine -> local.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details
Graph
component(object.storage)host 1(minio.server)host 2(docker.engine)host 3(local.machine)hosthosthost

Rule #47

Attribute Value
Identifier object.storage::compose@minio.server->docker.engine->local.machine
Component object.storage
Technology compose
Hosting minio.server -> docker.engine -> local.machine
Quality 0
Reason One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
Details
Graph
component(object.storage)host 1(minio.server)host 2(docker.engine)host 3(local.machine)hosthosthost

Rule #48

Attribute Value
Identifier object.storage::terraform@minio.server->docker.engine->local.machine
Component object.storage
Technology terraform
Hosting minio.server -> docker.engine -> local.machine
Quality 1
Reason Terraform provides a declarative module.
Details
Graph
component(object.storage)host 1(minio.server)host 2(docker.engine)host 3(local.machine)hosthosthost

Rule #49

Attribute Value
Identifier object.storage::ansible@minio.server->docker.engine->remote.machine
Component object.storage
Technology ansible
Hosting minio.server -> docker.engine -> remote.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details
Graph
component(object.storage)host 1(minio.server)host 2(docker.engine)host 3(remote.machine)hosthosthost

Rule #50

Attribute Value
Identifier object.storage::compose@minio.server->docker.engine->remote.machine
Component object.storage
Technology compose
Hosting minio.server -> docker.engine -> remote.machine
Quality 0
Reason One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
Details
Graph
component(object.storage)host 1(minio.server)host 2(docker.engine)host 3(remote.machine)hosthosthost

Rule #51

Attribute Value
Identifier object.storage::terraform@minio.server->docker.engine->remote.machine
Component object.storage
Technology terraform
Hosting minio.server -> docker.engine -> remote.machine
Quality 0.5
Reason Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.
Details
Graph
component(object.storage)host 1(minio.server)host 2(docker.engine)host 3(remote.machine)hosthosthost

Rule #52

Attribute Value
Identifier object.storage::ansible@minio.server->kubernetes.cluster
Component object.storage
Technology ansible
Hosting minio.server -> kubernetes.cluster
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details
Graph
component(object.storage)host 1(minio.server)host 2(kubernetes.cluster)hosthost

Rule #53

Attribute Value
Identifier object.storage::kubernetes@minio.server->kubernetes.cluster
Component object.storage
Technology kubernetes
Hosting minio.server -> kubernetes.cluster
Quality 0
Reason Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.
Details
Graph
component(object.storage)host 1(minio.server)host 2(kubernetes.cluster)hosthost

Rule #54

Attribute Value
Identifier object.storage::terraform@minio.server->kubernetes.cluster
Component object.storage
Technology terraform
Hosting minio.server -> kubernetes.cluster
Quality 0
Reason Ansible is more specialized.
Details
Graph
component(object.storage)host 1(minio.server)host 2(kubernetes.cluster)hosthost

Rule #55

Attribute Value
Identifier redis.server#cache.image::ansible@docker.engine->local.machine
Component redis.server
Artifact cache.image
Technology ansible
Hosting docker.engine -> local.machine
Quality 0.5
Reason Docker Compose is more specialized.
Details "community.docker.docker_container" task
Graph
component(redis.server)artifact(cache.image)host 1(docker.engine)host 2(local.machine)hosthost

Rule #56

Attribute Value
Identifier redis.server#cache.image::compose@docker.engine->local.machine
Component redis.server
Artifact cache.image
Technology compose
Hosting docker.engine -> local.machine
Quality 1
Reason Docker is the underlying technology.
Details docker compose manifest generated and applied
Graph
component(redis.server)artifact(cache.image)host 1(docker.engine)host 2(local.machine)hosthost

Rule #57

Attribute Value
Identifier redis.server#cache.image::terraform@docker.engine->local.machine
Component redis.server
Artifact cache.image
Technology terraform
Hosting docker.engine -> local.machine
Quality 0.5
Reason Docker Compose is more specialized.
Details "docker_container" and "docker_image" resources
Graph
component(redis.server)artifact(cache.image)host 1(docker.engine)host 2(local.machine)hosthost

Rule #58

Attribute Value
Identifier redis.server#cache.image::ansible@docker.engine->remote.machine
Component redis.server
Artifact cache.image
Technology ansible
Hosting docker.engine -> remote.machine
Quality 0.5
Reason Docker Compose is more specialized.
Details "community.docker.docker_container" task
Graph
component(redis.server)artifact(cache.image)host 1(docker.engine)host 2(remote.machine)hosthost

Rule #59

Attribute Value
Identifier redis.server#cache.image::compose@docker.engine->remote.machine
Component redis.server
Artifact cache.image
Technology compose
Hosting docker.engine -> remote.machine
Quality 1
Reason Docker is the underlying technology.
Details docker compose manifest generated and applied
Graph
component(redis.server)artifact(cache.image)host 1(docker.engine)host 2(remote.machine)hosthost

Rule #60

Attribute Value
Identifier redis.server#cache.image::terraform@docker.engine->remote.machine
Component redis.server
Artifact cache.image
Technology terraform
Hosting docker.engine -> remote.machine
Quality 0.5
Reason Docker Compose is more specialized.
Details "docker_container" and "docker_image" resources
Graph
component(redis.server)artifact(cache.image)host 1(docker.engine)host 2(remote.machine)hosthost

Rule #61

Attribute Value
Identifier redis.server#cache.image::ansible@gcp.memorystore
Component redis.server
Artifact cache.image
Technology ansible
Hosting gcp.memorystore
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details
Graph
component(redis.server)artifact(cache.image)host 1(gcp.memorystore)host

Rule #62

Attribute Value
Identifier redis.server#cache.image::terraform@gcp.memorystore
Component redis.server
Artifact cache.image
Technology terraform
Hosting gcp.memorystore
Quality 1
Reason Terraform provides a declarative module.
Details
Graph
component(redis.server)artifact(cache.image)host 1(gcp.memorystore)host

Rule #63

Attribute Value
Identifier redis.server#cache.image::ansible@kubernetes.cluster
Component redis.server
Artifact cache.image
Technology ansible
Hosting kubernetes.cluster
Quality 0.5
Reason Kubernetes is more specialized.
Details
Graph
component(redis.server)artifact(cache.image)host 1(kubernetes.cluster)host

Rule #64

Attribute Value
Identifier redis.server#cache.image::kubernetes@kubernetes.cluster
Component redis.server
Artifact cache.image
Technology kubernetes
Hosting kubernetes.cluster
Quality 1
Reason Kubernetes is the underlying technology.
Details Kubernetes manifest generated and applied
Graph
component(redis.server)artifact(cache.image)host 1(kubernetes.cluster)host

Rule #65

Attribute Value
Identifier redis.server#cache.image::terraform@kubernetes.cluster
Component redis.server
Artifact cache.image
Technology terraform
Hosting kubernetes.cluster
Quality 0.5
Reason Kubernetes is more specialized.
Details
Graph
component(redis.server)artifact(cache.image)host 1(kubernetes.cluster)host

Rule #66

Attribute Value
Identifier service.application#docker.image::ansible@docker.engine->local.machine
Component service.application
Artifact docker.image
Technology ansible
Hosting docker.engine -> local.machine
Quality 0.5
Reason Docker Compose is more specialized.
Details "community.docker.docker_container" task
Graph
component(service.application)artifact(docker.image)host 1(docker.engine)host 2(local.machine)hosthost

Rule #67

Attribute Value
Identifier service.application#docker.image::compose@docker.engine->local.machine
Component service.application
Artifact docker.image
Technology compose
Hosting docker.engine -> local.machine
Quality 1
Reason Docker is the underlying technology.
Details docker compose manifest generated and applied
Graph
component(service.application)artifact(docker.image)host 1(docker.engine)host 2(local.machine)hosthost

Rule #68

Attribute Value
Identifier service.application#docker.image::terraform@docker.engine->local.machine
Component service.application
Artifact docker.image
Technology terraform
Hosting docker.engine -> local.machine
Quality 0.5
Reason Docker Compose is more specialized.
Details "docker_container" and "docker_image" resources
Graph
component(service.application)artifact(docker.image)host 1(docker.engine)host 2(local.machine)hosthost

Rule #69

Attribute Value
Identifier service.application#docker.image::ansible@docker.engine->remote.machine
Component service.application
Artifact docker.image
Technology ansible
Hosting docker.engine -> remote.machine
Quality 0.5
Reason Docker Compose is more specialized.
Details "community.docker.docker_container" task
Graph
component(service.application)artifact(docker.image)host 1(docker.engine)host 2(remote.machine)hosthost

Rule #70

Attribute Value
Identifier service.application#docker.image::compose@docker.engine->remote.machine
Component service.application
Artifact docker.image
Technology compose
Hosting docker.engine -> remote.machine
Quality 1
Reason Docker is the underlying technology.
Details docker compose manifest generated and applied
Graph
component(service.application)artifact(docker.image)host 1(docker.engine)host 2(remote.machine)hosthost

Rule #71

Attribute Value
Identifier service.application#docker.image::terraform@docker.engine->remote.machine
Component service.application
Artifact docker.image
Technology terraform
Hosting docker.engine -> remote.machine
Quality 0.5
Reason Docker Compose is more specialized.
Details "docker_container" and "docker_image" resources
Graph
component(service.application)artifact(docker.image)host 1(docker.engine)host 2(remote.machine)hosthost

Rule #72

Attribute Value
Identifier service.application#docker.image::ansible@gcp.cloudrun
Component service.application
Artifact docker.image
Technology ansible
Hosting gcp.cloudrun
Quality 0
Reason Custom module with imperative parts, while Terraform provides a declarative module.
Details "ansible.builtin.shell", "ansible.builtin.tempfile", and "ansible.builtin.copy" tasks
Graph
component(service.application)artifact(docker.image)host 1(gcp.cloudrun)host

Rule #73

Attribute Value
Identifier service.application#docker.image::terraform@gcp.cloudrun
Component service.application
Artifact docker.image
Technology terraform
Hosting gcp.cloudrun
Quality 1
Reason Terraform provides a declarative module.
Details "google_cloud_run_v2_service" and "google_cloud_run_service_iam_binding" resources
Graph
component(service.application)artifact(docker.image)host 1(gcp.cloudrun)host

Rule #74

Attribute Value
Identifier service.application#docker.image::ansible@kubernetes.cluster
Component service.application
Artifact docker.image
Technology ansible
Hosting kubernetes.cluster
Quality 0.5
Reason Kubernetes is more specialized.
Details "kubernetes.core.k8s" tasks
Graph
component(service.application)artifact(docker.image)host 1(kubernetes.cluster)host

Rule #75

Attribute Value
Identifier service.application#docker.image::kubernetes@kubernetes.cluster
Component service.application
Artifact docker.image
Technology kubernetes
Hosting kubernetes.cluster
Quality 1
Reason Kubernetes is the underlying technology.
Details Kubernetes manifest generated and applied
Graph
component(service.application)artifact(docker.image)host 1(kubernetes.cluster)host

Rule #76

Attribute Value
Identifier service.application#docker.image::terraform@kubernetes.cluster
Component service.application
Artifact docker.image
Technology terraform
Hosting kubernetes.cluster
Quality 0.5
Reason Kubernetes is more specialized.
Details "kubernetes_deployment_v1" and "kubernetes_service_v1" resources
Graph
component(service.application)artifact(docker.image)host 1(kubernetes.cluster)host

Rule #77

Attribute Value
Identifier service.application#tar.archive::ansible@*->local.machine
Component service.application
Artifact tar.archive
Technology ansible
Hosting * -> local.machine
Quality 1
Reason Primary use case due to the specialization of Ansible. Special integration for systemd.
Details "ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", "ansible.builtin.shell", and "ansible.builtin.systemd" tasks with "when" statements
Graph
component(service.application)artifact(tar.archive)...host 2(local.machine)hosthost

Rule #78

Attribute Value
Identifier service.application#tar.archive::terraform@*->local.machine
Component service.application
Artifact tar.archive
Technology terraform
Hosting * -> local.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "local_file" module to create scripts and artifacts and "local-exec" provisioner to execute scripts.
Graph
component(service.application)artifact(tar.archive)...host 2(local.machine)hosthost

Rule #79

Attribute Value
Identifier service.application#tar.archive::ansible@*->remote.machine
Component service.application
Artifact tar.archive
Technology ansible
Hosting * -> remote.machine
Quality 1
Reason Primary use case due to the specialization of Ansible. Special integration for systemd.
Details "ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", "ansible.builtin.shell", and "ansible.builtin.systemd" tasks with "when" statements
Graph
component(service.application)artifact(tar.archive)...host 2(remote.machine)hosthost

Rule #80

Attribute Value
Identifier service.application#tar.archive::terraform@*->remote.machine
Component service.application
Artifact tar.archive
Technology terraform
Hosting * -> remote.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "file" provisioner to upload artifacts and scripts and "remote-exec" to execute scripts
Graph
component(service.application)artifact(tar.archive)...host 2(remote.machine)hosthost

Rule #81

Attribute Value
Identifier service.application#zip.archive::ansible@*->local.machine
Component service.application
Artifact zip.archive
Technology ansible
Hosting * -> local.machine
Quality 1
Reason Primary use case due to the specialization of Ansible. Special integration for systemd.
Details "ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", "ansible.builtin.shell", and "ansible.builtin.systemd" tasks with "when" statements
Graph
component(service.application)artifact(zip.archive)...host 2(local.machine)hosthost

Rule #82

Attribute Value
Identifier service.application#zip.archive::terraform@*->local.machine
Component service.application
Artifact zip.archive
Technology terraform
Hosting * -> local.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "local_file" module to create scripts and artifacts and "local-exec" provisioner to execute scripts.
Graph
component(service.application)artifact(zip.archive)...host 2(local.machine)hosthost

Rule #83

Attribute Value
Identifier service.application#zip.archive::ansible@*->remote.machine
Component service.application
Artifact zip.archive
Technology ansible
Hosting * -> remote.machine
Quality 1
Reason Primary use case due to the specialization of Ansible. Special integration for systemd.
Details "ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", "ansible.builtin.shell", and "ansible.builtin.systemd" tasks with "when" statements
Graph
component(service.application)artifact(zip.archive)...host 2(remote.machine)hosthost

Rule #84

Attribute Value
Identifier service.application#zip.archive::terraform@*->remote.machine
Component service.application
Artifact zip.archive
Technology terraform
Hosting * -> remote.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "file" provisioner to upload artifacts and scripts and "remote-exec" to execute scripts
Graph
component(service.application)artifact(zip.archive)...host 2(remote.machine)hosthost

Rule #85

Attribute Value
Identifier service.application#zip.archive::ansible@gcp.appengine
Component service.application
Artifact zip.archive
Technology ansible
Hosting gcp.appengine
Quality 0
Reason Custom module with imperative parts, while Terraform provides a declarative module.
Details "ansible.builtin.shell", "ansible.builtin.tempfile", "ansible.builtin.unarchive", and "ansible.builtin.copy" tasks
Graph
component(service.application)artifact(zip.archive)host 1(gcp.appengine)host

Rule #86

Attribute Value
Identifier service.application#zip.archive::terraform@gcp.appengine
Component service.application
Artifact zip.archive
Technology terraform
Hosting gcp.appengine
Quality 1
Reason Terraform provides a declarative module.
Details "google_app_engine_standard_app_version", "google_project_iam_member", "google_service_account", "google_storage_bucket", and "google_storage_bucket_object" resources
Graph
component(service.application)artifact(zip.archive)host 1(gcp.appengine)host

Rule #87

Attribute Value
Identifier software.application#apt.package::ansible@*->local.machine
Component software.application
Artifact apt.package
Technology ansible
Hosting * -> local.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details "ansible.builtin.shell", "ansible.builtin.apt_key", "ansible.builtin.apt_repository", "ansible.builtin.apt", and "ansible.builtin.copy", tasks with "when" statements
Graph
component(software.application)artifact(apt.package)...host 2(local.machine)hosthost

Rule #88

Attribute Value
Identifier software.application#apt.package::terraform@*->local.machine
Component software.application
Artifact apt.package
Technology terraform
Hosting * -> local.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "local_file" module to create scripts and artifacts and "local-exec" provisioner to execute scripts
Graph
component(software.application)artifact(apt.package)...host 2(local.machine)hosthost

Rule #89

Attribute Value
Identifier software.application#apt.package::ansible@*->remote.machine
Component software.application
Artifact apt.package
Technology ansible
Hosting * -> remote.machine
Quality 1
Reason Primary use case due to the specialization of Ansible.
Details "ansible.builtin.shell", "ansible.builtin.apt_key", "ansible.builtin.apt_repository", "ansible.builtin.apt", and "ansible.builtin.copy", tasks with "when" statements
Graph
component(software.application)artifact(apt.package)...host 2(remote.machine)hosthost

Rule #90

Attribute Value
Identifier software.application#apt.package::terraform@*->remote.machine
Component software.application
Artifact apt.package
Technology terraform
Hosting * -> remote.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "file" provisioner to upload scripts and "remote-exec" to execute scripts
Graph
component(software.application)artifact(apt.package)...host 2(remote.machine)hosthost

Rule #91

Attribute Value
Identifier software.application#tar.archive::ansible@*->local.machine
Component software.application
Artifact tar.archive
Technology ansible
Hosting * -> local.machine
Quality 0.5
Reason While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.
Details "ansible.builtin.apt", "ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", and "ansible.builtin.shell" tasks with "when" statements
Graph
component(software.application)artifact(tar.archive)...host 2(local.machine)hosthost

Rule #92

Attribute Value
Identifier software.application#tar.archive::terraform@*->local.machine
Component software.application
Artifact tar.archive
Technology terraform
Hosting * -> local.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "local_file" module to create scripts and artifacts and "local-exec" provisioner to execute scripts
Graph
component(software.application)artifact(tar.archive)...host 2(local.machine)hosthost

Rule #93

Attribute Value
Identifier software.application#tar.archive::ansible@*->remote.machine
Component software.application
Artifact tar.archive
Technology ansible
Hosting * -> remote.machine
Quality 0.5
Reason While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., "service.application".
Details "ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", and "ansible.builtin.shell" tasks with "when" statements
Graph
component(software.application)artifact(tar.archive)...host 2(remote.machine)hosthost

Rule #94

Attribute Value
Identifier software.application#tar.archive::terraform@*->remote.machine
Component software.application
Artifact tar.archive
Technology terraform
Hosting * -> remote.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "file" provisioner to upload artifacts and scripts and "remote-exec" to execute scripts
Graph
component(software.application)artifact(tar.archive)...host 2(remote.machine)hosthost

Rule #95

Attribute Value
Identifier software.application#zip.archive::ansible@*->local.machine
Component software.application
Artifact zip.archive
Technology ansible
Hosting * -> local.machine
Quality 0.5
Reason While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.
Details "ansible.builtin.apt", "ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", and "ansible.builtin.shell" tasks with "when" statements
Graph
component(software.application)artifact(zip.archive)...host 2(local.machine)hosthost

Rule #96

Attribute Value
Identifier software.application#zip.archive::terraform@*->local.machine
Component software.application
Artifact zip.archive
Technology terraform
Hosting * -> local.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "local_file" module to create scripts and artifacts and "local-exec" provisioner to execute scripts.
Graph
component(software.application)artifact(zip.archive)...host 2(local.machine)hosthost

Rule #97

Attribute Value
Identifier software.application#zip.archive::ansible@*->remote.machine
Component software.application
Artifact zip.archive
Technology ansible
Hosting * -> remote.machine
Quality 0.5
Reason While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.
Details "ansible.builtin.apt", "ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", and "ansible.builtin.shell" tasks with "when" statements
Graph
component(software.application)artifact(zip.archive)...host 2(remote.machine)hosthost

Rule #98

Attribute Value
Identifier software.application#zip.archive::terraform@*->remote.machine
Component software.application
Artifact zip.archive
Technology terraform
Hosting * -> remote.machine
Quality 0
Reason Ansible is more specialized. Also using provisioners is a "last resort".
Details "file" provisioner to upload artifacts and scripts and "remote-exec" to execute scripts
Graph
component(software.application)artifact(zip.archive)...host 2(remote.machine)hosthost

Rule #99

Attribute Value
Identifier virtual.machine#machine.image::ansible@openstack.provider
Component virtual.machine
Artifact machine.image
Technology ansible
Hosting openstack.provider
Quality 0.5
Reason Terraform is more specialized.
Details "openstack.cloud.security_group", "openstack.cloud.security_group_rule" and "openstack.cloud.server" tasks
Graph
component(virtual.machine)artifact(machine.image)host 1(openstack.provider)host

Rule #100

Attribute Value
Identifier virtual.machine#machine.image::terraform@openstack.provider
Component virtual.machine
Artifact machine.image
Technology terraform
Hosting openstack.provider
Quality 1
Reason Terraform provides a declarative module.
Details "openstack_compute_instance_v2", "openstack_networking_secgroup_rule_v2" and "openstack_networking_secgroup_v2" resources
Graph
component(virtual.machine)artifact(machine.image)host 1(openstack.provider)host

Appendix B "YAML"

This appendix contains the deployment technology rules as YAML. The rules are also available as download.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
- technology: ansible
  component: docker.engine
  hosting:
      - local.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
  details: '"ansible.builtin.shell", "ansible.builtin.group", and "ansible.builtin.user" tasks'
- technology: terraform
  component: docker.engine
  hosting:
      - local.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"local-exec" provider'
- technology: ansible
  component: docker.engine
  hosting:
      - remote.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
  details: '"ansible.builtin.shell", "ansible.builtin.group", and "ansible.builtin.user" tasks'
- technology: terraform
  component: docker.engine
  hosting:
      - remote.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"remote-exec" provider'
- technology: ansible
  component: gcp.service
  hosting: []
  weight: 1
  reason: Ansible provides a declarative module
  details: '"google.cloud.gcp_serviceusage_service" task'
- technology: terraform
  component: gcp.service
  hosting: []
  weight: 1
  reason: Terraform provides a declarative module.
  details: '"google_project_service" resource'
- technology: ansible
  component: ingress
  hosting:
      - kubernetes.cluster
  weight: 0.5
  reason: Kubernetes is more specialized.
  details: '"kubernetes.core.k8s" task'
- technology: kubernetes
  component: ingress
  hosting:
      - kubernetes.cluster
  weight: 1
  reason: Kubernetes is the underlying technology.
  details: Kubernetes manifest generated and applied
- technology: terraform
  component: ingress
  hosting:
      - kubernetes.cluster
  weight: 0.5
  reason: Kubernetes is more specialized.
  details: '"kubernetes_service_v1" resource'
- technology: ansible
  component: ingress
  hosting:
      - local.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
  details: '"ansible.builtin.apt_key", "ansible.builtin.apt_repository", "ansible.builtin.apt", "ansible.builtin.copy", and "ansible.builtin.systemd" tasks'
- technology: terraform
  component: ingress
  hosting:
      - local.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"local_file" resource to create the installation script and "terraform_data" to execute the script using the "local-exec" provisioner'
- technology: ansible
  component: ingress
  hosting:
      - remote.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
  details: '"ansible.builtin.apt_key", "ansible.builtin.apt_repository", "ansible.builtin.apt", "ansible.builtin.copy", and "ansible.builtin.systemd" tasks'
- technology: terraform
  component: ingress
  hosting:
      - remote.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"terraform_data" resource with an "ssh" connection to the virtual machine to copy the install script using the "file" provisioner on the virtual machine and to execute the script using the "remote-exec" provisioner'
- technology: ansible
  component: mysql.database
  hosting:
      - mysql.dbms
      - docker.engine
      - local.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
- technology: compose
  component: mysql.database
  hosting:
      - mysql.dbms
      - docker.engine
      - local.machine
  weight: 0
  reason: One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
- technology: terraform
  component: mysql.database
  hosting:
      - mysql.dbms
      - docker.engine
      - local.machine
  weight: 1
  reason: Terraform provides a declarative module.
- technology: ansible
  component: mysql.database
  hosting:
      - mysql.dbms
      - docker.engine
      - remote.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
- technology: compose
  component: mysql.database
  hosting:
      - mysql.dbms
      - docker.engine
      - remote.machine
  weight: 0
  reason: One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
- technology: terraform
  component: mysql.database
  hosting:
      - mysql.dbms
      - docker.engine
      - remote.machine
  weight: 0.5
  reason: Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.
- technology: ansible
  component: mysql.database
  hosting:
      - mysql.dbms
      - gcp.cloudsql
  weight: 0.5
  reason: Primary use case due to the specialization of Ansible. However, need to install and handle GCP CloudSQL Proxy, while the corresponding Terraform module already provides this.
- technology: terraform
  component: mysql.database
  hosting:
      - mysql.dbms
      - gcp.cloudsql
  weight: 1
  reason: Terraform provides a declarative module.
- technology: ansible
  component: mysql.database
  hosting:
      - mysql.dbms
      - kubernetes.cluster
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
- technology: kubernetes
  component: mysql.database
  hosting:
      - mysql.dbms
      - kubernetes.cluster
  weight: 0
  reason: Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.
- technology: terraform
  component: mysql.database
  hosting:
      - mysql.dbms
      - kubernetes.cluster
  weight: 0
  reason: Ansible is more specialized.
- technology: ansible
  component: mysql.database
  hosting:
      - mysql.dbms
      - local.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
- technology: terraform
  component: mysql.database
  hosting:
      - mysql.dbms
      - local.machine
  weight: 1
  reason: Terraform provides a declarative module.
- technology: ansible
  component: mysql.database
  hosting:
      - mysql.dbms
      - remote.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
- technology: terraform
  component: mysql.database
  hosting:
      - mysql.dbms
      - remote.machine
  weight: 0.5
  reason: Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.
- technology: ansible
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - docker.engine
      - local.machine
  weight: 0.5
  reason: Docker Compose is more specialized
  details: '"community.docker.docker_container" task'
- technology: compose
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - docker.engine
      - local.machine
  weight: 1
  reason: Docker is the underlying technology.
  details: docker-compose manifest generated and applied
- technology: terraform
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - docker.engine
      - local.machine
  weight: 0.5
  reason: Docker Compose is more specialized.
  details: '"docker_container" and "docker_image" resources'
- technology: ansible
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - docker.engine
      - remote.machine
  weight: 0.5
  reason: Docker Compose is more specialized
  details: '"community.docker.docker_container" task'
- technology: compose
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - docker.engine
      - remote.machine
  weight: 1
  reason: Docker is the underlying technology.
  details: docker-compose manifest generated and applied
- technology: terraform
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - docker.engine
      - remote.machine
  weight: 0.5
  reason: Docker Compose is more specialized.
  details: '"docker_container" and "docker_image" resources'
- technology: ansible
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - gcp.cloudsql
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
  details: '"google.cloud.gcp_sql_instance" and "google.cloud.gcp_sql_user" tasks'
- technology: terraform
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - gcp.cloudsql
  weight: 1
  reason: Terraform provides a declarative module.
  details: '"google_sql_database_instance" and "google_sql_user" resources'
- technology: ansible
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - kubernetes.cluster
  weight: 0.5
  reason: Kubernetes is more specialized.
  details: '"kubernetes.core.k8s" tasks'
- technology: kubernetes
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - kubernetes.cluster
  weight: 1
  reason: Kubernetes is the underlying technology.
  details: Kubernetes manifest generated and applied
- technology: terraform
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - kubernetes.cluster
  weight: 0.5
  reason: Kubernetes is more specialized.
  details: '"kubernetes_deployment_v1" and "kubernetes_service_v1" resources'
- technology: ansible
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - local.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
  details: '"ansible.builtin.apt", "ansible.builtin.systemd", "ansible.builtin.copy", "ansible.builtin.lineinfile", and "community.mysql.mysql_user" tasks'
- technology: terraform
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - local.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"local_file" resource to create the installation script and "terraform_data" to execute the script using the "local-exec" provisioner'
- technology: ansible
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - remote.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
  details: '"ansible.builtin.apt", "ansible.builtin.systemd", "ansible.builtin.copy", "ansible.builtin.lineinfile", and "community.mysql.mysql_user" tasks'
- technology: terraform
  component: mysql.dbms
  artifact: dbms.image
  hosting:
      - remote.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"terraform_data" resource with an "ssh" connection to the virtual machine to copy the install script using the "file" provisioner on the virtual machine and to execute the script using the "remote-exec" provisioner'
- technology: ansible
  component: object.storage
  hosting:
      - gcp.cloudstorage
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
- technology: terraform
  component: object.storage
  hosting:
      - gcp.cloudstorage
  weight: 1
  reason: Terraform provides a declarative module.
- technology: ansible
  component: object.storage
  hosting:
      - minio.server
      - docker.engine
      - local.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
- technology: compose
  component: object.storage
  hosting:
      - minio.server
      - docker.engine
      - local.machine
  weight: 0
  reason: One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
- technology: terraform
  component: object.storage
  hosting:
      - minio.server
      - docker.engine
      - local.machine
  weight: 1
  reason: Terraform provides a declarative module.
- technology: ansible
  component: object.storage
  hosting:
      - minio.server
      - docker.engine
      - remote.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
- technology: compose
  component: object.storage
  hosting:
      - minio.server
      - docker.engine
      - remote.machine
  weight: 0
  reason: One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
- technology: terraform
  component: object.storage
  hosting:
      - minio.server
      - docker.engine
      - remote.machine
  weight: 0.5
  reason: Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.
- technology: ansible
  component: object.storage
  hosting:
      - minio.server
      - kubernetes.cluster
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
- technology: kubernetes
  component: object.storage
  hosting:
      - minio.server
      - kubernetes.cluster
  weight: 0
  reason: Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.
- technology: terraform
  component: object.storage
  hosting:
      - minio.server
      - kubernetes.cluster
  weight: 0
  reason: Ansible is more specialized.
- technology: ansible
  component: redis.server
  artifact: cache.image
  hosting:
      - docker.engine
      - local.machine
  weight: 0.5
  reason: Docker Compose is more specialized.
  details: '"community.docker.docker_container" task'
- technology: compose
  component: redis.server
  artifact: cache.image
  hosting:
      - docker.engine
      - local.machine
  weight: 1
  reason: Docker is the underlying technology.
  details: docker compose manifest generated and applied
- technology: terraform
  component: redis.server
  artifact: cache.image
  hosting:
      - docker.engine
      - local.machine
  weight: 0.5
  reason: Docker Compose is more specialized.
  details: '"docker_container" and "docker_image" resources'
- technology: ansible
  component: redis.server
  artifact: cache.image
  hosting:
      - docker.engine
      - remote.machine
  weight: 0.5
  reason: Docker Compose is more specialized.
  details: '"community.docker.docker_container" task'
- technology: compose
  component: redis.server
  artifact: cache.image
  hosting:
      - docker.engine
      - remote.machine
  weight: 1
  reason: Docker is the underlying technology.
  details: docker compose manifest generated and applied
- technology: terraform
  component: redis.server
  artifact: cache.image
  hosting:
      - docker.engine
      - remote.machine
  weight: 0.5
  reason: Docker Compose is more specialized.
  details: '"docker_container" and "docker_image" resources'
- technology: ansible
  component: redis.server
  artifact: cache.image
  hosting:
      - gcp.memorystore
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
- technology: terraform
  component: redis.server
  artifact: cache.image
  hosting:
      - gcp.memorystore
  weight: 1
  reason: Terraform provides a declarative module.
- technology: ansible
  component: redis.server
  artifact: cache.image
  hosting:
      - kubernetes.cluster
  weight: 0.5
  reason: Kubernetes is more specialized.
- technology: kubernetes
  component: redis.server
  artifact: cache.image
  hosting:
      - kubernetes.cluster
  weight: 1
  reason: Kubernetes is the underlying technology.
  details: Kubernetes manifest generated and applied
- technology: terraform
  component: redis.server
  artifact: cache.image
  hosting:
      - kubernetes.cluster
  weight: 0.5
  reason: Kubernetes is more specialized.
- technology: ansible
  component: service.application
  artifact: docker.image
  hosting:
      - docker.engine
      - local.machine
  weight: 0.5
  reason: Docker Compose is more specialized.
  details: '"community.docker.docker_container" task'
- technology: compose
  component: service.application
  artifact: docker.image
  hosting:
      - docker.engine
      - local.machine
  weight: 1
  reason: Docker is the underlying technology.
  details: docker compose manifest generated and applied
- technology: terraform
  component: service.application
  artifact: docker.image
  hosting:
      - docker.engine
      - local.machine
  weight: 0.5
  reason: Docker Compose is more specialized.
  details: '"docker_container" and "docker_image" resources'
- technology: ansible
  component: service.application
  artifact: docker.image
  hosting:
      - docker.engine
      - remote.machine
  weight: 0.5
  reason: Docker Compose is more specialized.
  details: '"community.docker.docker_container" task'
- technology: compose
  component: service.application
  artifact: docker.image
  hosting:
      - docker.engine
      - remote.machine
  weight: 1
  reason: Docker is the underlying technology.
  details: docker compose manifest generated and applied
- technology: terraform
  component: service.application
  artifact: docker.image
  hosting:
      - docker.engine
      - remote.machine
  weight: 0.5
  reason: Docker Compose is more specialized.
  details: '"docker_container" and "docker_image" resources'
- technology: ansible
  component: service.application
  artifact: docker.image
  hosting:
      - gcp.cloudrun
  weight: 0
  reason: Custom module with imperative parts, while Terraform provides a declarative module.
  details: '"ansible.builtin.shell", "ansible.builtin.tempfile", and "ansible.builtin.copy" tasks '
- technology: terraform
  component: service.application
  artifact: docker.image
  hosting:
      - gcp.cloudrun
  weight: 1
  reason: Terraform provides a declarative module.
  details: '"google_cloud_run_v2_service" and "google_cloud_run_service_iam_binding" resources'
- technology: ansible
  component: service.application
  artifact: docker.image
  hosting:
      - kubernetes.cluster
  weight: 0.5
  reason: Kubernetes is more specialized.
  details: '"kubernetes.core.k8s" tasks'
- technology: kubernetes
  component: service.application
  artifact: docker.image
  hosting:
      - kubernetes.cluster
  weight: 1
  reason: Kubernetes is the underlying technology.
  details: Kubernetes manifest generated and applied
- technology: terraform
  component: service.application
  artifact: docker.image
  hosting:
      - kubernetes.cluster
  weight: 0.5
  reason: Kubernetes is more specialized.
  details: '"kubernetes_deployment_v1" and "kubernetes_service_v1" resources'
- technology: ansible
  component: service.application
  artifact: tar.archive
  hosting:
      - '*'
      - local.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible. Special integration for systemd.
  details: '"ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", "ansible.builtin.shell", and "ansible.builtin.systemd" tasks with "when" statements'
- technology: terraform
  component: service.application
  artifact: tar.archive
  hosting:
      - '*'
      - local.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"local_file" module to create scripts and artifacts and "local-exec" provisioner to execute scripts.'
- technology: ansible
  component: service.application
  artifact: tar.archive
  hosting:
      - '*'
      - remote.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible. Special integration for systemd.
  details: '"ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", "ansible.builtin.shell", and "ansible.builtin.systemd" tasks with "when" statements'
- technology: terraform
  component: service.application
  artifact: tar.archive
  hosting:
      - '*'
      - remote.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"file" provisioner to upload artifacts and scripts and "remote-exec" to execute scripts'
- technology: ansible
  component: service.application
  artifact: zip.archive
  hosting:
      - '*'
      - local.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible. Special integration for systemd.
  details: '"ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", "ansible.builtin.shell", and "ansible.builtin.systemd" tasks with "when" statements'
- technology: terraform
  component: service.application
  artifact: zip.archive
  hosting:
      - '*'
      - local.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"local_file" module to create scripts and artifacts and "local-exec" provisioner to execute scripts.'
- technology: ansible
  component: service.application
  artifact: zip.archive
  hosting:
      - '*'
      - remote.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible. Special integration for systemd.
  details: '"ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", "ansible.builtin.shell", and "ansible.builtin.systemd" tasks with "when" statements'
- technology: terraform
  component: service.application
  artifact: zip.archive
  hosting:
      - '*'
      - remote.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"file" provisioner to upload artifacts and scripts and "remote-exec" to execute scripts'
- technology: ansible
  component: service.application
  artifact: zip.archive
  hosting:
      - gcp.appengine
  weight: 0
  reason: Custom module with imperative parts, while Terraform provides a declarative module.
  details: '"ansible.builtin.shell", "ansible.builtin.tempfile", "ansible.builtin.unarchive", and "ansible.builtin.copy" tasks'
- technology: terraform
  component: service.application
  artifact: zip.archive
  hosting:
      - gcp.appengine
  weight: 1
  reason: Terraform provides a declarative module.
  details: '"google_app_engine_standard_app_version", "google_project_iam_member", "google_service_account", "google_storage_bucket", and "google_storage_bucket_object" resources'
- technology: ansible
  component: software.application
  artifact: apt.package
  hosting:
      - '*'
      - local.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
  details: '"ansible.builtin.shell", "ansible.builtin.apt_key", "ansible.builtin.apt_repository", "ansible.builtin.apt", and "ansible.builtin.copy", tasks with "when" statements'
- technology: terraform
  component: software.application
  artifact: apt.package
  hosting:
      - '*'
      - local.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"local_file" module to create scripts and artifacts and "local-exec" provisioner to execute scripts'
- technology: ansible
  component: software.application
  artifact: apt.package
  hosting:
      - '*'
      - remote.machine
  weight: 1
  reason: Primary use case due to the specialization of Ansible.
  details: '"ansible.builtin.shell", "ansible.builtin.apt_key", "ansible.builtin.apt_repository", "ansible.builtin.apt", and "ansible.builtin.copy", tasks with "when" statements'
- technology: terraform
  component: software.application
  artifact: apt.package
  hosting:
      - '*'
      - remote.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"file" provisioner to upload scripts and "remote-exec" to execute scripts'
- technology: ansible
  component: software.application
  artifact: tar.archive
  hosting:
      - '*'
      - local.machine
  weight: 0.5
  reason: While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.
  details: '"ansible.builtin.apt", "ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", and "ansible.builtin.shell" tasks with "when" statements'
- technology: terraform
  component: software.application
  artifact: tar.archive
  hosting:
      - '*'
      - local.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"local_file" module to create scripts and artifacts and "local-exec" provisioner to execute scripts'
- technology: ansible
  component: software.application
  artifact: tar.archive
  hosting:
      - '*'
      - remote.machine
  weight: 0.5
  reason: While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., "service.application".
  details: '"ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", and "ansible.builtin.shell" tasks with "when" statements'
- technology: terraform
  component: software.application
  artifact: tar.archive
  hosting:
      - '*'
      - remote.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"file" provisioner to upload artifacts and scripts and "remote-exec" to execute scripts'
- technology: ansible
  component: software.application
  artifact: zip.archive
  hosting:
      - '*'
      - local.machine
  weight: 0.5
  reason: While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.
  details: '"ansible.builtin.apt", "ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", and "ansible.builtin.shell" tasks with "when" statements'
- technology: terraform
  component: software.application
  artifact: zip.archive
  hosting:
      - '*'
      - local.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"local_file" module to create scripts and artifacts and "local-exec" provisioner to execute scripts.'
- technology: ansible
  component: software.application
  artifact: zip.archive
  hosting:
      - '*'
      - remote.machine
  weight: 0.5
  reason: While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.
  details: '"ansible.builtin.apt", "ansible.builtin.file", "ansible.builtin.unarchive", "ansible.builtin.copy", "ansible.builtin.fail", and "ansible.builtin.shell" tasks with "when" statements'
- technology: terraform
  component: software.application
  artifact: zip.archive
  hosting:
      - '*'
      - remote.machine
  weight: 0
  reason: Ansible is more specialized. Also using provisioners is a "last resort".
  details: '"file" provisioner to upload artifacts and scripts and "remote-exec" to execute scripts'
- technology: ansible
  component: virtual.machine
  artifact: machine.image
  hosting:
      - openstack.provider
  weight: 0.5
  reason: Terraform is more specialized.
  details: '"openstack.cloud.security_group", "openstack.cloud.security_group_rule" and "openstack.cloud.server" tasks'
- technology: terraform
  component: virtual.machine
  artifact: machine.image
  hosting:
      - openstack.provider
  weight: 1
  reason: Terraform provides a declarative module.
  details: '"openstack_compute_instance_v2", "openstack_networking_secgroup_rule_v2" and "openstack_networking_secgroup_v2" resources'

Reference Implementation

We provide a reference implementation for this specification as part of OpenTOSCA Vintner. OpenTOSCA Vintner is a TOSCA preprocessing and management layer. The project is open-source, licensed under Apache-2.0, and publicly available at GitHub.

Acknowledgments

This specification is developed for the purpose of research by the Institute of Software Engineering (ISTE) and the Institute of Architecture of Application Systems (IAAS) of the University of Stuttgart, Germany. The development is partially funded by the German Federal Ministry for Economic Affairs and Climate Action (BMWK) as part of the Software-Defined Car (SofDCar) project (19S21002).

Correspondence

Please address all correspondence concerning this specification to Miles Stötzner <miles.stoetzner@iste.uni-stuttgart.de, https://miles.stoetzner.de>.

Disclaimer of Warranty

Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.


Last update: September 14, 2024