{"id":42855,"date":"2024-01-03T05:39:51","date_gmt":"2023-05-10T23:31:53","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/"},"modified":"2024-05-04T16:35:08","modified_gmt":"2024-05-04T08:35:08","slug":"%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/","title":{"rendered":"\u53ef\u4ee5\u4f7f\u7528 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408(v1.0.0)"},"content":{"rendered":"<h1>\u603b\u7ed3<\/h1>\n<p>\u770b\u5230 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u6536\u85cf\u96c6\u5408(v1.0.0)\u73b0\u5728\u53ef\u7528\uff0c\u6240\u4ee5\u6211\u8bd5\u4e86\u4e00\u4e0b\u3002<\/p>\n<h1>\u60c5\u62a5\u94fe\u63a5<\/h1>\n<ul class=\"post-ul\">twitter<\/ul>\n<p>&nbsp;<\/p>\n<p>\u6211\u5f88\u9ad8\u5174\u5730\u5ba3\u5e03\uff0cTerraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u96c6\u73b0\u5728\u53ef\u4f9b\u4f7f\u7528\u3002\u73b0\u5df2\u6210\u4e3a Ansible Automation Platform \u8ba2\u9605\u8ba1\u5212\u7684\u4e00\u90e8\u5206\uff0c\u5e76\u53ef\u4ee5\u5728 Automation Hub \u4e0a\u4f7f\u7528\u3002<\/p>\n<ul class=\"post-ul\">redhat<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">github<\/ul>\n<p>&nbsp;<\/p>\n<h1>\u5f15\u5165<\/h1>\n<pre class=\"post-pre\"><code>$ ansible-galaxy collection install cloud.terraform\r\nStarting galaxy collection install process\r\nProcess install dependency map\r\nStarting collection install process\r\nDownloading https:\/\/galaxy.ansible.com\/download\/cloud-terraform-1.0.0.tar.gz to \/home\/vagrant\/.ansible\/tmp\/ansible-local-29742d9psx0sz\/tmpulp0lvx7\/cloud-terraform-1.0.0-_hacx70x\r\nInstalling 'cloud.terraform:1.0.0' to '\/home\/vagrant\/.ansible\/collections\/ansible_collections\/cloud\/terraform'\r\ncloud.terraform:1.0.0 was installed successfully\r\n<\/code><\/pre>\n<h1>\u5c0e\u5165\u7684\u6587\u4ef6\u6a39\u7d50\u69cb<\/h1>\n<pre class=\"post-pre\"><code>$ tree ~\/.ansible\/collections\/ansible_collections\/ \r\n\/home\/vagrant\/.ansible\/collections\/ansible_collections\/\r\n|-- cloud\r\n|   `-- terraform\r\n|       |-- CHANGELOG.rst\r\n|       |-- FILES.json\r\n|       |-- LICENSE\r\n|       |-- MANIFEST.json\r\n|       |-- README.md\r\n|       |-- changelogs\r\n|       |   |-- changelog.yaml\r\n|       |   |-- config.yaml\r\n|       |   `-- fragments\r\n|       |       `-- 0001-initial.yml\r\n|       |-- docs\r\n|       |   `-- docsite\r\n|       |       `-- links.yml\r\n|       |-- meta\r\n|       |   `-- runtime.yml\r\n|       |-- plugins\r\n|       |   |-- module_utils\r\n|       |   |   `-- version.py\r\n|       |   `-- modules\r\n|       |       |-- terraform.py\r\n|       |       `-- terraform_output.py\r\n|       |-- requirements.txt\r\n|       |-- requirements.yml\r\n|       |-- roles\r\n|       |   |-- git_plan\r\n|       |   |   |-- README.md\r\n|       |   |   |-- meta\r\n|       |   |   |   `-- argument_specs.yml\r\n|       |   |   `-- tasks\r\n|       |   |       `-- main.yml\r\n|       |   `-- inventory_from_outputs\r\n|       |       |-- README.md\r\n|       |       |-- meta\r\n|       |       |   `-- argument_specs.yml\r\n|       |       `-- tasks\r\n|       |           `-- main.yml\r\n|       |-- test-requirements.txt\r\n|       `-- tests\r\n|           |-- integration\r\n|           |   `-- targets\r\n|           |       |-- action_groups\r\n|           |       |   |-- files\r\n|           |       |   |   `-- nothing.tf\r\n|           |       |   `-- tasks\r\n|           |       |       `-- main.yml\r\n|           |       |-- aws\r\n|           |       |   |-- files\r\n|           |       |   |   `-- cloud.tf\r\n|           |       |   `-- tasks\r\n|           |       |       `-- main.yml\r\n|           |       |-- azure\r\n|           |       |   |-- files\r\n|           |       |   |   `-- cloud.tf\r\n|           |       |   `-- tasks\r\n|           |       |       `-- main.yml\r\n|           |       |-- complex_variables\r\n|           |       |   |-- files\r\n|           |       |   |   |-- main.tf\r\n|           |       |   |   `-- variables.tf\r\n|           |       |   `-- tasks\r\n|           |       |       `-- main.yml\r\n|           |       |-- gcp\r\n|           |       |   |-- files\r\n|           |       |   |   `-- cloud.tf\r\n|           |       |   `-- tasks\r\n|           |       |       `-- main.yml\r\n|           |       |-- list_vars_passthrough\r\n|           |       |   |-- files\r\n|           |       |   |   `-- main.tf\r\n|           |       |   `-- tasks\r\n|           |       |       `-- main.yml\r\n|           |       |-- local\r\n|           |       |   |-- files\r\n|           |       |   |   `-- write_file.tf\r\n|           |       |   `-- tasks\r\n|           |       |       `-- main.yml\r\n|           |       |-- provider_upgrade\r\n|           |       |   |-- tasks\r\n|           |       |   |   |-- main.yml\r\n|           |       |   |   `-- test_provider_upgrade.yml\r\n|           |       |   |-- templates\r\n|           |       |   |   `-- main.tf.j2\r\n|           |       |   `-- vars\r\n|           |       |       `-- main.yml\r\n|           |       |-- state_planned\r\n|           |       |   |-- files\r\n|           |       |   |   `-- write_file.tf\r\n|           |       |   `-- tasks\r\n|           |       |       `-- main.yml\r\n|           |       |-- terraform_output\r\n|           |       |   |-- files\r\n|           |       |   |   `-- outputs.tf\r\n|           |       |   `-- tasks\r\n|           |       |       `-- main.yml\r\n|           |       |-- test_git_plan\r\n|           |       |   |-- files\r\n|           |       |   |   `-- write_file.tf\r\n|           |       |   `-- tasks\r\n|           |       |       `-- main.yml\r\n|           |       `-- test_inventory_from_outputs\r\n|           |           |-- files\r\n|           |           |   `-- create_inventory.tf\r\n|           |           `-- tasks\r\n|           |               `-- main.yml\r\n|           `-- unit\r\n|               |-- compat\r\n|               |   |-- __init__.py\r\n|               |   |-- builtins.py\r\n|               |   |-- mock.py\r\n|               |   `-- unittest.py\r\n|               `-- plugins\r\n|                   `-- modules\r\n|                       |-- cloud\r\n|                       |   `-- misc\r\n|                       |       `-- test_terraform.py\r\n|                       `-- utils.py\r\n`-- cloud.terraform-1.0.0.info\r\n    `-- GALAXY.yml\r\n\r\n64 directories, 56 files\r\n<\/code><\/pre>\n<p>\u5728\u4ee5\u4e0b\u7684\u73af\u5883\u4e2d\u8fdb\u884c\u8bd5\u9a8c\u3002<\/p>\n<h2>\u73af\u5883<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Red Hat Enterprise Linux 8.5 (Ootpa)<\/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\">ansible-6.3.0-1.el8.noarch<\/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\">ansible-core-2.13.3-1.el8.x86_64<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Terraform v1.3.6 on linux_amd64<\/ul>\n<h1>\u73a9\u6cd5\u624b\u518c\u4f8b\u5b50<\/h1>\n<pre class=\"post-pre\"><code><span class=\"nn\">---<\/span>\r\n<span class=\"pi\">-<\/span> <span class=\"na\">hosts<\/span><span class=\"pi\">:<\/span> <span class=\"s\">localhost<\/span>\r\n  <span class=\"na\">gather_facts<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">false<\/span>\r\n\r\n  <span class=\"na\">vars<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">project_dir<\/span><span class=\"pi\">:<\/span> <span class=\"s\">terraform\/<\/span>    <span class=\"c1\"># \u6700\u5f8c\u306e\/\u304c\u5fc5\u8981<\/span>\r\n\r\n  <span class=\"na\">tasks<\/span><span class=\"pi\">:<\/span>\r\n\r\n  <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Basic deploy of a service<\/span>\r\n    <span class=\"na\">cloud.terraform.terraform<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">project_path<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">project_dir<\/span> <span class=\"s\">}}\"<\/span>\r\n      <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">present<\/span>\r\n      <span class=\"na\">force_init<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">output<\/span> <span class=\"s2\">\"test\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Hello Terraform!\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>[defaults]\r\nverbosity = 1\r\nstdout_callback = ansible.posix.debug\r\n<\/code><\/pre>\n<p>\u5728ansible-galaxy\u96c6\u5408\u5b89\u88c5ansible.posix\u7684\u8fc7\u7a0b\u4e2d\uff0c\u5f15\u5165\u4e86ansible.posix.debug\u6a21\u5757\u3002<\/p>\n<h1>\u6267\u884cPlaybook<\/h1>\n<h2>\u9996\u6b21<\/h2>\n<pre class=\"post-pre\"><code>$ ansible-playbook site.yml\r\nUsing \/home\/vagrant\/repo\/terraform-collection-test\/ansible.cfg as config file\r\n[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'\r\n[WARNING]: An error occurred while calling ansible.utils.display.initialize_locale (unsupported locale setting). This may result in incorrectly calculated text widths that can cause Display\r\nto print incorrect line lengths\r\n\r\nPLAY [localhost] *****************************************************************************************************************************************************************************\r\n\r\nTASK [Basic deploy of a service] *************************************************************************************************************************************************************\r\nchanged: [localhost] =&gt; {\r\n    \"changed\": true,\r\n    \"command\": \"\/usr\/bin\/terraform apply -no-color -input=false -auto-approve -lock=true \/tmp\/tmph6h9tryt.tfplan\",\r\n    \"outputs\": {\r\n        \"test\": {\r\n            \"sensitive\": false,\r\n            \"type\": \"string\",\r\n            \"value\": \"Hello Terraform!\"\r\n        }\r\n    },\r\n    \"state\": \"present\",\r\n    \"workspace\": \"default\"\r\n}\r\n\r\nSTDOUT:\r\n\r\n\r\nApply complete! Resources: 0 added, 0 changed, 0 destroyed.\r\n\r\nOutputs:\r\n\r\ntest = \"Hello Terraform!\"\r\n\r\n\r\nPLAY RECAP ***********************************************************************************************************************************************************************************\r\nlocalhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   \r\n<\/code><\/pre>\n<p>\u6309\u539f\u610f\u7ed3\u679c\u5df2\u7ecf\u83b7\u5f97\u3002<br \/>\n\u5728 \/tmp \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u7c7b\u4f3c\u4e8e \/tmp\/tmph6h9tryt.tfplan \u7684 tfplan \u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>```\r\n<\/code><\/pre>\n<p>\u53ea\u9700\u8981\u4e00\u4e2a\u9009\u9879\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e0a\u8ff0\u5185\u5bb9\u7684\u4e2d\u6587\u672c\u5730\u5316\u6539\u5199\uff1a<\/p>\n<p>$ tree -a .<br \/>\n.<br \/>\n\u251c\u2500\u2500 ansible.cfg<br \/>\n\u251c\u2500\u2500 site.yml<br \/>\n\u2514\u2500\u2500 terraform<br \/>\n\u251c\u2500\u2500 output.tf<br \/>\n\u2514\u2500\u2500 terraform.tfstate<\/p>\n<p>\u4e00\u4e2a\u76ee\u5f55\uff0c\u4e94\u4e2a\u6587\u4ef6<\/p>\n<pre class=\"post-pre\"><code>\u4eca\u56de\u306f\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3092\u69cb\u6210\u3057\u3066\u3044\u306a\u3044\u306e\u3067\u3001terraform.tfstate\u30d5\u30a1\u30a4\u30eb\u304c\u4f5c\u6210\u3055\u308c\u3066\u3044\u308b\u3002\r\n\r\n```json:.\/terraform\/terraform.tfstate\r\n{\r\n  \"version\": 4,\r\n  \"terraform_version\": \"1.3.6\",\r\n  \"serial\": 1,\r\n  \"lineage\": \"32d997f1-7e25-9783-9ce9-c7d753ee5086\",\r\n  \"outputs\": {\r\n    \"test\": {\r\n      \"value\": \"Hello Terraform!\",\r\n      \"type\": \"string\"\r\n    }\r\n  },\r\n  \"resources\": [],\r\n  \"check_results\": null\r\n}\r\n<\/code><\/pre>\n<h2>\u7b2c\u4e8c\u6b21<\/h2>\n<pre class=\"post-pre\"><code>$ ansible-playbook site.yml\r\nUsing \/home\/vagrant\/repo\/terraform-collection-test\/ansible.cfg as config file\r\n[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'\r\n[WARNING]: An error occurred while calling ansible.utils.display.initialize_locale (unsupported locale setting). This may result in incorrectly calculated text widths that can cause Display\r\nto print incorrect line lengths\r\n\r\nPLAY [localhost] *****************************************************************************************************************************************************************************\r\n\r\nTASK [Basic deploy of a service] *************************************************************************************************************************************************************\r\nok: [localhost] =&gt; {\r\n    \"changed\": false,\r\n    \"command\": \"\/usr\/bin\/terraform apply -no-color -input=false -auto-approve -lock=true \/tmp\/tmpfnyqh4yc.tfplan\",\r\n    \"outputs\": {\r\n        \"test\": {\r\n            \"sensitive\": false,\r\n            \"type\": \"string\",\r\n            \"value\": \"Hello Terraform!\"\r\n        }\r\n    },\r\n    \"state\": \"present\",\r\n    \"workspace\": \"default\"\r\n}\r\n\r\nSTDOUT:\r\n\r\n\r\nNo changes. Your infrastructure matches the configuration.\r\n\r\nTerraform has compared your real infrastructure against your configuration\r\nand found no differences, so no changes are needed.\r\n\r\n\r\nPLAY RECAP ***********************************************************************************************************************************************************************************\r\nlocalhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   \r\n<\/code><\/pre>\n<p>\u5728\u6ce8\u518c\u8868\u53d8\u91cf\u4e2d\u63d0\u53d6\u7684\u5185\u5bb9\u4e2d\u5305\u62ec outputs\uff0c\u4f46\u7531\u4e8e\u6ca1\u6709\u4efb\u4f55\u66f4\u6539\uff0c\u6240\u4ee5\u5728 STDOUT \u4e2d\u4e0d\u5305\u542b outputs\u3002<br \/>\n\u5f53\u5220\u9664 terraform.tfstate \u5e76\u6267\u884c\u65f6\uff0cSTDOUT \u5c06\u663e\u793a outputs\u3002<\/p>\n<h1>\u53c2\u8003\u8d44\u6599: ansible-doc cloud.terraform.terraform<\/h1>\n<pre class=\"post-pre\"><code>$ ansible-doc cloud.terraform.terraform\r\nUsing \/home\/hiro\/repo\/terraform-ansible\/ansible.cfg as config file\r\n&gt; CLOUD.TERRAFORM.TERRAFORM    (\/home\/hiro\/.ansible\/collections\/ansible_collections\/cloud\/terraform\/plugins\/modules\/terraform.py)\r\n\r\n        Provides support for deploying resources with Terraform and\r\n        pulling resource information back into Ansible.\r\n\r\nOPTIONS (= is mandatory):\r\n\r\n- backend_config\r\n        A group of key-values to provide at init stage to the\r\n        -backend-config parameter.\r\n        \"default\": !!null \"null\"\r\n        \"type\": \"dict\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- backend_config_files\r\n        The path to a configuration file to provide at init state to\r\n        the -backend-config parameter. This can accept a list of paths\r\n        to multiple configuration files.\r\n        \"default\": !!null \"null\"\r\n        \"elements\": \"path\"\r\n        \"type\": \"list\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- binary_path\r\n        The path of a terraform binary to use.\r\n        \"default\": !!null \"null\"\r\n        \"type\": \"path\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- check_destroy\r\n        Apply only when no resources are destroyed. Note that this\r\n        only prevents \"destroy\" actions, but not \"destroy and re-\r\n        create\" actions. This option is ignored when `state=absent'.\r\n        \"default\": !!bool \"false\"\r\n        \"type\": \"bool\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- complex_vars\r\n        Enable\/disable capability to handle complex variable\r\n        structures for `terraform'.\r\n        If `true' the `variables' also accepts dictionaries, lists,\r\n        and booleans to be passed to `terraform'. Strings that are\r\n        passed are correctly quoted.\r\n        When disabled, supports only simple variables (strings,\r\n        integers, and floats), and passes them on unquoted.\r\n        \"default\": !!bool \"false\"\r\n        \"type\": \"bool\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- force_init\r\n        To avoid duplicating infra, if a state file can't be found\r\n        this will force a `terraform init'. Generally, this should be\r\n        turned off unless you intend to provision an entirely new\r\n        Terraform deployment.\r\n        \"default\": !!bool \"false\"\r\n        \"type\": \"bool\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- init_reconfigure\r\n        Forces backend reconfiguration during init.\r\n        \"default\": !!bool \"false\"\r\n        \"type\": \"bool\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- lock\r\n        Enable statefile locking, if you use a service that accepts\r\n        locks (such as S3+DynamoDB) to store your statefile.\r\n        \"default\": !!bool \"true\"\r\n        \"type\": \"bool\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- lock_timeout\r\n        How long to maintain the lock on the statefile, if you use a\r\n        service that accepts locks (such as S3+DynamoDB).\r\n        \"default\": !!null \"null\"\r\n        \"type\": \"int\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- overwrite_init\r\n        Run init even if `.terraform\/terraform.tfstate' already exists\r\n        in `project_path'.\r\n        \"default\": !!bool \"true\"\r\n        \"type\": \"bool\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- parallelism\r\n        Restrict concurrent operations when Terraform applies the\r\n        plan.\r\n        \"default\": !!null \"null\"\r\n        \"type\": \"int\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- plan_file\r\n        The path to an existing Terraform plan file to apply. If this\r\n        is not specified, Ansible will build a new TF plan and execute\r\n        it.\r\n        Note that this option is required if 'state' has the 'planned'\r\n        value. In this case, the plan file is only generated, but not\r\n        applied.\r\n        \"default\": !!null \"null\"\r\n        \"type\": \"path\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- plugin_paths\r\n        List of paths containing Terraform plugin executable files.\r\n        Plugin executables can be downloaded from\r\n        https:\/\/releases.hashicorp.com\/.\r\n        When set, the plugin discovery and auto-download behavior of\r\n        Terraform is disabled.\r\n        The directory structure in the plugin path can be tricky. The\r\n        Terraform docs\r\n        https:\/\/learn.hashicorp.com\/tutorials\/terraform\/automate-\r\n        terraform#pre-installed-plugins show a simple directory of\r\n        files, but actually, the directory structure has to follow the\r\n        same structure you would see if Terraform auto-downloaded the\r\n        plugins. See the examples below for a tree output of an\r\n        example plugin directory.\r\n        \"default\": !!null \"null\"\r\n        \"elements\": \"path\"\r\n        \"type\": \"list\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n= project_path\r\n        The path to the root of the Terraform directory with the\r\n        vars.tf\/main.tf\/etc to use.\r\n        \"type\": \"path\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- provider_upgrade\r\n        Allows Terraform init to upgrade providers to versions\r\n        specified in the project's version constraints.\r\n        \"default\": !!bool \"false\"\r\n        \"type\": \"bool\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- purge_workspace\r\n        Only works with state = absent\r\n        If true, the workspace will be deleted after the \"terraform\r\n        destroy\" action.\r\n        The 'default' workspace will not be deleted.\r\n        \"default\": !!bool \"false\"\r\n        \"type\": \"bool\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- state\r\n        Goal state of given stage\/project.\r\n        Option `planned` is deprecated. Its function is equivalent to\r\n        running the module in check mode.\r\n        choices: [\"present\", \"absent\", \"planned\"]\r\n        \"default\": \"present\"\r\n        \"type\": \"str\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- state_file\r\n        The path to an existing Terraform state file to use when\r\n        building plan. If this is not specified, the default\r\n        `terraform.tfstate' will be used.\r\n        This option is ignored when plan is specified.\r\n        \"default\": !!null \"null\"\r\n        \"type\": \"path\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- targets\r\n        A list of specific resources to target in this\r\n        plan\/application. The resources selected here will also auto-\r\n        include any dependencies.\r\n        \"default\": !!null \"null\"\r\n        \"elements\": \"str\"\r\n        \"type\": \"list\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- variables\r\n        A group of key-values pairs to override template variables or\r\n        those in variables files. By default, only string and number\r\n        values are allowed, which are passed on unquoted.\r\n        Support complex variable structures (lists, dictionaries,\r\n        numbers, and booleans) to reflect terraform variable syntax\r\n        when `complex_vars=true'.\r\n        Ansible integers or floats are mapped to terraform numbers.\r\n        Ansible strings are mapped to terraform strings.\r\n        Ansible dictionaries are mapped to terraform objects.\r\n        Ansible lists are mapped to terraform lists.\r\n        Ansible booleans are mapped to terraform booleans.\r\n        *Note* passwords passed as variables will be visible in the\r\n        log output. Make sure to use `no_log=true' in production!\r\n        \"default\": !!null \"null\"\r\n        \"type\": \"dict\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- variables_files\r\n        The path to a variables file for Terraform to fill into the TF\r\n        configurations. This can accept a list of paths to multiple\r\n        variables files.\r\n        Up until Ansible 2.9, this option was usable as\r\n        `variables_file'.\r\n        aliases: [\"variables_file\"]\r\n        \"default\": !!null \"null\"\r\n        \"elements\": \"path\"\r\n        \"type\": \"list\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n- workspace\r\n        The terraform workspace to work with.\r\n        \"default\": \"default\"\r\n        \"type\": \"str\"\r\n        added in: version 1.0.0 of cloud.terraform\r\n\r\n\r\n\r\nNOTES:\r\n      * To just run a `terraform plan', use check mode.\r\n\r\n\r\nREQUIREMENTS:  terraform\r\n\r\nAUTHOR: Ryan Scott Brown (@ryansb)\r\n\r\nEXAMPLES:\r\n\r\n- name: Basic deploy of a service\r\n  cloud.terraform.terraform:\r\n    project_path: '{{ project_dir }}'\r\n    state: present\r\n\r\n- name: Define the backend configuration at init\r\n  cloud.terraform.terraform:\r\n    project_path: 'project\/'\r\n    state: \"{{ state }}\"\r\n    force_init: true\r\n    backend_config:\r\n      region: \"eu-west-1\"\r\n      bucket: \"some-bucket\"\r\n      key: \"random.tfstate\"\r\n\r\n- name: Define the backend configuration with one or more files at init\r\n  cloud.terraform.terraform:\r\n    project_path: 'project\/'\r\n    state: \"{{ state }}\"\r\n    force_init: true\r\n    backend_config_files:\r\n      - \/path\/to\/backend_config_file_1\r\n      - \/path\/to\/backend_config_file_2\r\n\r\n- name: Disable plugin discovery and auto-download by setting plugin_paths\r\n  cloud.terraform.terraform:\r\n    project_path: 'project\/'\r\n    state: \"{{ state }}\"\r\n    force_init: true\r\n    plugin_paths:\r\n      - \/path\/to\/plugins_dir_1\r\n      - \/path\/to\/plugins_dir_2\r\n\r\n- name: Complex variables example\r\n  cloud.terraform.terraform:\r\n    project_path: '{{ project_dir }}'\r\n    state: present\r\n    camplex_vars: true\r\n    variables:\r\n      vm_name: \"{{ inventory_hostname }}\"\r\n      vm_vcpus: 2\r\n      vm_mem: 2048\r\n      vm_additional_disks:\r\n        - label: \"Third Disk\"\r\n          size: 40\r\n          thin_provisioned: true\r\n          unit_number: 2\r\n        - label: \"Fourth Disk\"\r\n          size: 22\r\n          thin_provisioned: true\r\n          unit_number: 3\r\n    force_init: true\r\n\r\n### Example directory structure for plugin_paths example\r\n# $ tree \/path\/to\/plugins_dir_1\r\n# \/path\/to\/plugins_dir_1\/\r\n# \u2514\u2500\u2500 registry.terraform.io\r\n#     \u2514\u2500\u2500 hashicorp\r\n#         \u2514\u2500\u2500 vsphere\r\n#             \u251c\u2500\u2500 1.24.0\r\n#             \u2502   \u2514\u2500\u2500 linux_amd64\r\n#             \u2502       \u2514\u2500\u2500 terraform-provider-vsphere_v1.24.0_x4\r\n#             \u2514\u2500\u2500 1.26.0\r\n#                 \u2514\u2500\u2500 linux_amd64\r\n#                     \u2514\u2500\u2500 terraform-provider-vsphere_v1.26.0_x4\r\n\r\n\r\nRETURN VALUES:\r\n- command\r\n        Full `terraform' command built by this module, in case you\r\n        want to re-run the command outside the module or debug a\r\n        problem.\r\n        \"returned\": \"always\"\r\n        \"sample\": \"terraform apply ...\"\r\n        \"type\": \"str\"\r\n\r\n- outputs\r\n        A dictionary of all the TF outputs by their assigned name. Use\r\n        `.outputs.MyOutputName.value' to access the value.\r\n        \"returned\": \"on success\"\r\n        \"sample\": \"{\\\"bukkit_arn\\\": {\\\"sensitive\\\": false, \\\"type\\\": \\\"string\\\", \\\"value\\\"\\\r\n          : \\\"arn:aws:s3:::tf-test-bukkit\\\"}\"\r\n        \"type\": \"complex\"\r\n\r\n        CONTAINS:\r\n\r\n        - sensitive\r\n            Whether Terraform has marked this value as sensitive\r\n            \"returned\": \"always\"\r\n            \"type\": \"bool\"\r\n\r\n        - type\r\n            The type of the value (string, int, etc)\r\n            \"returned\": \"always\"\r\n            \"type\": \"str\"\r\n\r\n        - value\r\n            The value of the output as interpolated by Terraform\r\n            \"returned\": \"always\"\r\n            \"type\": \"str\"\r\n\r\n- stdout\r\n        Full `terraform' command stdout, in case you want to display\r\n        it or examine the event log\r\n        \"returned\": \"always\"\r\n        \"sample\": \"\"\r\n        \"type\": \"str\"\r\n\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u603b\u7ed3 \u770b\u5230 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u6536\u85cf\u96c6\u5408(v1.0.0)\u73b0\u5728\u53ef\u7528\uff0c\u6240\u4ee5\u6211\u8bd5\u4e86\u4e00\u4e0b [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-42855","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>\u53ef\u4ee5\u4f7f\u7528 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408(v1.0.0) - 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\/\u53ef\u4ee5\u4f7f\u7528-terraform-\u7528\u7684-ansible-\u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408v1-0-0\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u53ef\u4ee5\u4f7f\u7528 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408(v1.0.0)\" \/>\n<meta property=\"og:description\" content=\"\u603b\u7ed3 \u770b\u5230 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u6536\u85cf\u96c6\u5408(v1.0.0)\u73b0\u5728\u53ef\u7528\uff0c\u6240\u4ee5\u6211\u8bd5\u4e86\u4e00\u4e0b [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u53ef\u4ee5\u4f7f\u7528-terraform-\u7528\u7684-ansible-\u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408v1-0-0\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-10T23:31:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T08:35:08+00:00\" \/>\n<meta name=\"author\" content=\"\u97f5, \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=\"\u97f5, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 \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\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/\",\"name\":\"\u53ef\u4ee5\u4f7f\u7528 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408(v1.0.0) - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-05-10T23:31:53+00:00\",\"dateModified\":\"2024-05-04T08:35:08+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u53ef\u4ee5\u4f7f\u7528 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408(v1.0.0)\"}]},{\"@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\/6530331a63adef3b3443a1fab53a0e6e\",\"name\":\"\u97f5, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g\",\"caption\":\"\u97f5, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunke\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u53ef\u4ee5\u4f7f\u7528 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408(v1.0.0) - 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\/\u53ef\u4ee5\u4f7f\u7528-terraform-\u7528\u7684-ansible-\u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408v1-0-0\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u53ef\u4ee5\u4f7f\u7528 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408(v1.0.0)","og_description":"\u603b\u7ed3 \u770b\u5230 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u6536\u85cf\u96c6\u5408(v1.0.0)\u73b0\u5728\u53ef\u7528\uff0c\u6240\u4ee5\u6211\u8bd5\u4e86\u4e00\u4e0b [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u53ef\u4ee5\u4f7f\u7528-terraform-\u7528\u7684-ansible-\u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408v1-0-0\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-05-10T23:31:53+00:00","article_modified_time":"2024-05-04T08:35:08+00:00","author":"\u97f5, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u97f5, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"11 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/","name":"\u53ef\u4ee5\u4f7f\u7528 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408(v1.0.0) - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-05-10T23:31:53+00:00","dateModified":"2024-05-04T08:35:08+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u53ef\u4ee5\u4f7f\u7528 Terraform \u7528\u7684 Ansible \u8ba4\u8bc1\u5185\u5bb9\u96c6\u5408(v1.0.0)"}]},{"@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\/6530331a63adef3b3443a1fab53a0e6e","name":"\u97f5, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g","caption":"\u97f5, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunke\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8-terraform-%e7%94%a8%e7%9a%84-ansible-%e8%ae%a4%e8%af%81%e5%86%85%e5%ae%b9%e9%9b%86%e5%90%88v1-0-0%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\/42855","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\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=42855"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42855\/revisions"}],"predecessor-version":[{"id":99449,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42855\/revisions\/99449"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=42855"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=42855"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=42855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}