Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 11 additions & 7 deletions generated/routes.json
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,12 @@
"lastmod": null
},
"/api-reference/terraform": {
"relPath": "/api-reference/terraform.md",
"lastmod": "2026-02-03T22:03:47.000Z"
"relPath": "/api-reference/terraform/index.md",
"lastmod": "2026-08-04T13:27:26.025Z"
},
"/api-reference/terraform/pulumi": {
"relPath": "/api-reference/terraform/pulumi.md",
"lastmod": "2026-08-04T13:27:26.046Z"
},
"/plural-features": {
"relPath": "/plural-features/index.md",
Expand Down Expand Up @@ -153,11 +157,11 @@
},
"/plural-features/continuous-deployment/service-templating": {
"relPath": "/plural-features/continuous-deployment/service-templating/index.md",
"lastmod": "2026-07-14T13:15:49.255Z"
"lastmod": "2026-08-04T13:27:26.172Z"
},
"/plural-features/continuous-deployment/service-templating/supporting-liquid-filters": {
"relPath": "/plural-features/continuous-deployment/service-templating/supporting-liquid-filters.md",
"lastmod": "2026-07-14T13:15:49.275Z"
"lastmod": "2026-08-04T13:27:26.192Z"
},
"/plural-features/continuous-deployment/lua": {
"relPath": "/plural-features/continuous-deployment/lua.md",
Expand Down Expand Up @@ -201,15 +205,15 @@
},
"/plural-features/stacks-iac-management": {
"relPath": "/plural-features/stacks-iac-management/index.md",
"lastmod": "2025-03-12T14:59:41.000Z"
"lastmod": "2026-07-15T09:31:13.000Z"
},
"/plural-features/stacks-iac-management/customize-runners": {
"relPath": "/plural-features/stacks-iac-management/customize-runners.md",
"lastmod": "2025-03-12T14:59:41.000Z"
},
"/plural-features/stacks-iac-management/pulumi": {
"relPath": "/plural-features/stacks-iac-management/pulumi.md",
"lastmod": "2026-07-14T13:15:49.496Z"
"lastmod": "2026-07-15T09:31:13.000Z"
},
"/plural-features/stacks-iac-management/pr-workflow": {
"relPath": "/plural-features/stacks-iac-management/pr-workflow.md",
Expand Down Expand Up @@ -593,7 +597,7 @@
},
"/deployments/stacks": {
"relPath": "/plural-features/stacks-iac-management/index.md",
"lastmod": "2025-03-12T14:59:41.000Z"
"lastmod": "2026-07-15T09:31:13.000Z"
},
"/service-catalog/creation": {
"relPath": "/plural-features/service-catalog/creation.md",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: >-

For ingesting clusters or creating net new infrastructure, our terraform provider is usually the most natural surface for integrating Plural with your existing processes or adopting a full IaC based infrastructure management approach from the ground up.

Our provider is available on the Terraform Registry's [Plural Provider page](https://registry.terraform.io/providers/pluralsh/plural/latest/docs)
Our provider is available on the Terraform Registry's [Plural Provider page](https://registry.terraform.io/providers/pluralsh/plural/latest/docs). It can also be used from Pulumi — see [Using from Pulumi](/api-reference/terraform/pulumi).

You can see snippets throughout our getting started guides, but some common usecases are as follows:

Expand Down Expand Up @@ -111,4 +111,4 @@ local {
externaldns_context = jsondecode(data.plural_service_context.externaldns.configuration) # it is json encoded coming from our api
external_dns_arn = local.externaldns_context.roleArn
}
```
```
68 changes: 68 additions & 0 deletions pages/api-reference/terraform/pulumi.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
---
title: Using from Pulumi
description: >-
Use the Plural Terraform provider from Pulumi via the Any Terraform Provider bridge
---

Pulumi can consume the same [`pluralsh/plural`](https://registry.terraform.io/providers/pluralsh/plural) Terraform provider through the [Any Terraform Provider](https://www.pulumi.com/docs/iac/concepts/providers/any-terraform-provider/) bridge. There is no separate package on PyPI or npm — the SDK is generated locally in your project.

```bash
pulumi new python # or typescript, go, etc.
pulumi package add terraform-provider pluralsh/plural <version>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Version placeholder breaks shell command

When a reader copies this setup command as shown, Bash interprets <version> as input redirection from a file named version, causing the command to fail before Pulumi can generate the SDK.

Suggested change
pulumi package add terraform-provider pluralsh/plural <version>
pulumi package add terraform-provider pluralsh/plural 0.2.38

pulumi install
```

Pin `<version>` for reproducible builds (recommended), or omit it to use the latest registry release.

Credentials (either):

* `plural cd login`, then `use_cli=True` / `PLURAL_USE_CLI=true`
* `PLURAL_CONSOLE_URL` + `PLURAL_ACCESS_TOKEN`

Optional kubeconfig at `~/.kube/config` for agent install. See also [Configuring the Provider](/api-reference/terraform#configuring-the-provider).

```bash
pulumi preview
pulumi up
```

## Example

Python equivalent of a Terraform `plural_cluster`:

```python
import pulumi
import pulumi_plural as plural

provider = plural.Provider("plural", use_cli=True)
opts = pulumi.ResourceOptions(provider=provider)

default_project = plural.get_project(
name="default",
opts=pulumi.InvokeOptions(provider=provider),
)

cluster = plural.Cluster(
"test",
name="test-cluster",
handle="test",
project_id=default_project.id,
opts=opts,
)

pulumi.export("cluster_id", cluster.id)
```

| Terraform | Pulumi Python |
| --- | --- |
| `provider "plural"` | `plural.Provider(...)` |
| `plural_cluster` | `plural.Cluster` |
| `data.plural_project` | `plural.get_project(...)` |
| `use_cli` | `use_cli` |
| `kubeconfig.config_path` | `ProviderKubeconfigArgs(config_path=...)` |

See [pluralsh/pulumi-plural](https://github.com/pluralsh/pulumi-plural) for a fuller example.

{% callout severity="info" %}
To run Pulumi programs through Plural Stacks, create an `InfrastructureStack` with `type: PULUMI` (see [Pulumi stacks](/plural-features/stacks-iac-management/pulumi)).
{% /callout %}
2 changes: 1 addition & 1 deletion pages/plural-features/stacks-iac-management/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ To get a better idea of the full power of the experience, feel free to take a lo
| `ANSIBLE` | Ansible playbooks |
| `CUSTOM` | A custom runner image and command workflow |

Pulumi stacks use Pulumi's own state backends. See {% doclink to="plural_features_stacks_iac_management_pulumi" %}Pulumi stacks{% /doclink %} for Pulumi Cloud and self-managed backend authentication.
Pulumi stacks use Pulumi's own state backends. See [Pulumi stacks](/plural-features/stacks-iac-management/pulumi) for Pulumi Cloud and self-managed backend authentication. To drive Console resources from Pulumi via the Terraform provider, see [Using from Pulumi](/api-reference/terraform/pulumi).

# A Basic Stack

Expand Down
2 changes: 2 additions & 0 deletions pages/plural-features/stacks-iac-management/pulumi.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ spec:

`configuration.pulumi.stack` defaults to `dev`. Omit `backendUrl` to use Pulumi Cloud, or set it to a Pulumi-supported self-managed backend URL. Unlike Terraform, `manageState` does not manage Pulumi state; configure the state backend with `backendUrl`.

For using the Plural Terraform provider from a Pulumi program, see [Using from Pulumi](/api-reference/terraform/pulumi).

## Pulumi Cloud

Pulumi Cloud is the default backend. Authenticate the runner with a `PULUMI_ACCESS_TOKEN` sourced from a Kubernetes Secret in the same namespace as the `InfrastructureStack`.
Expand Down
2 changes: 2 additions & 0 deletions src/markdoc/tags/doclink.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ const oldDocIDtoRouteMap: Record<string, string> = {
'/plural-features/k8s-upgrade-assistant/upgrade-insights',
plural_features_stacks_iac_management:
'/plural-features/stacks-iac-management',
plural_features_stacks_iac_management_pulumi:
'/plural-features/stacks-iac-management/pulumi',
plural_features_stacks_iac_management_customize_runners:
'/plural-features/stacks-iac-management/customize-runners',
plural_features_stacks_iac_management_pr_workflow:
Expand Down
1 change: 1 addition & 0 deletions src/routing/docs-structure.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ export const docsStructure: DocSection[] = [
{
path: 'terraform',
title: 'Terraform Provider reference',
sections: [{ path: 'pulumi', title: 'Using from Pulumi' }],
},
],
},
Expand Down
Loading