{"componentChunkName":"component---src-templates-blog-template-js","path":"/zh/blog/introducing-the-psono-terraform-provider","result":{"data":{"markdownRemark":{"html":"<h1>Psono Terraform 提供程序介绍</h1>\n<p>我们很高兴地宣布，Psono Terraform 提供程序的测试版现已在公开的\n<a href=\"https://registry.terraform.io/providers/psono/psono/latest\">Terraform 注册表</a>上线。</p>\n<p>基础设施团队现在可以在其 Terraform 工作流程中，作为一部分，管理预先创建的 Psono 环境变量条目中的各个密钥。该提供程序能够保留现有值、生成新密码、轮换托管值、写入外部提供的值，以及通过 Terraform 临时资源读取机密。</p>\n<h2>不将机密信息存储在 Terraform 状态中的机密管理</h2>\n<p>在基础设施即代码中处理机密信息需要格外谨慎。使用敏感标志可以隐藏值不在普通 CLI 输出中显示，但它不一定会让该值避开 Terraform 的状态文件。Psono 提供程序利用 Terraform 的只写和临时资源功能来避免此问题，并且要求 Terraform 1.11 或更高版本。</p>\n<p>该提供程序支持三种常见工作流：</p>\n<ul>\n<li>在 Psono 中生成一个值，但不通过受管资源返回该值。</li>\n<li>通过只写参数提供一个值，这样 Terraform 就不会在 plan 或 state 中持久化它。</li>\n<li>通过临时资源读取现有值，并仅传递给另一个临时或只写上下文。</li>\n</ul>\n<p>这样可以将机密生命周期操作纳入 Terraform 流程，同时将实际值保存在 Psono 中。</p>\n<h2>限制访问与本地加密</h2>\n<p>该提供程序使用受限的 Psono API 密钥。您只需分配 Terraform 所需的环境变量条目，并授予所有操作的读取权限。创建、更新、轮换或删除密钥则还需要写入权限。该提供程序无需不受限制的 API 密钥，并且不能创建金库条目、文件夹或数据存储。</p>\n<p>加密和解密在提供程序本地完成。HTTPS 证书验证不能被禁用，可以通过 PEM 格式的 CA bundle 添加私有证书颁发机构。生产系统应始终使用 HTTPS 的 Psono URL。</p>\n<h2>入门</h2>\n<p>要求 Terraform 1.11 或更高版本。在 Terraform 配置文件中添加以下内容：</p>\n<pre><code class=\"language-hcl\">terraform {\n  required_version = \">= 1.11.0\"\n\n  required_providers {\n    psono = {\n      source  = \"psono/psono\"\n      version = \"~> 1.0\"\n    }\n  }\n}\n\nprovider \"psono\" {}\n</code></pre>\n<p>通过环境变量配置凭据，而不是将其写入 Terraform 文件：</p>\n<pre><code class=\"language-bash\">export PSONO_SERVER_URL='https://psono.example.com/server'\nexport PSONO_API_KEY_ID='REPLACE_WITH_API_KEY_ID'\nexport PSONO_API_SECRET_KEY='REPLACE_WITH_API_SECRET_KEY'\n</code></pre>\n<p>然后初始化工作目录：</p>\n<pre><code class=\"language-bash\">terraform init\n</code></pre>\n<p>Terraform 将下载带签名的提供程序发行版，并验证其校验和签名。</p>\n<h2>生成与轮换值</h2>\n<p>下面的资源在已存在的 Psono 环境变量条目中管理 <code>DB_PASSWORD</code>：</p>\n<pre><code class=\"language-hcl\">resource \"psono_environment_variable\" \"database_password\" {\n  secret_id = var.psono_environment_variables_secret_id\n  name      = \"DB_PASSWORD\"\n\n  length      = 32\n  min_lower   = 4\n  min_upper   = 4\n  min_numeric = 4\n  min_special = 4\n\n  rotation_version = 1\n}\n</code></pre>\n<p>如果密钥已存在，提供程序会采纳而不更改其值。如不存在，提供程序将在 Psono 中生成并存储新值。生成的值不会被受管资源返回，也不会进入 Terraform 状态。</p>\n<p>当需要生成新值时，递增 <code>rotation_version</code>。这也会替换最初采纳或导入的值，因此执行轮换前应仔细审核变化。</p>\n<h2>写入外部提供的值</h2>\n<p>可以使用 <code>value_wo</code> 将来自其他提供程序的临时值写入 Psono：</p>\n<pre><code class=\"language-hcl\">ephemeral \"random_password\" \"database\" {\n  length = 32\n}\n\nresource \"psono_environment_variable\" \"database_password\" {\n  secret_id        = var.psono_environment_variables_secret_id\n  name             = \"DB_PASSWORD\"\n  value_wo         = ephemeral.random_password.database.result\n  value_wo_version = 1\n}\n</code></pre>\n<p>该值仅在 Terraform 操作期间可用，不会被保存到 plan 或 state 文件中。当需要写入替代值时，请递增 <code>value_wo_version</code>。</p>\n<h2>默认安全删除</h2>\n<p>销毁受管资源时，默认情况下会保留 Psono 中的密钥。这保护了那些 Terraform 只是采纳、而非创建的值。只有在 Terraform 需要在销毁或替换资源时显式删除密钥时，才设置 <code>deletion_policy = \"Delete\"</code>。</p>\n<h2>现已开放使用</h2>\n<p>该提供程序为开源项目，现已可用：</p>\n<ul>\n<li><a href=\"https://registry.terraform.io/providers/psono/psono/latest\">从 Terraform Registry 安装提供程序</a></li>\n<li><a href=\"https://doc.psono.com/user/developer/terraform-provider.html\">阅读 Psono Terraform 提供程序指南</a></li>\n<li><a href=\"https://gitlab.com/esaqa/psono/psono-terraform-provider\">在 GitLab 查看源代码</a></li>\n</ul>\n<p>测试版专注于环境变量条目和受限 API 密钥。这有助于保持权限最小化，避免不受限制的金库访问，并为安全地通过 Terraform 管理运维机密提供了实用的基础。</p>","frontmatter":{"date":"August 22, 2026","slug":"introducing-the-psono-terraform-provider","title":"Psono Terraform 提供程序介绍","description":"直接通过 Terraform 在 Psono 中管理生成、只写和临时值，无需在 Terraform 状态文件中存储机密信息。","author":"Sascha Pfeiffer","featuredImage":null}}},"pageContext":{"slug":"introducing-the-psono-terraform-provider","lang":"zh","langPathPrefix":"/zh"}},"staticQueryHashes":["2149092236","3128451518","3192060438"]}