{"id":48442,"date":"2023-04-08T05:01:48","date_gmt":"2023-07-10T11:43:59","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/"},"modified":"2024-04-29T22:29:48","modified_gmt":"2024-04-29T14:29:48","slug":"%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/","title":{"rendered":"\u8bd5\u8bd5 Terraform \u7684 Keycloak Provider"},"content":{"rendered":"<h1>\u9996\u5148<\/h1>\n<p>\u6211\u53d1\u73b0\u5728Terraform\u4e2d\u5b58\u5728Keycloak\u63d0\u4f9b\u8005\uff0c\u6240\u4ee5\u6211\u60f3\u8bd5\u8bd5\u3002\u5728Keycloak\u4e2d\uff0c\u5b58\u5728\u5bfc\u5165\/\u5bfc\u51faRealm\u4fe1\u606f\u7684\u529f\u80fd\uff0c\u4f46\u7531\u4e8e\u4f7f\u7528JSON\u5904\u7406\uff0c\u53ef\u8bfb\u6027\u7a0d\u5dee\u3002Terraform &#8211; Keycloak\u63d0\u4f9b\u8005\u5141\u8bb8\u4f7f\u7528HCL\u4ee5\u58f0\u660e\u65b9\u5f0f\u5b9a\u4e49Realm\u8bbe\u7f6e\uff0c\u6211\u4e2a\u4eba\u89c9\u5f97\u8fd9\u5f88\u68d2\u3002<\/p>\n<p>\u8fd9\u7bc7\u6587\u7ae0\u662f\u5728\u5047\u8bbe\u5df2\u7ecf\u5b89\u88c5\u597dKeycloak\u7684\u57fa\u7840\u4e0a\u8fdb\u884c\u64b0\u5199\u7684\u3002\u4e3a\u4e86\u66f4\u4e13\u6ce8\u4e8eKeycloak\u63d0\u4f9b\u8005\uff0c\u6211\u4eec\u5c06\u7701\u7565\u6709\u5173Terraform\u7684\u57fa\u7840\u77e5\u8bc6\u548c\u5173\u4e8eKeycloak\u7684\u89e3\u91ca\uff0c\u4ee5\u53ca\u6d89\u53ca\u5230\u7684\u6807\u51c6\u89c4\u8303\uff08\u5982OpenID Connect\u7b49\uff09\u7684\u89e3\u91ca\u3002<\/p>\n<h2>Terraform &#8211; Keycloak Provider \u7684\u8eab\u4efd\u9a8c\u8bc1<\/h2>\n<p>\u5728\u8bbe\u7f6eKeycloak\u7684\u914d\u7f6e\u4e4b\u524d\uff0cTerraform-Keycloak Provider\u9700\u8981\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\u3002\u6709\u4e24\u79cd\u65b9\u6cd5\u53ef\u4ee5\u5b9e\u73b0\uff1a\u4e00\u79cd\u662f\u4f7f\u7528admin-cli\u5ba2\u6237\u7aef\uff0c\u53e6\u4e00\u79cd\u662f\u4e3aTerraform\u521b\u5efa\u4e00\u4e2aOIDC(OpenID Connect)\u5ba2\u6237\u7aef\u3002<\/p>\n<blockquote><p>\u5ba2\u6237\u7aef\u51ed\u8bc1\u6388\u6743\u8bbe\u7f6e\uff08\u63a8\u8350\uff09<\/p><\/blockquote>\n<p>\u6839\u636e\u6240\u8ff0\uff0c\u5efa\u8bae\u521b\u5efa\u4e00\u4e2aOIDC\u5ba2\u6237\u7aef\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u4e3aTerraform\u521b\u5efa\u4e00\u4e2a\u5ba2\u6237\u7aef\u3002<\/p>\n<p>\u672c\u6b21\u64cd\u4f5c\u5c07\u4f7f\u7528 Terraform \u5275\u5efa Realm\uff0c\u56e0\u6b64\u5728\u4e3b\u8981 Realm \u4e0a\u5275\u5efa\u4ee5\u4e0b\u5ba2\u6236\u7aef\u3002\u5982\u679c\u53ea\u9700\u8981\u5728\u76f8\u61c9\u7684 Realm \u4e2d\u9032\u884c\u64cd\u4f5c\uff0c\u8acb\u5275\u5efa\u4e00\u500b OIDC \u5ba2\u6236\u7aef\u3002<\/p>\n<p>\u901a\u7528\u8bbe\u7f6e<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Client type: OpenID Connect<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Client ID: terraform<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Name: Terraform<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Description: Terraform Keycloak Provider<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Always display in console: off<\/ul>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d853a913a08637a6b886b\/10-0.png\" alt=\"image01.png\" \/><\/div>\n<p>\u80fd\u529b\u914d\u7f6e<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Client authentication: On<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Authorization: Off<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Authentication flow: Service accounts role \u306b\u30c1\u30a7\u30c3\u30af<\/ul>\n<p>\u8fd9\u662f\u4e3a\u4e86\u5b9e\u73b0OpenID Connect\u4e2d\u7684\u5ba2\u6237\u7aef\u51ed\u8bc1\u6d41\u800c\u8fdb\u884c\u7684\u8bbe\u7f6e\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d853a913a08637a6b886b\/14-0.png\" alt=\"image02.png\" \/><\/div>\n<p>\u4fdd\u5b58\u540e\uff0c\u53ef\u4ee5\u5728Credentials\u9009\u9879\u5361\u4e2d\u627e\u5230\u751f\u6210\u7684\u5ba2\u6237\u7aef\u5bc6\u94a5\uff0c\u5fc5\u987b\u5c06\u5176\u8bb0\u4e0b\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d853a913a08637a6b886b\/16-0.png\" alt=\"image03.png\" \/><\/div>\n<p>\u63a5\u4e0b\u6765\uff0c\u7ed9\u8be5\u5ba2\u6237\u5206\u914d\u7ba1\u7406\u5458\u89d2\u8272\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d853a913a08637a6b886b\/18-0.png\" alt=\"image04.png\" \/><\/div>\n<p>\u5982\u679c\u60f3\u8981\u9650\u5236\u5206\u914d\u89d2\u8272\uff0c\u8bf7\u53c2\u8003&#8221;\u5206\u914d\u89d2\u8272&#8221;\u8fdb\u884c\u8bbe\u7f6e\u3002<\/p>\n<h2>\u5199Terraform\u914d\u7f6e\u6587\u4ef6<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nx\">provider<\/span> <span class=\"s2\">\"keycloak\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">client_id<\/span>     <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">client_id<\/span>\r\n  <span class=\"nx\">client_secret<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">client_secret<\/span>\r\n  <span class=\"nx\">url<\/span>           <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">url<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">required_providers<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">keycloak<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">source<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"mrparkers\/keycloak\"<\/span>\r\n      <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;= 4.0.0\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nx\">variable<\/span> <span class=\"s2\">\"client_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Keycloak client_id for Terraform\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"client_secret\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Keycloak client_secret for Terraform\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"url\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Keycloak URL\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8bf7\u968f\u610f\u4f20\u5165\u9002\u5f53\u7684\u8f93\u5165\u53d8\u91cf\uff0c\u53ef\u4ee5\u662f\u73af\u5883\u53d8\u91cf\u6216*.tfvars\u6587\u4ef6\u3002<\/p>\n<p>\u7531\u65bcKeycloak Provider\u8207Keycloak\u4e4b\u9593\u7684\u9a57\u8b49\u5df2\u7d93\u5b8c\u6210\uff0c\u73fe\u5728\u70ba\u4e86\u9032\u884c\u64cd\u4f5c\u78ba\u8a8d\uff0c\u8b93\u6211\u5011\u5275\u5efa\u4e00\u500bRealm\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">#####<\/span>\r\n<span class=\"c1\"># Realm<\/span>\r\n<span class=\"nx\">locals<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">realm_id<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"example-realm\"<\/span> <span class=\"c1\"># \u3054\u81ea\u7531\u306a\u540d\u524d\u3067\u3069\u3046\u305e<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">resource<\/span> <span class=\"s2\">\"keycloak_realm\"<\/span> <span class=\"s2\">\"realm\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">realm<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">local<\/span><span class=\"err\">.<\/span><span class=\"nx\">realm_id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5f00\u59cb<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform init\r\n\r\nInitializing the backend...\r\n\r\nInitializing provider plugins...\r\n- Finding mrparkers\/keycloak versions matching <span class=\"s2\">\"&gt;= 4.0.0\"<\/span>...\r\n- Installing mrparkers\/keycloak v4.3.1...\r\n- Installed mrparkers\/keycloak v4.3.1 <span class=\"o\">(<\/span>self-signed, key ID C50867915E116CD2<span class=\"o\">)<\/span>\r\n\r\nPartner and community providers are signed by their developers.\r\nIf you<span class=\"s1\">'d like to know more about provider signing, you can read about it here:\r\nhttps:\/\/www.terraform.io\/docs\/cli\/plugins\/signing.html\r\n\r\nTerraform has created a lock file .terraform.lock.hcl to record the provider\r\nselections it made above. Include this file in your version control repository\r\nso that Terraform can guarantee to make the same selections by default when\r\nyou run \"terraform init\" in the future.\r\n\r\nTerraform has been successfully initialized!\r\n\r\nYou may now begin working with Terraform. Try running \"terraform plan\" to see\r\nany changes that are required for your infrastructure. All Terraform commands\r\nshould now work.\r\n\r\nIf you ever set or change modules or backend configuration for Terraform,\r\nrerun this command to reinitialize your working directory. If you forget, other\r\ncommands will detect it and remind you to do so if necessary.\r\n<\/span><\/code><\/pre>\n<p>\u8ba1\u5212<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform plan <span class=\"nt\">-var-file<\/span> variables.tfvars\r\n\r\nTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:\r\n  + create\r\n\r\nTerraform will perform the following actions:\r\n\r\n  <span class=\"c\"># keycloak_realm.realm will be created<\/span>\r\n  + resource <span class=\"s2\">\"keycloak_realm\"<\/span> <span class=\"s2\">\"realm\"<\/span> <span class=\"o\">{<\/span>\r\n      + access_code_lifespan                     <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + access_code_lifespan_login               <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + access_code_lifespan_user_action         <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + access_token_lifespan                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + access_token_lifespan_for_implicit_flow  <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + action_token_generated_by_admin_lifespan <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + action_token_generated_by_user_lifespan  <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + browser_flow                             <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + client_authentication_flow               <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + client_session_idle_timeout              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + client_session_max_lifespan              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + direct_grant_flow                        <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + docker_authentication_flow               <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + duplicate_emails_allowed                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + edit_username_allowed                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + enabled                                  <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span>\r\n      + <span class=\"nb\">id<\/span>                                       <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + internal_id                              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + login_with_email_allowed                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + oauth2_device_code_lifespan              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + oauth2_device_polling_interval           <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + offline_session_idle_timeout             <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + offline_session_max_lifespan             <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + offline_session_max_lifespan_enabled     <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + realm                                    <span class=\"o\">=<\/span> <span class=\"s2\">\"example-realm\"<\/span>\r\n      + refresh_token_max_reuse                  <span class=\"o\">=<\/span> 0\r\n      + registration_allowed                     <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + registration_email_as_username           <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + registration_flow                        <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + remember_me                              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + reset_credentials_flow                   <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + reset_password_allowed                   <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + revoke_refresh_token                     <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + ssl_required                             <span class=\"o\">=<\/span> <span class=\"s2\">\"external\"<\/span>\r\n      + sso_session_idle_timeout                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + sso_session_idle_timeout_remember_me     <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + sso_session_max_lifespan                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + sso_session_max_lifespan_remember_me     <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + user_managed_access                      <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + verify_email                             <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\nPlan: 1 to add, 0 to change, 0 to destroy.\r\n\r\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nNote: You didn<span class=\"s1\">'t use the -out option to save this plan, so Terraform can'<\/span>t guarantee to take exactly these actions <span class=\"k\">if <\/span>you run <span class=\"s2\">\"terraform apply\"<\/span> now.\r\n<\/code><\/pre>\n<p>\u7533\u8bf7<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform apply <span class=\"nt\">-var-file<\/span> variables.tfvars\r\n\r\nTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:\r\n  + create\r\n\r\nTerraform will perform the following actions:\r\n\r\n  <span class=\"c\"># keycloak_realm.realm will be created<\/span>\r\n  + resource <span class=\"s2\">\"keycloak_realm\"<\/span> <span class=\"s2\">\"realm\"<\/span> <span class=\"o\">{<\/span>\r\n      + access_code_lifespan                     <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + access_code_lifespan_login               <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + access_code_lifespan_user_action         <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + access_token_lifespan                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + access_token_lifespan_for_implicit_flow  <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + action_token_generated_by_admin_lifespan <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + action_token_generated_by_user_lifespan  <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + browser_flow                             <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + client_authentication_flow               <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + client_session_idle_timeout              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + client_session_max_lifespan              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + direct_grant_flow                        <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + docker_authentication_flow               <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + duplicate_emails_allowed                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + edit_username_allowed                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + enabled                                  <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span>\r\n      + <span class=\"nb\">id<\/span>                                       <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + internal_id                              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + login_with_email_allowed                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + oauth2_device_code_lifespan              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + oauth2_device_polling_interval           <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + offline_session_idle_timeout             <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + offline_session_max_lifespan             <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + offline_session_max_lifespan_enabled     <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + realm                                    <span class=\"o\">=<\/span> <span class=\"s2\">\"example-realm\"<\/span>\r\n      + refresh_token_max_reuse                  <span class=\"o\">=<\/span> 0\r\n      + registration_allowed                     <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + registration_email_as_username           <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + registration_flow                        <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + remember_me                              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + reset_credentials_flow                   <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + reset_password_allowed                   <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + revoke_refresh_token                     <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + ssl_required                             <span class=\"o\">=<\/span> <span class=\"s2\">\"external\"<\/span>\r\n      + sso_session_idle_timeout                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + sso_session_idle_timeout_remember_me     <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + sso_session_max_lifespan                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + sso_session_max_lifespan_remember_me     <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + user_managed_access                      <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + verify_email                             <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\nPlan: 1 to add, 0 to change, 0 to destroy.\r\n\r\nDo you want to perform these actions?\r\n  Terraform will perform the actions described above.\r\n  Only <span class=\"s1\">'yes'<\/span> will be accepted to approve.\r\n\r\n  Enter a value: <span class=\"nb\">yes\r\n\r\n<\/span>keycloak_realm.realm: Creating...\r\nkeycloak_realm.realm: Creation <span class=\"nb\">complete <\/span>after 5s <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>example-realm]\r\n\r\nApply <span class=\"nb\">complete<\/span><span class=\"o\">!<\/span> Resources: 1 added, 0 changed, 0 destroyed.\r\n<\/code><\/pre>\n<p>\u5f53\u67e5\u770b Realm \u7684\u5217\u8868\u65f6\uff0c\u53ef\u4ee5\u786e\u8ba4 example-realm \u5df2\u88ab\u5305\u542b\u5728\u5185\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d853a913a08637a6b886b\/33-0.png\" alt=\"image05.png\" \/><\/div>\n<h1>\u7ed3\u675f\u4e86<\/h1>\n<p>\u6211\u4f7f\u7528Terraform Keycloak Provider\u5c06Keycloak\u7684\u914d\u7f6e\u8f6c\u5316\u4e3a\u57fa\u7840\u8bbe\u65bd\u4ee3\u7801\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u5f53\u6211\u5c1d\u8bd5\u786e\u8ba4\u65f6\uff0c\u6211\u53d1\u73b0\u6709\u8bb8\u591a\u8d44\u6e90\u53ef\u7528\u3002\u4e0b\u6b21\u6211\u60f3\u4f7f\u7528Keycloak Provider\u6765\u521b\u5efa\u7528\u4e8eGrafana\u7684SSO\u7684Realm\u3001Group\u3001Member\u548cClient\u7b49\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u6211\u53d1\u73b0\u5728Terraform\u4e2d\u5b58\u5728Keycloak\u63d0\u4f9b\u8005\uff0c\u6240\u4ee5\u6211\u60f3\u8bd5\u8bd5\u3002\u5728Keycloak\u4e2d\uff0c\u5b58\u5728\u5bfc\u5165\/\u5bfc [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48442","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u8bd5\u8bd5 Terraform \u7684 Keycloak Provider - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u8bd5\u8bd5-terraform-\u7684-keycloak-provider\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u8bd5\u8bd5 Terraform \u7684 Keycloak Provider\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u6211\u53d1\u73b0\u5728Terraform\u4e2d\u5b58\u5728Keycloak\u63d0\u4f9b\u8005\uff0c\u6240\u4ee5\u6211\u60f3\u8bd5\u8bd5\u3002\u5728Keycloak\u4e2d\uff0c\u5b58\u5728\u5bfc\u5165\/\u5bfc [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u8bd5\u8bd5-terraform-\u7684-keycloak-provider\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-10T11:43:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T14:29:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d853a913a08637a6b886b\/10-0.png\" \/>\n<meta name=\"author\" content=\"\u9038, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u9038, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/\",\"name\":\"\u8bd5\u8bd5 Terraform \u7684 Keycloak Provider - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-07-10T11:43:59+00:00\",\"dateModified\":\"2024-04-29T14:29:48+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u8bd5\u8bd5 Terraform \u7684 Keycloak Provider\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\",\"name\":\"\u9038, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"caption\":\"\u9038, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u8bd5\u8bd5 Terraform \u7684 Keycloak Provider - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u8bd5\u8bd5-terraform-\u7684-keycloak-provider\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u8bd5\u8bd5 Terraform \u7684 Keycloak Provider","og_description":"\u9996\u5148 \u6211\u53d1\u73b0\u5728Terraform\u4e2d\u5b58\u5728Keycloak\u63d0\u4f9b\u8005\uff0c\u6240\u4ee5\u6211\u60f3\u8bd5\u8bd5\u3002\u5728Keycloak\u4e2d\uff0c\u5b58\u5728\u5bfc\u5165\/\u5bfc [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u8bd5\u8bd5-terraform-\u7684-keycloak-provider\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-07-10T11:43:59+00:00","article_modified_time":"2024-04-29T14:29:48+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d853a913a08637a6b886b\/10-0.png"}],"author":"\u9038, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u9038, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"5 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/","name":"\u8bd5\u8bd5 Terraform \u7684 Keycloak Provider - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-07-10T11:43:59+00:00","dateModified":"2024-04-29T14:29:48+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u8bd5\u8bd5 Terraform \u7684 Keycloak Provider"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487","name":"\u9038, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","caption":"\u9038, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e8%af%95-terraform-%e7%9a%84-keycloak-provider%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48442","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48442"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48442\/revisions"}],"predecessor-version":[{"id":88025,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48442\/revisions\/88025"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48442"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48442"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48442"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}