{"id":48876,"date":"2023-06-15T18:38:04","date_gmt":"2023-04-23T20:32:34","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/"},"modified":"2024-04-30T09:02:11","modified_gmt":"2024-04-30T01:02:11","slug":"%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/","title":{"rendered":"\u6211\u4f7f\u7528 GitHub Actions\uff0c\u5728 AWS + Terraform + Ansible \u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a CI\/CD \u73af\u5883"},"content":{"rendered":"<h2>\u603b\u7684\u6765\u8bf4<\/h2>\n<p>\u6700\u8fd1\u56e0\u4e3a\u559c\u6b22\u73a9github actions\uff0c\u6211\u5728aws\u73af\u5883\u4e0b\u5c1d\u8bd5\u4e86\u4f7f\u7528teraform + ansible\u8fdb\u884c\u90e8\u7f72\u3002<br \/>\n\u6211\u6210\u529f\u642d\u5efa\u4e86EC2\u5b9e\u4f8b\uff0c\u5e76\u5b89\u88c5\u4e86httpd\u3002<\/p>\n<h2>\u76ee\u5f55<\/h2>\n<p>\u30fb\u9884\u5148\u51c6\u5907<br \/>\n\u30fb\u76ee\u5f55\u7ed3\u6784<br \/>\n\u30fb\u521b\u5efa\u5b58\u50a8\u6876<br \/>\n\u30fb\u521b\u5efaIAM\u7528\u6237<br \/>\n\u30fb\u521b\u5efaTerraform\u4ee3\u7801<br \/>\n\u30fb\u521b\u5efaAnsible\u4ee3\u7801<br \/>\n\u30fb\u521b\u5efaGitHub Actions<br \/>\n\u30fb\u6267\u884cGitHub Actions\u5e76\u83b7\u53d6\u7ed3\u679c<\/p>\n<h2>\u4e8b\u524d\u51c6\u5907<\/h2>\n<ul class=\"post-ul\">EC2\u306eIP\u306e\u81ea\u52d5\u53d6\u5f97\u306bdyanamic inventory\u304c\u4f7f\u7528\u3067\u304d\u308b\u3053\u3068<\/ul>\n<h2>\u76ee\u5f55\u7ed3\u6784<\/h2>\n<pre class=\"post-pre\"><code>\u251c\u2500\u2500 README.md\r\n\u251c\u2500\u2500 ansible\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ansible.cfg\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ec2.ini\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ec2.py\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 roles\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 common\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 files\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 tasks\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 nginx\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 files\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 tasks\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0         \u2514\u2500\u2500 main.yml\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 sandbox.yml\r\n\u2514\u2500\u2500 terraform\r\n    \u251c\u2500\u2500 backend.tf\r\n    \u251c\u2500\u2500 data.tf\r\n    \u251c\u2500\u2500 main.tf\r\n    \u251c\u2500\u2500 output\r\n    \u251c\u2500\u2500 output.tf\r\n    \u251c\u2500\u2500 provider.tf\r\n    \u2514\u2500\u2500 variables.tf\r\n\r\n<\/code><\/pre>\n<h2>\u521b\u5efa S3 \u5b58\u50a8\u6876<\/h2>\n<p>\u521b\u5efa\u4e00\u4e2a\u7528\u4e8e\u4fdd\u5b58tfstate\u7684\u5b58\u50a8\u6876\u3002<\/p>\n<pre class=\"post-pre\"><code>% aws s3 mb s3:\/\/tf-sandbox-masa3521\r\nmake_bucket: tf-sandbox-masa3521\r\n<\/code><\/pre>\n<h2>\u521b\u5efaIAM\u7528\u6237<\/h2>\n<p>\u521b\u5efa\u7528\u4e8e\u8fd0\u884c Terraform \u548c Ansible \u7684 IAM \u7528\u6237\u3002<br \/>\n\u7531\u4e8e\u9700\u8981\u4ece\u53c2\u6570\u5b58\u50a8\uff08Parameter Store\uff09\u4e2d\u83b7\u53d6 EC2\u3001S3 \u548c\u5bc6\u94a5\u76f8\u5173\u4fe1\u606f\uff0c\u56e0\u6b64\u9700\u8981\u6388\u4e88\u76f8\u5e94\u7684\u6743\u9650\u3002<\/p>\n<pre class=\"post-pre\"><code>% aws iam create-user <span class=\"nt\">--user-name<\/span> cicd_user\r\n\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"User\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Path\"<\/span>: <span class=\"s2\">\"\/\"<\/span>,\r\n        <span class=\"s2\">\"UserName\"<\/span>: <span class=\"s2\">\"cicd_user\"<\/span>,\r\n        <span class=\"s2\">\"UserId\"<\/span>: <span class=\"s2\">\"***************\"<\/span>,\r\n        <span class=\"s2\">\"Arn\"<\/span>: <span class=\"s2\">\"arn:aws:iam::***************:user\/cicd_user\"<\/span>,\r\n        <span class=\"s2\">\"CreateDate\"<\/span>: <span class=\"s2\">\"2020-05-21T15:05:18Z\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>% aws iam create-access-key <span class=\"nt\">--user-name<\/span> cicd_user\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"AccessKey\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"UserName\"<\/span>: <span class=\"s2\">\"cicd_user\"<\/span>,\r\n        <span class=\"s2\">\"AccessKeyId\"<\/span>: <span class=\"s2\">\"***************\"<\/span>,\r\n        <span class=\"s2\">\"Status\"<\/span>: <span class=\"s2\">\"Active\"<\/span>,\r\n        <span class=\"s2\">\"SecretAccessKey\"<\/span>: <span class=\"s2\">\"***************\"<\/span>,\r\n        <span class=\"s2\">\"CreateDate\"<\/span>: <span class=\"s2\">\"2020-05-22T00:42:37Z\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>% aws iam attach-user-policy <span class=\"nt\">--policy-arn<\/span> arn:aws:iam::aws:policy\/AmazonS3FullAccess  <span class=\"nt\">--user-name<\/span> cicd_user\r\n% aws iam attach-user-policy <span class=\"nt\">--policy-arn<\/span> arn:aws:iam::aws:policy\/AmazonEC2FullAccess <span class=\"nt\">--user-name<\/span> cicd_user\r\n% aws iam attach-user-policy <span class=\"nt\">--policy-arn<\/span> arn:aws:iam::aws:policy\/AmazonSSMReadOnlyAccess <span class=\"nt\">--user-name<\/span> cicd_user\r\n% aws iam list-attached-user-policies <span class=\"nt\">--user-name<\/span> cicd_user\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"AttachedPolicies\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"PolicyName\"<\/span>: <span class=\"s2\">\"AmazonEC2FullAccess\"<\/span>,\r\n            <span class=\"s2\">\"PolicyArn\"<\/span>: <span class=\"s2\">\"arn:aws:iam::aws:policy\/AmazonEC2FullAccess\"<\/span>\r\n        <span class=\"o\">}<\/span>,\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"PolicyName\"<\/span>: <span class=\"s2\">\"AmazonS3FullAccess\"<\/span>,\r\n            <span class=\"s2\">\"PolicyArn\"<\/span>: <span class=\"s2\">\"arn:aws:iam::aws:policy\/AmazonS3FullAccess\"<\/span>\r\n        <span class=\"o\">}<\/span>,\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"PolicyName\"<\/span>: <span class=\"s2\">\"AmazonSSMReadOnlyAccess\"<\/span>,\r\n            <span class=\"s2\">\"PolicyArn\"<\/span>: <span class=\"s2\">\"arn:aws:iam::aws:policy\/AmazonSSMReadOnlyAccess\"<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h2>\u5236\u4f5c\u5bc6\u94a5<\/h2>\n<p>\u521b\u5efa\u9002\u7528\u4e8e EC2 \u7684\u516c\u94a5\/\u79c1\u94a5\u5e76\u5c06\u5176\u6ce8\u518c\u5230\u53c2\u6570\u5b58\u50a8\u3002<\/p>\n<pre class=\"post-pre\"><code>% ssh-keygen <span class=\"nt\">-t<\/span> rsa <span class=\"nt\">-b<\/span> 4096  \r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>% aws ssm put-parameter <span class=\"nt\">--name<\/span> <span class=\"s2\">\"publickey\"<\/span> <span class=\"se\">\\<\/span>\r\n                      <span class=\"nt\">--type<\/span> SecureString <span class=\"se\">\\<\/span>\r\n                      <span class=\"nt\">--value<\/span>  <span class=\"s2\">\"<\/span><span class=\"si\">$(<\/span><span class=\"nb\">cat <\/span>id_rsa.pub<span class=\"si\">)<\/span><span class=\"s2\">\"<\/span>\r\n\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"Version\"<\/span>: 1,\r\n    <span class=\"s2\">\"Tier\"<\/span>: <span class=\"s2\">\"Standard\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n% aws ssm put-parameter <span class=\"nt\">--name<\/span> <span class=\"s2\">\"pravatekey\"<\/span> <span class=\"se\">\\<\/span>\r\n                      <span class=\"nt\">--type<\/span> SecureString <span class=\"se\">\\<\/span>\r\n                      <span class=\"nt\">--value<\/span>  <span class=\"s2\">\"<\/span><span class=\"si\">$(<\/span><span class=\"nb\">cat <\/span>id_rsa<span class=\"si\">)<\/span><span class=\"s2\">\"<\/span>\r\n\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"Version\"<\/span>: 1,\r\n    <span class=\"s2\">\"Tier\"<\/span>: <span class=\"s2\">\"Standard\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u521b\u5efaTerraform\u4ee3\u7801<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">data.tf\u3067\u516c\u958b\u9375\u3092\u30d1\u30e9\u30e1\u30fc\u30bf\u30b9\u30c8\u30a2\u304b\u3089\u53d6\u5f97<\/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\">backend.tf\u3067tfstate\u3092\u30ea\u30e2\u30fc\u30c8\u3067\u7ba1\u7406<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">output.tf\u3067\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30fc\u30b0\u30eb\u30fc\u30d7\u306egroupid\u3092\u30d5\u30a1\u30a4\u30eb\u306b\u51fa\u529b \u203b\u5f8c\u306egithub-actions\u3067\u4f7f\u7528<\/ul>\n<pre class=\"post-pre\"><code><span class=\"nx\">provider<\/span> <span class=\"s2\">\"aws\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">profile<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"default\"<\/span>\r\n  <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"= 2.61\"<\/span>\r\n  <span class=\"nx\">region<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nx\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">backend<\/span> <span class=\"s2\">\"s3\"<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">bucket<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"tf-sandbox-masa3521\"<\/span>\r\n    <span class=\"nx\">region<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n    <span class=\"nx\">key<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform.tfstate\"<\/span>\r\n    <span class=\"nx\">encrypt<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/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\">data<\/span> <span class=\"s2\">\"aws_ssm_parameter\"<\/span> <span class=\"s2\">\"publickey\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"publickey\"<\/span>\r\n  <span class=\"nx\">with_decryption<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/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\">\"region\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"system\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"sandbox\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nx\">resource<\/span> <span class=\"s2\">\"local_file\"<\/span> <span class=\"s2\">\"sgroupid\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">filename<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\".\/group_id\"<\/span>\r\n  <span class=\"nx\">content<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"err\">.<\/span><span class=\"nx\">sandboxSG<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>\r\n<span class=\"nx\">resource<\/span> <span class=\"s2\">\"aws_vpc\"<\/span> <span class=\"s2\">\"sandboxVPC\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">cidr_block<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"10.1.0.0\/16\"<\/span>\r\n  <span class=\"nx\">instance_tenancy<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"default\"<\/span>\r\n  <span class=\"nx\">enable_dns_support<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"true\"<\/span>\r\n  <span class=\"nx\">enable_dns_hostnames<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"false\"<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">system<\/span>\r\n    <span class=\"nx\">Env<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">terraform<\/span><span class=\"err\">.<\/span><span class=\"nx\">workspace<\/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\">\"aws_route_table\"<\/span> <span class=\"s2\">\"sanbboxRT\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"err\">.<\/span><span class=\"nx\">sandboxVPC<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span>\r\n\r\n  <span class=\"nx\">route<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"0.0.0.0\/0\"<\/span>\r\n    <span class=\"nx\">gateway_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_internet_gateway<\/span><span class=\"err\">.<\/span><span class=\"nx\">sandboxGW<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">system<\/span>\r\n    <span class=\"nx\">Env<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">terraform<\/span><span class=\"err\">.<\/span><span class=\"nx\">workspace<\/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\">\"aws_subnet\"<\/span> <span class=\"s2\">\"sandboxSUBNET\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>     <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"err\">.<\/span><span class=\"nx\">sandboxVPC<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"10.1.0.0\/24\"<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">system<\/span>\r\n    <span class=\"nx\">Env<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">terraform<\/span><span class=\"err\">.<\/span><span class=\"nx\">workspace<\/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\">\"aws_internet_gateway\"<\/span> <span class=\"s2\">\"sandboxGW\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"err\">.<\/span><span class=\"nx\">sandboxVPC<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">system<\/span>\r\n    <span class=\"nx\">Env<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">terraform<\/span><span class=\"err\">.<\/span><span class=\"nx\">workspace<\/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\">\"aws_route_table_association\"<\/span> <span class=\"s2\">\"sandboxRTA\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"err\">.<\/span><span class=\"nx\">sandboxSUBNET<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">route_table_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_route_table<\/span><span class=\"err\">.<\/span><span class=\"nx\">sanbboxRT<\/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\">\"aws_security_group\"<\/span> <span class=\"s2\">\"sandboxSG\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"sandboxSG\"<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Allow SSH inbound traffic\"<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"err\">.<\/span><span class=\"nx\">sandboxVPC<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">ingress<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">from_port<\/span>   <span class=\"p\">=<\/span> <span class=\"mi\">80<\/span>\r\n    <span class=\"nx\">to_port<\/span>     <span class=\"p\">=<\/span> <span class=\"mi\">80<\/span>\r\n    <span class=\"nx\">protocol<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"tcp\"<\/span>\r\n    <span class=\"nx\">cidr_blocks<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"0.0.0.0\/0\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">egress<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">from_port<\/span>   <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">to_port<\/span>     <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">protocol<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"-1\"<\/span>\r\n    <span class=\"nx\">cidr_blocks<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"0.0.0.0\/0\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">system<\/span>\r\n    <span class=\"nx\">Env<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">terraform<\/span><span class=\"err\">.<\/span><span class=\"nx\">workspace<\/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\">\"aws_key_pair\"<\/span> <span class=\"s2\">\"publickey\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">key_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\">data<\/span><span class=\"err\">.<\/span><span class=\"nx\">aws_ssm_parameter<\/span><span class=\"err\">.<\/span><span class=\"nx\">publickey<\/span><span class=\"err\">.<\/span><span class=\"nx\">value<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">system<\/span>\r\n    <span class=\"nx\">Env<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">terraform<\/span><span class=\"err\">.<\/span><span class=\"nx\">workspace<\/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\">\"aws_instance\"<\/span> <span class=\"s2\">\"sandboxinstance\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">key_name<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_key_pair<\/span><span class=\"err\">.<\/span><span class=\"nx\">publickey<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">ami<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-0f310fced6141e627\"<\/span>\r\n  <span class=\"nx\">instance_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"t2.nano\"<\/span>\r\n  <span class=\"nx\">vpc_security_group_ids<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"nx\">aws_security_group<\/span><span class=\"err\">.<\/span><span class=\"nx\">sandboxSG<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"p\">]<\/span>\r\n\r\n  <span class=\"nx\">subnet_id<\/span>                   <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"err\">.<\/span><span class=\"nx\">sandboxSUBNET<\/span><span class=\"err\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">associate_public_ip_address<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"true\"<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">system<\/span>\r\n    <span class=\"nx\">Env<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">terraform<\/span><span class=\"err\">.<\/span><span class=\"nx\">workspace<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u7528ansible\u521b\u5efa<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nn\">[defaults]<\/span>\r\n<span class=\"py\">deprecation_warnings<\/span> <span class=\"p\">=<\/span> <span class=\"s\">False<\/span>\r\n<span class=\"py\">remote_user<\/span> <span class=\"p\">=<\/span> <span class=\"s\">ec2-user<\/span>\r\n<span class=\"py\">private_key_file<\/span> <span class=\"p\">=<\/span> <span class=\"s\">.\/privatekey<\/span>\r\n<span class=\"py\">host_key_checking<\/span> <span class=\"p\">=<\/span> <span class=\"s\">False<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">hosts<\/span><span class=\"pi\">:<\/span> <span class=\"s\">tag_Name_sandbox<\/span>\r\n  <span class=\"na\">roles<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">htted<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nn\">---<\/span>\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">install apache<\/span>\r\n  <span class=\"na\">yum<\/span><span class=\"pi\">:<\/span>\r\n   <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">httpd<\/span>\r\n   <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">present<\/span>\r\n  <span class=\"na\">become<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Start httpd<\/span>\r\n  <span class=\"na\">service<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">httpd<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">started<\/span>\r\n    <span class=\"na\">enabled<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n  <span class=\"na\">become<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n<\/code><\/pre>\n<h2>\u521b\u5efagithub-actions<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u5b9f\u884c\u306e\u70ba\u306bsecrets\u306e\u767b\u9332\u304c\u5fc5\u8981<\/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\">IP\u3092\u81ea\u52d5\u3067\u53d6\u5f97\u3059\u308b\u305f\u3081Dynamic Inventory\u3067\u53d6\u5f97\u3059\u308b\u3002<\/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\">ansble\u5b9f\u884c\u306e\u70ba\u79d8\u5bc6\u9375\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">ansible\u5b9f\u884c\u524d\u306b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30fc\u30b0\u30eb\u30fc\u30d7\u306b\u81ea\u5206\u306eIP\u3092\u767b\u9332\u3001\u5b9f\u884c\u5f8c\u306b\u81ea\u5206\u306eIP\u3092\u524a\u9664<\/ul>\n<h3>\u79d8\u5bc6\u6ce8\u518c<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d87d5913a08637a6c1285\/35-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2020-05-29 1.59.30.png\" \/><\/div>\n<pre class=\"post-pre\"><code>\r\n<span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform deploy to Azure<\/span>\r\n\r\n<span class=\"na\">on<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">push<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">branches<\/span><span class=\"pi\">:<\/span>    \r\n      <span class=\"pi\">-<\/span> <span class=\"s\">master<\/span>\r\n\r\n<span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">terraform-ansible<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">runs-on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ubuntu-latest<\/span>\r\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/checkout@v2<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Configure AWS Credentials<\/span>\r\n      <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/configure-aws-credentials@v1<\/span>\r\n      <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">aws-access-key-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.AWS_ACCESS_KEY_ID }}<\/span>\r\n        <span class=\"na\">aws-secret-access-key<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.AWS_SECRET_ACCESS_KEY }}<\/span>\r\n        <span class=\"na\">aws-region<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ap-northeast-1<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Setup Terraform<\/span>\r\n      <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">hashicorp\/setup-terraform@v1<\/span>\r\n      <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">terraform_version<\/span><span class=\"pi\">:<\/span> <span class=\"s\">0.12.9<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform Init<\/span>\r\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">terraform init<\/span>\r\n      <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.workspace }}\/terraform<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform select<\/span>\r\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">terraform workspace select dev<\/span>\r\n      <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.workspace }}\/terraform<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform Format<\/span>\r\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">terraform fmt -check<\/span>\r\n      <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.workspace }}\/terraform<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform Plan<\/span>\r\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">terraform plan<\/span>\r\n      <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.workspace }}\/terraform<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform Apply<\/span>\r\n      <span class=\"na\">if<\/span><span class=\"pi\">:<\/span> <span class=\"s\">github.ref == 'refs\/heads\/master' &amp;&amp; github.event_name == 'push'<\/span>\r\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">terraform apply -auto-approve<\/span>\r\n      <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.workspace }}\/terraform<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Set up Python <\/span><span class=\"m\">3.7<\/span>\r\n      <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/setup-python@v2<\/span>\r\n      <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">python-version<\/span><span class=\"pi\">:<\/span> <span class=\"m\">3.7<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Install dependencies<\/span>\r\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\r\n        <span class=\"s\">python -m pip install --upgrade pip<\/span>\r\n        <span class=\"s\">pip install boto ansible==2.9.2<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Download privatekey<\/span>\r\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws ssm get-parameter --name \"privatekey\" --with-decryption | jq -r .Parameter.Value &gt; .\/privatekey<\/span>\r\n      <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.workspace }}\/ansible<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">modify permission privatekey<\/span>\r\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">chmod 400 .\/privatekey<\/span>\r\n      <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.workspace }}\/ansible<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">open sg<\/span>\r\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span>  <span class=\"s\">aws ec2 authorize-security-group-ingress --group-id \"$(cat ..\/terraform\/group_id)\" --protocol tcp --port 22 --cidr `curl inet-ip.info`\/32<\/span>\r\n      <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.workspace }}\/ansible<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">exec ansible<\/span>\r\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ansible-playbook -i ec2.py sandbox.yml<\/span>\r\n      <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.workspace }}\/ansible<\/span>\r\n\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">close sg<\/span>\r\n      <span class=\"na\">run<\/span><span class=\"pi\">:<\/span>  <span class=\"s\">aws ec2 revoke-security-group-ingress --group-id \"$(cat ..\/terraform\/group_id)\" --protocol tcp --port 22 --cidr `curl inet-ip.info`\/32<\/span>\r\n      <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.workspace }}\/ansible<\/span>\r\n<\/code><\/pre>\n<h2>GitHub Actions \u7684\u7ed3\u679c<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d87d5913a08637a6c1285\/38-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2020-05-29 2.07.50.png\" \/><\/div>\n<p>\u3010\u53c2\u8003\u3011<br \/>\n&#8211; Terraform \u7684 GitHub Actions \u8bbe\u7f6e\uff1ahttps:\/\/www.terraform.io\/docs\/github-actions\/setup-terraform.html<br \/>\n&#8211; \u914d\u7f6e AWS \u51ed\u8bc1\u7684 GitHub \u64cd\u4f5c\uff1ahttps:\/\/github.com\/aws-actions\/configure-aws-credentials<br \/>\n&#8211; Ansible \u7684\u52a8\u6001\u6e05\u5355\u4ecb\u7ecd\uff1ahttps:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/intro_dynamic_inventory.html<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u603b\u7684\u6765\u8bf4 \u6700\u8fd1\u56e0\u4e3a\u559c\u6b22\u73a9github actions\uff0c\u6211\u5728aws\u73af\u5883\u4e0b\u5c1d\u8bd5\u4e86\u4f7f\u7528teraform + ansi [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48876","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>\u6211\u4f7f\u7528 GitHub Actions\uff0c\u5728 AWS + Terraform + Ansible \u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a CI\/CD \u73af\u5883 - 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\/\u6211\u4f7f\u7528-github-actions\uff0c\u5728-aws-terraform-ansible-\u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a-ci-cd-\u73af\u5883\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u6211\u4f7f\u7528 GitHub Actions\uff0c\u5728 AWS + Terraform + Ansible \u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a CI\/CD \u73af\u5883\" \/>\n<meta property=\"og:description\" content=\"\u603b\u7684\u6765\u8bf4 \u6700\u8fd1\u56e0\u4e3a\u559c\u6b22\u73a9github actions\uff0c\u6211\u5728aws\u73af\u5883\u4e0b\u5c1d\u8bd5\u4e86\u4f7f\u7528teraform + ansi [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u4f7f\u7528-github-actions\uff0c\u5728-aws-terraform-ansible-\u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a-ci-cd-\u73af\u5883\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-23T20:32:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T01:02:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d87d5913a08637a6c1285\/35-0.png\" \/>\n<meta name=\"author\" content=\"\u6e05, \u626c\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6e05, \u626c\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 \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\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/\",\"name\":\"\u6211\u4f7f\u7528 GitHub Actions\uff0c\u5728 AWS + Terraform + Ansible \u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a CI\/CD \u73af\u5883 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-04-23T20:32:34+00:00\",\"dateModified\":\"2024-04-30T01:02:11+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u6211\u4f7f\u7528 GitHub Actions\uff0c\u5728 AWS + Terraform + Ansible \u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a CI\/CD \u73af\u5883\"}]},{\"@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\/cb5556d2501da73d864cac945e8d9461\",\"name\":\"\u6e05, \u626c\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"caption\":\"\u6e05, \u626c\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u6211\u4f7f\u7528 GitHub Actions\uff0c\u5728 AWS + Terraform + Ansible \u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a CI\/CD \u73af\u5883 - 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\/\u6211\u4f7f\u7528-github-actions\uff0c\u5728-aws-terraform-ansible-\u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a-ci-cd-\u73af\u5883\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u6211\u4f7f\u7528 GitHub Actions\uff0c\u5728 AWS + Terraform + Ansible \u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a CI\/CD \u73af\u5883","og_description":"\u603b\u7684\u6765\u8bf4 \u6700\u8fd1\u56e0\u4e3a\u559c\u6b22\u73a9github actions\uff0c\u6211\u5728aws\u73af\u5883\u4e0b\u5c1d\u8bd5\u4e86\u4f7f\u7528teraform + ansi [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u4f7f\u7528-github-actions\uff0c\u5728-aws-terraform-ansible-\u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a-ci-cd-\u73af\u5883\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-04-23T20:32:34+00:00","article_modified_time":"2024-04-30T01:02:11+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d87d5913a08637a6c1285\/35-0.png"}],"author":"\u6e05, \u626c","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6e05, \u626c","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"4 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/","name":"\u6211\u4f7f\u7528 GitHub Actions\uff0c\u5728 AWS + Terraform + Ansible \u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a CI\/CD \u73af\u5883 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-04-23T20:32:34+00:00","dateModified":"2024-04-30T01:02:11+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u6211\u4f7f\u7528 GitHub Actions\uff0c\u5728 AWS + Terraform + Ansible \u4e2d\u642d\u5efa\u4e86\u4e00\u4e2a CI\/CD \u73af\u5883"}]},{"@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\/cb5556d2501da73d864cac945e8d9461","name":"\u6e05, \u626c","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","caption":"\u6e05, \u626c"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e4%bd%bf%e7%94%a8-github-actions%ef%bc%8c%e5%9c%a8-aws-terraform-ansible-%e4%b8%ad%e6%90%ad%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa-ci-cd-%e7%8e%af%e5%a2%83%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\/48876","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\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48876"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48876\/revisions"}],"predecessor-version":[{"id":90965,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48876\/revisions\/90965"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48876"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48876"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48876"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}