{"id":42270,"date":"2022-12-27T13:52:04","date_gmt":"2023-06-01T18:58:21","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/"},"modified":"2024-01-15T11:21:12","modified_gmt":"2024-01-15T03:21:12","slug":"%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/","title":{"rendered":"\u8bd5\u7528Terraform\u7684Ansible\u63d0\u4f9b\u5546"},"content":{"rendered":"<p>Terraform\u7684Ansible\u63d0\u4f9b\u8005\u5df2\u7ecf\u53d1\u5e03\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u901a\u8fc7\u8fd9\u6837\u505a\uff0c\u6211\u4eec\u53ef\u4ee5\u52a8\u6001\u5730\u4ecetfstate\u6587\u4ef6\u751f\u6210Ansible inventory\uff0c\u975e\u5e38\u65b9\u4fbf\u3002\u4e3a\u4e86\u6d4b\u8bd5\u65b9\u4fbf\uff0c\u6211\u4f1a\u5728Sakura Cloud\u4e0a\u8bd5\u4e00\u8bd5\u3002<\/p>\n<p>\u4ee5\u4e0b\u662f\u5bf9\u7ed9\u51fa\u94fe\u63a5\u7684\u7b80\u8981\u63cf\u8ff0\uff1a<\/p>\n<p>1. https:\/\/www.ansible.com\/blog\/providing-terraform-with-that-ansible-magic<br \/>\n\u63d0\u4f9b Terraform \u4e0e Ansible \u7b49\u9b54\u529b\u7684\u535a\u5ba2\u6587\u7ae0\u3002<\/p>\n<p>2. https:\/\/github.com\/ansible\/terraform-provider-ansible<br \/>\nAnsible Terraform \u63d0\u4f9b\u8005\u7684 GitHub \u4ed3\u5e93\u3002<\/p>\n<p>3. https:\/\/registry.terraform.io\/providers\/ansible\/ansible\/latest\/docs<br \/>\nAnsible \u6700\u65b0\u7248\u672c\u7684 Terraform \u63d0\u4f9b\u8005\u6587\u6863\u3002<\/p>\n<p>\u672c\u6b21\u4ee5\u5728Ubuntu\u670d\u52a1\u5668\u4e0a\u642d\u5efaWeb\u670d\u52a1\u5668\u7684\u573a\u666f\u4e3a\u4f8b\u8fdb\u884c\u3002<\/p>\n<h1>\u9884\u5148\u51c6\u5907<\/h1>\n<h2>\u51c6\u5907\u571f\u5730\u5f00\u57a6<\/h2>\n<p>\u8bf7\u6839\u636e\u4ee5\u4e0b\u94fe\u63a5\u63d0\u4f9b\u7684\u6307\u793a\u8fdb\u884c\u51c6\u5907\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u4f5c\u8005\u5c06\u4f7f\u7528\u4ee5\u4e0b\u7248\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> terraform version\r\n<span class=\"go\">Terraform v1.4.0\r\n<\/span><\/code><\/pre>\n<h2>\u786e\u8ba4Python\u7684\u7248\u672c<\/h2>\n<p>\u6211\u4f7f\u7528\u7684Python\u7248\u672c\u662f3.8\u6216\u66f4\u9ad8\u7248\u672c\u3002<\/p>\n<p>\u6211\u5c06\u4f7f\u7528\u4ee5\u4e0b\u7248\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> python <span class=\"nt\">-V<\/span>\r\n<span class=\"go\">Python 3.10.11\r\n<\/span><\/code><\/pre>\n<h2>\u5b89\u88c5Ansible\u548c\u6a21\u5757\u3002<\/h2>\n<pre class=\"post-pre\"><code>pip <span class=\"nb\">install <\/span>ansible\r\nansible-galaxy collection <span class=\"nb\">install <\/span>cloud.terraform\r\n<\/code><\/pre>\n<h2>\u7528\u4e8e\u4f7f\u7528Ansible\u8fdb\u884cSSH\u8fde\u63a5\u7684\u5bc6\u94a5\u751f\u6210<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>ssh-keygen <span class=\"nt\">-f<\/span> .\/id_rsa\r\n<\/code><\/pre>\n<h1>1. \u51c6\u5907\u6240\u9700\u6587\u4ef6<\/h1>\n<p>\u51c6\u5907\u4ee5\u4e0b\u56db\u4e2a\u6587\u4ef6\u3002<\/p>\n<p>\u6211\u628a\u5b83\u653e\u5728\u8fd9\u4e2a\u4ee3\u7801\u5e93\u4e2d\u3002<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code>$ ls -1\r\nansible.cfg\r\ninventory.yml\r\nmain.tf\r\nplaybook.yml\r\n<\/code><\/pre>\n<h2>ansible.cfg\u6587\u4ef6<\/h2>\n<p>\u4e3a\u4e86\u907f\u514dansible\u5728\u6267\u884c\u65f6\u51fa\u73b0\u4e0eSSH\u8fde\u63a5\u76f8\u5173\u7684\u8b66\u544a\u548c\u786e\u8ba4\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code>[<span class=\"n\">ssh_connection<\/span>]\r\n<span class=\"n\">ssh_args<\/span> = -<span class=\"n\">o<\/span> <span class=\"n\">ControlMaster<\/span>=<span class=\"n\">auto<\/span> -<span class=\"n\">o<\/span> <span class=\"n\">ControlPersist<\/span>=<span class=\"m\">60<\/span><span class=\"n\">s<\/span> -<span class=\"n\">o<\/span> <span class=\"n\">StrictHostKeyChecking<\/span>=<span class=\"n\">no<\/span> -<span class=\"n\">o<\/span> <span class=\"n\">UserKnownHostsFile<\/span>=\/<span class=\"n\">dev<\/span>\/<span class=\"n\">null<\/span>\r\n<\/code><\/pre>\n<h2>\u5b58\u8d27.yml<\/h2>\n<p>\u4f7f\u7528Ansible\u6765\u53c2\u8003tfstate\u6587\u4ef6\u4e2d\u7684\u503c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">plugin<\/span><span class=\"pi\">:<\/span> <span class=\"s\">cloud.terraform.terraform_provider<\/span>\r\n<\/code><\/pre>\n<h2>\u4e3b\u8981.tf<\/h2>\n<p>\u4ee5\u4e0b\u662f\u7528\u4e8e\u5728Sakura Cloud \u4e0a\u521b\u5efa\u670d\u52a1\u5668\u7684 tf \u6587\u4ef6\u3002\u6b64\u5916\uff0c\u6211\u4eec\u8fd8\u5b9a\u4e49\u4e86 ansible_host \u8d44\u6e90\uff0c\u4ee5\u4fbf\u4ece tfstate \u751f\u6210 ansible inventory\u3002<\/p>\n<pre class=\"post-pre\"><code><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\">ansible<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">source<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"ansible\/ansible\"<\/span>\r\n      <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"~&gt; 1.0.0\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"nx\">sakuracloud<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">source<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"sacloud\/sakuracloud\"<\/span>\r\n      <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"2.17.0\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">provider<\/span> <span class=\"s2\">\"sakuracloud\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">token<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"YOUR_TOKEN\"<\/span>\r\n  <span class=\"nx\">secret<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"YOUR_TOKEN_SECRET\"<\/span>\r\n  <span class=\"nx\">zone<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"tk1a\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"password\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"P@ssw0rd\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">data<\/span> <span class=\"s2\">\"sakuracloud_archive\"<\/span> <span class=\"s2\">\"ubuntu\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">os_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ubuntu2004\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">resource<\/span> <span class=\"s2\">\"sakuracloud_disk\"<\/span> <span class=\"s2\">\"web_server\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"Web Server\"<\/span>\r\n  <span class=\"nx\">source_archive_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">data<\/span><span class=\"err\">.<\/span><span class=\"nx\">sakuracloud_archive<\/span><span class=\"err\">.<\/span><span class=\"nx\">ubuntu<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">resource<\/span> <span class=\"s2\">\"sakuracloud_server\"<\/span> <span class=\"s2\">\"web_server\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"Web Server\"<\/span>\r\n  <span class=\"nx\">disks<\/span>       <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"nx\">sakuracloud_disk<\/span><span class=\"err\">.<\/span><span class=\"nx\">web_server<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">core<\/span>        <span class=\"p\">=<\/span> <span class=\"mi\">1<\/span>\r\n  <span class=\"nx\">memory<\/span>      <span class=\"p\">=<\/span> <span class=\"mi\">2<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"nginx\"<\/span>\r\n\r\n  <span class=\"nx\">network_interface<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">upstream<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"shared\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">disk_edit_parameter<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">hostname<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"web-server\"<\/span>\r\n    <span class=\"nx\">password<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">password<\/span>\r\n    <span class=\"nx\">ssh_key_ids<\/span>     <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"nx\">sakuracloud_ssh_key<\/span><span class=\"err\">.<\/span><span class=\"nx\">key<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">disable_pw_auth<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">resource<\/span> <span class=\"s2\">\"sakuracloud_ssh_key\"<\/span> <span class=\"s2\">\"key\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"key\"<\/span>\r\n  <span class=\"nx\">public_key<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">file<\/span><span class=\"err\">(<\/span><span class=\"s2\">\".\/id_rsa.pub\"<\/span><span class=\"err\">)<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">resource<\/span> <span class=\"s2\">\"ansible_host\"<\/span> <span class=\"s2\">\"web_server\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>   <span class=\"p\">=<\/span> <span class=\"nx\">sakuracloud_server<\/span><span class=\"err\">.<\/span><span class=\"nx\">web_server<\/span><span class=\"err\">.<\/span><span class=\"nx\">ip_address<\/span>\r\n  <span class=\"nx\">groups<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"web\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">variables<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">ansible_user<\/span>                 <span class=\"p\">=<\/span> <span class=\"s2\">\"ubuntu\"<\/span><span class=\"err\">,<\/span>\r\n    <span class=\"nx\">ansible_ssh_private_key_file<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\".\/id_rsa\"<\/span><span class=\"err\">,<\/span>\r\n    <span class=\"nx\">ansible_python_interpreter<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"\/usr\/bin\/python3\"<\/span>\r\n    <span class=\"nx\">ansible_become<\/span>               <span class=\"p\">=<\/span> <span class=\"s2\">\"yes\"<\/span>\r\n    <span class=\"nx\">ansible_become_method<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"sudo\"<\/span>\r\n    <span class=\"nx\">ansible_become_pass<\/span>          <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">password<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u5267\u672c.yml<\/h2>\n<p>\u5b89\u88c5Web\u670d\u52a1\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">hosts<\/span><span class=\"pi\">:<\/span> <span class=\"s\">web<\/span>\r\n  <span class=\"na\">tasks<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">apt update<\/span>\r\n      <span class=\"na\">apt<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">update_cache<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">install nginx<\/span>\r\n      <span class=\"na\">apt<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx<\/span>\r\n        <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">present<\/span>\r\n<\/code><\/pre>\n<h1>2.\u6267\u884cterraform init<\/h1>\n<p>\u5c06\u4f1a\u5b89\u88c5SakuraCloud\u548cAnsible\u4f9b\u5e94\u5546\u3002<\/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 sacloud\/sakuracloud versions matching <span class=\"s2\">\"2.17.0\"<\/span>...\r\n- Finding ansible\/ansible versions matching <span class=\"s2\">\"~&gt; 1.0.0\"<\/span>...\r\n- Installing sacloud\/sakuracloud v2.17.0...\r\n- Installed sacloud\/sakuracloud v2.17.0 <span class=\"o\">(<\/span>self-signed, key ID 96CEB4B93D86849D<span class=\"o\">)<\/span>\r\n- Installing ansible\/ansible v1.0.0...\r\n- Installed ansible\/ansible v1.0.0 <span class=\"o\">(<\/span>self-signed, key ID 7664CDD95312BDBD<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<ol>\u786e\u8ba4\u6267\u884cterraform plan\u540e\u4f1a\u6dfb\u52a04\u4e2a\u8ba1\u5212\u3002<\/ol>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform plan\r\ndata.sakuracloud_archive.ubuntu: Reading...\r\ndata.sakuracloud_archive.ubuntu: Read <span class=\"nb\">complete <\/span>after 1s <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span><span class=\"k\">************<\/span><span class=\"o\">]<\/span>\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\"># ansible_host.web_server will be created<\/span>\r\n  + resource <span class=\"s2\">\"ansible_host\"<\/span> <span class=\"s2\">\"web_server\"<\/span> <span class=\"o\">{<\/span>\r\n      + <span class=\"nb\">groups<\/span>    <span class=\"o\">=<\/span> <span class=\"o\">[<\/span>\r\n          + <span class=\"s2\">\"web\"<\/span>,\r\n        <span class=\"o\">]<\/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      + name      <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + variables <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\r\n          + <span class=\"s2\">\"ansible_become\"<\/span>               <span class=\"o\">=<\/span> <span class=\"s2\">\"yes\"<\/span>\r\n          + <span class=\"s2\">\"ansible_become_method\"<\/span>        <span class=\"o\">=<\/span> <span class=\"s2\">\"sudo\"<\/span>\r\n          + <span class=\"s2\">\"ansible_become_pass\"<\/span>          <span class=\"o\">=<\/span> <span class=\"s2\">\"P@ssw0rd\"<\/span>\r\n          + <span class=\"s2\">\"ansible_python_interpreter\"<\/span>   <span class=\"o\">=<\/span> <span class=\"s2\">\"\/usr\/bin\/python3\"<\/span>\r\n          + <span class=\"s2\">\"ansible_ssh_private_key_file\"<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\".\/id_rsa\"<\/span>\r\n          + <span class=\"s2\">\"ansible_user\"<\/span>                 <span class=\"o\">=<\/span> <span class=\"s2\">\"ubuntu\"<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># sakuracloud_disk.web_server will be created<\/span>\r\n  + resource <span class=\"s2\">\"sakuracloud_disk\"<\/span> <span class=\"s2\">\"web_server\"<\/span> <span class=\"o\">{<\/span>\r\n      + connector         <span class=\"o\">=<\/span> <span class=\"s2\">\"virtio\"<\/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      + name              <span class=\"o\">=<\/span> <span class=\"s2\">\"Web Server\"<\/span>\r\n      + plan              <span class=\"o\">=<\/span> <span class=\"s2\">\"ssd\"<\/span>\r\n      + server_id         <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + size              <span class=\"o\">=<\/span> 20\r\n      + source_archive_id <span class=\"o\">=<\/span> <span class=\"s2\">\"************\"<\/span>\r\n      + zone              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># sakuracloud_server.web_server will be created<\/span>\r\n  + resource <span class=\"s2\">\"sakuracloud_server\"<\/span> <span class=\"s2\">\"web_server\"<\/span> <span class=\"o\">{<\/span>\r\n      + commitment        <span class=\"o\">=<\/span> <span class=\"s2\">\"standard\"<\/span>\r\n      + core              <span class=\"o\">=<\/span> 1\r\n      + description       <span class=\"o\">=<\/span> <span class=\"s2\">\"nginx\"<\/span>\r\n      + disks             <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + dns_servers       <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + gateway           <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + <span class=\"nb\">hostname<\/span>          <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/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      + interface_driver  <span class=\"o\">=<\/span> <span class=\"s2\">\"virtio\"<\/span>\r\n      + ip_address        <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + memory            <span class=\"o\">=<\/span> 2\r\n      + name              <span class=\"o\">=<\/span> <span class=\"s2\">\"Web Server\"<\/span>\r\n      + netmask           <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + network_address   <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + private_host_name <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + zone              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n\r\n      + disk_edit_parameter <span class=\"o\">{<\/span>\r\n          + disable_pw_auth <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span>\r\n          + <span class=\"nb\">hostname<\/span>        <span class=\"o\">=<\/span> <span class=\"s2\">\"web-server\"<\/span>\r\n          + password        <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>sensitive value<span class=\"o\">)<\/span>\r\n          + ssh_key_ids     <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n        <span class=\"o\">}<\/span>\r\n\r\n      + network_interface <span class=\"o\">{<\/span>\r\n          + mac_address     <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n          + upstream        <span class=\"o\">=<\/span> <span class=\"s2\">\"shared\"<\/span>\r\n          + user_ip_address <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># sakuracloud_ssh_key.key will be created<\/span>\r\n  + resource <span class=\"s2\">\"sakuracloud_ssh_key\"<\/span> <span class=\"s2\">\"key\"<\/span> <span class=\"o\">{<\/span>\r\n      + fingerprint <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/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      + name        <span class=\"o\">=<\/span> <span class=\"s2\">\"key\"<\/span>\r\n      + public_key  <span class=\"o\">=<\/span> <span class=\"o\">&lt;&lt;-<\/span><span class=\"no\">EOT<\/span><span class=\"sh\">\r\n            ssh-rsa ****\r\n<\/span><span class=\"no\">        EOT\r\n<\/span>    <span class=\"o\">}<\/span>\r\n\r\nPlan: 4 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\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<h1>3. \u6267\u884c terraform apply<\/h1>\n<p>\u8f93\u5165\u5e76\u6267\u884c&#8221;yes&#8221;\u3002<br \/>\n\u7b49\u5f85\u663e\u793a&#8221;Apply complete!&#8221;\u3002<\/p>\n<h1>\u53ef\u4ee5\u8bd5\u7740\u4ecetfstate\u751f\u6210\u6e05\u5355\u6765\u786e\u8ba4\u5417\uff1f<\/h1>\n<p>\u8bf7\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u67e5\u770btfstate\u4e2d\u7684\u6e05\u5355\u4fe1\u606f<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>ansible-inventory <span class=\"nt\">-i<\/span> inventory.yml <span class=\"nt\">--graph<\/span> <span class=\"nt\">--vars<\/span>\r\n<\/code><\/pre>\n<p>\u53ef\u4ee5\u6839\u636etfstate\u7684\u5185\u5bb9\u8fdb\u884c\u751f\u6210\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> ansible-inventory <span class=\"nt\">-i<\/span> inventory.yml <span class=\"nt\">--graph<\/span> <span class=\"nt\">--vars<\/span>\r\n<span class=\"go\">@all:\r\n  |--@ungrouped:\r\n  |--@web:\r\n  |  |--59.106.214.22\r\n  |  |  |--{ansible_become = yes}\r\n  |  |  |--{ansible_become_method = sudo}\r\n  |  |  |--{ansible_become_pass = P@ssw0rd}\r\n  |  |  |--{ansible_python_interpreter = \/usr\/bin\/python3}\r\n  |  |  |--{ansible_ssh_private_key_file = .\/id_rsa}\r\n  |  |  |--{ansible_user = ubuntu}\r\n<\/span><\/code><\/pre>\n<h1>\u6267\u884cplaybook<\/h1>\n<p>\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u6765\u6267\u884cAnsible playbook\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>ansible-playbook <span class=\"nt\">-i<\/span> inventory.yml playbook.yml\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> ansible-playbook <span class=\"nt\">-i<\/span> inventory.yml playbook.yml\r\n<span class=\"go\">\r\nPLAY [web] *****************************************************************************************************************************************************************************************************\r\n\r\nTASK [Gathering Facts] *****************************************************************************************************************************************************************************************\r\nok: [59.106.214.22]\r\n\r\nTASK [apt update] **********************************************************************************************************************************************************************************************\r\nchanged: [59.106.214.22]\r\n\r\nTASK [install nginx] *******************************************************************************************************************************************************************************************\r\nchanged: [59.106.214.22]\r\n\r\nPLAY RECAP *****************************************************************************************************************************************************************************************************\r\n59.106.214.22              : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   \r\n<\/span><\/code><\/pre>\n<p>\u6211\u786e\u8ba4\u4e86Web\u670d\u52a1\u5668\u6b63\u5728\u8fd0\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> curl 59.106.214.22 \r\n<span class=\"gp\">&lt;!DOCTYPE html&gt;<\/span>\r\n<span class=\"gp\">&lt;html&gt;<\/span>\r\n<span class=\"gp\">&lt;head&gt;<\/span>\r\n<span class=\"gp\">&lt;title&gt;<\/span>Welcome to nginx!&lt;\/title&gt;\r\n<span class=\"gp\">&lt;style&gt;<\/span>\r\n<span class=\"go\">    body {\r\n<\/span><span class=\"gp\">        width: 35em;<\/span>\r\n<span class=\"gp\">        margin: 0 auto;<\/span>\r\n<span class=\"gp\">        font-family: Tahoma, Verdana, Arial, sans-serif;<\/span>\r\n<span class=\"go\">    }\r\n<\/span><span class=\"gp\">&lt;\/style&gt;<\/span>\r\n<span class=\"gp\">&lt;\/head&gt;<\/span>\r\n<span class=\"gp\">&lt;body&gt;<\/span>\r\n<span class=\"gp\">&lt;h1&gt;<\/span>Welcome to nginx!&lt;\/h1&gt;\r\n<span class=\"gp\">&lt;p&gt;<\/span>If you see this page, the nginx web server is successfully installed and\r\n<span class=\"gp\">working. Further configuration is required.&lt;\/p&gt;<\/span>\r\n\r\n<span class=\"gp\">&lt;p&gt;<\/span>For online documentation and support please refer to\r\n<span class=\"gp\">&lt;a href=\"http:\/\/nginx.org\/\"&gt;<\/span>nginx.org&lt;\/a&gt;.&lt;br\/&gt;\r\n<span class=\"go\">Commercial support is available at\r\n<\/span><span class=\"gp\">&lt;a href=\"http:\/\/nginx.com\/\"&gt;<\/span>nginx.com&lt;\/a&gt;.&lt;\/p&gt;\r\n\r\n<span class=\"gp\">&lt;p&gt;<\/span>&lt;em&gt;Thank you <span class=\"k\">for <\/span>using nginx.&lt;\/em&gt;&lt;\/p&gt;\r\n<span class=\"gp\">&lt;\/body&gt;<\/span>\r\n<span class=\"gp\">&lt;\/html&gt;<\/span>\r\n\r\n<\/code><\/pre>\n<h1>\u5370\u8c61<\/h1>\n<p>\u4f7f\u7528tfstate\u8f7b\u677e\u751f\u6210\u4e86\u6e05\u6670\u7684\u5e93\u5b58\uff0c\u6548\u679c\u975e\u5e38\u597d\u3002<\/p>\n<p>\u65e7\u65f6\u6211\u5199\u4e86\u4e00\u4e2a\u4ecetfstate\u751f\u6210\u6e05\u5355\u7684\u811a\u672c\uff0c\u6240\u4ee5\u8fd9\u6837\u7684\u9ebb\u70e6\u5c31\u6d88\u5931\u4e86\uff0c\u5f88\u65b9\u4fbf\u3002<\/p>\n<p>\u6211\u5e0c\u671b\u672a\u6765\u5728\u5de5\u4f5c\u4e2d\u80fd\u591f\u5145\u5206\u5229\u7528\u8fd9\u4e00\u70b9\u3002<\/p>\n<h1>\u88dc\u5145<\/h1>\n<p>\u5982\u679c\u4f7f\u7528\u65e7\u7248\u7684Python\uff0c\u90a3\u4e48\u5c06\u4f7f\u7528\u65e7\u7248\u7684Ansible\uff0c\u56e0\u4e3a\u5b83\u4e0d\u652f\u6301\u8be5\u7248\u672c\uff0c\u4f1a\u51fa\u73b0\u8b66\u544a\u5e76\u65e0\u6cd5\u4f7f\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>ansible-inventory <span class=\"nt\">-i<\/span> inventory.yml <span class=\"nt\">--graph<\/span> <span class=\"nt\">--vars<\/span>\r\n<span class=\"o\">[<\/span>DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 2.12. Current version: 3.7.3 <span class=\"o\">(<\/span>v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21<span class=\"o\">)<\/span> <span class=\"o\">[<\/span>Clang 6.0 <span class=\"o\">(<\/span>clang-600.0.57<span class=\"o\">)]<\/span><span class=\"nb\">.<\/span> \r\nThis feature will be removed from ansible-core <span class=\"k\">in <\/span>version 2.12. Deprecation warnings can be disabled by setting <span class=\"nv\">deprecation_warnings<\/span><span class=\"o\">=<\/span>False <span class=\"k\">in <\/span>ansible.cfg.\r\n<span class=\"o\">[<\/span>WARNING]: Collection cloud.terraform does not support Ansible version 2.11.12\r\n...\r\n@all:\r\n  |--@ungrouped:\r\n\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Terraform\u7684Ansible\u63d0\u4f9b\u8005\u5df2\u7ecf\u53d1\u5e03\u3002 &nbsp; \u901a\u8fc7\u8fd9\u6837\u505a\uff0c\u6211\u4eec\u53ef\u4ee5\u52a8\u6001\u5730\u4ecetfstate\u6587 [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-42270","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\u7528Terraform\u7684Ansible\u63d0\u4f9b\u5546 - 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\u7528terraform\u7684ansible\u63d0\u4f9b\u5546\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u8bd5\u7528Terraform\u7684Ansible\u63d0\u4f9b\u5546\" \/>\n<meta property=\"og:description\" content=\"Terraform\u7684Ansible\u63d0\u4f9b\u8005\u5df2\u7ecf\u53d1\u5e03\u3002 &nbsp; \u901a\u8fc7\u8fd9\u6837\u505a\uff0c\u6211\u4eec\u53ef\u4ee5\u52a8\u6001\u5730\u4ecetfstate\u6587 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u8bd5\u7528terraform\u7684ansible\u63d0\u4f9b\u5546\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-01T18:58:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-15T03:21:12+00:00\" \/>\n<meta name=\"author\" content=\"\u6587, \u7fd4\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6587, \u7fd4\" \/>\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%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/\",\"name\":\"\u8bd5\u7528Terraform\u7684Ansible\u63d0\u4f9b\u5546 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-06-01T18:58:21+00:00\",\"dateModified\":\"2024-01-15T03:21:12+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u8bd5\u7528Terraform\u7684Ansible\u63d0\u4f9b\u5546\"}]},{\"@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\/64d5cc7727fffbff2f9a2a8da1de3e5c\",\"name\":\"\u6587, \u7fd4\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"caption\":\"\u6587, \u7fd4\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u8bd5\u7528Terraform\u7684Ansible\u63d0\u4f9b\u5546 - 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\u7528terraform\u7684ansible\u63d0\u4f9b\u5546\/","og_locale":"zh_CN","og_type":"article","og_title":"\u8bd5\u7528Terraform\u7684Ansible\u63d0\u4f9b\u5546","og_description":"Terraform\u7684Ansible\u63d0\u4f9b\u8005\u5df2\u7ecf\u53d1\u5e03\u3002 &nbsp; \u901a\u8fc7\u8fd9\u6837\u505a\uff0c\u6211\u4eec\u53ef\u4ee5\u52a8\u6001\u5730\u4ecetfstate\u6587 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u8bd5\u7528terraform\u7684ansible\u63d0\u4f9b\u5546\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-06-01T18:58:21+00:00","article_modified_time":"2024-01-15T03:21:12+00:00","author":"\u6587, \u7fd4","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6587, \u7fd4","\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%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/","name":"\u8bd5\u7528Terraform\u7684Ansible\u63d0\u4f9b\u5546 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-06-01T18:58:21+00:00","dateModified":"2024-01-15T03:21:12+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u8bd5\u7528Terraform\u7684Ansible\u63d0\u4f9b\u5546"}]},{"@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\/64d5cc7727fffbff2f9a2a8da1de3e5c","name":"\u6587, \u7fd4","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","caption":"\u6587, \u7fd4"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%af%95%e7%94%a8terraform%e7%9a%84ansible%e6%8f%90%e4%be%9b%e5%95%86\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42270","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\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=42270"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42270\/revisions"}],"predecessor-version":[{"id":59000,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42270\/revisions\/59000"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=42270"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=42270"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=42270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}