课程结构 学习的目标 能够理解、使用和应用地形 知道什么时候使用不同的功能 在AWS中使用terraform 使用地形与Packer创建自定义图像 能够使用terraform应用DevOps技术
2. Terraform introduction
infratstucture as code 假设您是云提供商的客户,您想启动一些机器,您可以进入web控制台,你可以开始启动一些新实例,但你必须手动操作,你总是需要通过一些表单,点击一些按钮,然后你就可以启动一个实例。Terraform允许你做同样的事情,但是在代码中。它是基础设施的自动化。
基础设施的自动化 **保持您的基础架构处于特定的状态(兼容) terrform保持你的基础设施处于一定的状态。保持兼容的状态,因此,您可以在代码中定义基础设施的状态。例如,您希望启动5个小实例,无论何时运行Terraform,它都会确保这一点这些东西。五个实例。在您的云平台上运行。即使您手动更改了某些内容,Terraform也会尝试将代码与实际的基础设施相匹配。 例如,您有两个web实例,两个卷和一个负载均衡器。这就是你放入代码的东西,然后Terraform会启动2个web实例,2个卷,1个负载均衡器。这就是你放入代码的东西,然后Terraform会启动2个web实例,2个卷,1个负载均衡器。第二个web实例将再次启动以匹配您的基础设施的状态。 通过查看那些Terraform文件,它也使基础设施可审计,你可以看到你的基础设施是由什么组成的。更好的是,你可以保留这些变化,你可以保留你可以看到你的基础设施是由什么组成的。更好的是,你可以保留这些变化,你可以保留您在版本控制系统(如Git或Subversion)中的基础架构更改历史记录。 这意味着你对基础设施的每一次改变,你可以在你的版本控制系统中找到一个审计跟踪。 ** Ansible,Chef, Puppet Saltstack专注于软件的自动化安装和配置。它使机器保持在一定的状态。Terraform可以自动配置基础设施本身。想想看,AWS, DigitalOcean, Azure,所有有API的东西,但不一定是机器本身。当你想自动化机器本身,那么Ansible Chef是一个更好的形式,而不是使用Terraform。但是,Terraform可以与Ansible等自动化软件很好地合作,在基础设施准备好之后安装软件。一个典型的例子是,使用AWS, Terraform启动一些硬件,当这些硬件可用时,你可以使用Ansible, Chef, Puppet等工具,在这些机器上安装和配置软件。
3. Terraform installation
第一步是登录“http://terraform.io”网站。这里,你可以点击下载,你可以为您的操作系统下载Terraform。
我们将“cd”这个目录并从“…”解压。/ download /",这个terraform 0.7 4 darwin amd64.zip,设置path路径
在windows上安装Terraform
官网下载windows包
安装好后,需要配置path变量 添加terraform安装路径
现在就可以在shell中打开了
需要一个ssh客户端
、可以用pyttygen生成密钥
这就是你的 public key
把公钥保存到terraform目录下 你也可以export openssh key,私钥
不需要后缀 、可以保存putty的私钥 保存成ppk后缀
使用putty登录的时候可以选择auth为刚才保存的mykey、
配置好主机地址和会话名称
使用Vagrant安装terrform
如果您不知道Vagrant是什么,它只是启动虚拟机的一种非常简单的方法。 首先,如果你想采用Vagrant的方式,你需要下载VirtualBox。去http://virtualbox.org,点击下载VirtualBox,然后去http://vagrantup.com下载Vagrant。然后你就可以在你的Mac、windows甚至linux上安装VirtualBox和VAGRANT。 你也可以下载已经准备好的镜像 克隆后,您将看到您将拥有一个“Vagrantfile”,一个“README”。Md “,和一个文件夹"scripts”,使用这个"install.sh"。这个“install.sh”将安装Ansible、Terraform和其他有用的软件,如果您是DevOps角色,可能需要这些软件。
**现在你要做的唯一一件事,当vagrant和VirtualBox安装好后,你要输入"vagrant up"。 "vagrant up"将会启动一个ubuntu盒子并为你预装一些软件。然后你安装了这个vagrant 的ubuntu镜像,Terraform就安装在上面了。 ** 如果你有Linux或Mac,你可以输入,“vagrant ssh”, -box: windows你可能想要输入"vagrant ssh-config ",它会告诉你如何连接到这个vagrant框。 演示的是mac,所以使用"vagrant ssh",如果是windows,你可以使用“Putty”之类的工具。 然后。我要输入"terraform"然后你看到terraform被安装了。 如果你不确定是在整个系统上安装它还是使用Vagrant,我宁愿使用Vagrant,因为这样你的系统就应该与拥有的系统相同。
P7 terraform的第一步,在AWS上旋转实例
第一步是开一个AWS帐户,你可以免费开一个帐户,亚马逊还有一个免费的Tier。所以,一些使用,特别是当你使用智能实例时,将是免费。你可以运行T2。Micro”,这是一个在第一年免费使用一个月的实例类型。然后,一旦你打开你的帐户,你可以创建一个IAM admin用户。这是我们将在Terraform中使用的用户。然后我们要创建Terraform文件旋转一个T2。微”实例。所以,如果你开了一个新账户,你总是会关闭你的实例后,你不必支付它。一旦这个Terraform文件被创建,我们将使用" Terraform应用命令,然后我们将发送指令到AWS启动"T2.micro”实例。 创建一个免费账号
而且,如果你打开AWS帐户,你可以在右边看到,它包括“12个月免费访问,包括使用Amazon EC2”,S3和RDS。 因此,这里您可以看到“Amazon EC2—Linux T2.micro 每个月750小时实例. 确保在每一圈之后都关闭实例,这样你就不会为他们买单。
我们现在要做的是,我们要添加一个用户,Terraform可以用它来提供基础设施。点击“身份和访问管理” 点击左边的Users然后我们会创建一个新用户。
我可以输入一个新名称,比如“Terraform是个不错的选择,因为Terraform将使用这个用户。现在,我们将为输入的每个用户生成一个访问密钥。点击创建 这是访问键ID和秘密访问键,你可以用它们登录到AWS,保存即可。
关闭这个,然后我要点击这个Terraform用户,给这个用户admin权限。去"Permissions" “Attach Policy” " Administrator Access" 我要去附加这个Policy。 点击添加
现在,我们有了一个"Terraform"用户,我们可以在Terraform中使用它来访问AWS,它有管理员权限。 它可以创建所有这些服务。提升你的帐户是新的,你还需要做的是你想要到这里,点击EC2。当您第一次使用它时,在使用EC2服务之前,您可能必须接受一些协议。同样重要的是你所在的区域。欧盟爱尔兰,但你可以在任何地区使用。最接近。
P8 terrform的第一步-旋转一个实例
你打开你的账户和你我创造了一种叫做terraform admin用户,我们可以创造一个形象来旋转一个t2-micro,所以你要去执行,进行指挥
做的第一件事就是克隆一个好的存储库。如果对你来说更容易的话,你也可以去L区下载zip文件 有一个初始目录,这里我们有一个文件的应用程序。在这里你可以看到供应商显然在使用。我们需要提供钥匙和秘密钥匙,这样我们就可以把东部单位作为一个地区,你会成为一个应用。 我们将把它称为一个例子,我们将指定它是一个T2.micro,它指定了一个图像,这样我们就可以使用这个图像,它经常改变。所以我要做的是,我要去一个网站,列出我对某一特定地区的想法,那就是欧洲。所以我也要改变我的区域。 我打算用vim编辑这个文件,但是请随意使用你的工作站上的任何编辑来编辑它,需要些acces_key和secret_key,我需要它。 我将在网站上搜索那些使用的云镜像的人,我可以很容易地找到或访问我的区域,我想运行我要选择的最后一个区域。 去寻找,usero网站上云的照片很容易,我可以定位去看看我的地区,我想我要去进行最后的选择与哥伦比亚广播公司因为没有listanza AGM的两个机构。他们只有CBS和外部内存。 这就是我需要的am。
当你创建一个新的目录并想要执行时,你必须始终输入的第一个命令terraform init。这将使供应商的插件初始化。因此,在我们的例子中,它将从您的ip别名下载插件! 我不会让服务器控制。但是无论你做什么来降低自己每次创建一个新的目录,你都必须在执行一个计划之前执行它的形式。
现在我们已经完成了第一步目录。因此,我们可以应用它,也可以问我们是否想执行这些行动如果你同意,我们可以允许 然后他说创造使他成为一种资产。这种资源现在已经创造出来了。我可以看一看控制台,可以去我的控制台 然后我看到一个有效的应用程序,这是一个启动的应用程序。
如果你不想让实例running,想要删除实例,如果你的别名是Freet,你可以保留这个T-2微处理器。如果不想付钱可以摧毁这个实例,摧毁需要一定的时间
另一个有用的命令是terraform plan。terraform plan会看一眼你的计划,然后告诉你他的意图,不应用于你的基础设施。 这里见,新会是作为一个例子如果你那么然后赶出他们计划形式或任何你想使用输出文件只有这样,因此将这一变化保存在out.terrform。 所以当你应用这个的时候,只有当你应用这个的时候,你看到的修改才会被应用,这实际上是他们的改革计划和外部文件的捷径,所以他会这么做。所以我应用这个文件,然后删除这个文件。所以,如果他们使用表格没有一个问题是如果你想要安全的一种捷径和强烈建议你这样做总是适用一项计划的文件,然后外面这个文件,因为文件形式将发生的变化,将适用于基础设施。所以你仍然相信你刚才在屏幕上看到的修改将是适用于你的基础设施的修改。所以你不会在这门课上盲目地修改你的基础设施。 我不会经常使用它,因为它的应用显然比之前的计划要快得多,然后应用于一个计划。但如果你打算在生产中使用它,强烈建议使用谨慎。
P9 terrform的第一步-总结
我们打开了一个AWS帐户,并创建了IAM admin用户。也可以与其他云提供商一起使用Terraform。所以,你也可以开一个DigitalOcean帐户,或一个Azure账户账户,你只需要确保你创建一个管理员账户,或者你创建一个API密匙,DigitalOceans案例,可以访问创建实例修改你想要使用terraform。 我们创建一个Terraform文件在“T2。然后当你运行"terraform apply"来在AWS上执行这些注释。
如果你想测试基于Terraform文件的基础设施,你可以使用“Terraform plan”。"Terraform计划"不会实施这些改变,但会显示出它会带来什么改变。 然后您可以使用“terraform apply”来进行这些更改。 更好的是,您可以使用“terraform plan”与“out”文件,你可以在一个文件,然后保存更改,你只能申请批准更改基础设施使用与这些变化“terraform apply”“terraform ”文件,然后你可以从“terraform ”文件中删除这些变化之后的基础设施可以毁灭。
再次强调,如果你不再需要它,如果你只是在做一个实验室,那么我建议你做一个“terraform destroy”,它只会删除terraform刚刚为你创造的资源。 如果您执行这个命令,那么实例已经终止,并且您将停止为EC2实例支付AWS费用。 在生产环境中使用此命令时要非常小心。 千万不要在生产环境中进行“terraform destroy”,否则它会开始移除你所有的资源。
P10 变量
我们来谈谈Terraform中的变量。到目前为止,我们把所有的东西都放在一个文件中,但在一个文件中所有的东西都不是很好。例如,我们使用变量来隐藏密钥。 你不希望AWS凭据在你的git仓库中,如果你只是将那个文件和凭据一起提交,它会出现在你的git仓库的版本控制中。 通常,您不会在存储库中放入凭据。我们会把它移动到一个单独的文件,这个单独的文件我们不会提交。对可能发生变化的元素使用变量。我们要让这些文件更通用一些。 可能改变的元素我们可以移动到变量中。例如,我们可以用AMls来做。每个地区的AMls是不同的。所以,把AMls移到这些变量上是件好事,这样我们就可以在改变区域时改变它们。您甚至可以在多个区域部署基础设施。在这种情况下,最好把它们写成变量。 您还可以使用变量使您自己更容易重用“terraform”文件。当它们更通用时,就更容易在我们的项目中重用它们。 这就是我们的“instance.tf ",我们一直在用,现在我们要分开这个 **我们首先要做一个“provider.tf”。文件,它只会包含提供者,也就是AWS,密钥和区域。我们不打算把它们填满,我们要引用一个变量。 ** 当我们引用一个变量时,我们会用符号 “$” "{var."然后是变量名。这里第一个变量的名字是"AWS ACCESS KEY" 然后我们要创建一个“vars.tf” 文件,在这个文件中。我们要声明变量。所以,你看,变量AWS ACCESS KEY,变量AWS SECRET KEY,和变量AWS REGION。 如果花括号为空,则没有定义值。 如果我们指定一个"default"等于什么,现在,我们在设置一个默认值。然后,我们要创建的第三个文件是terraform.tfvars”和在这个文件里。我们要把变量的值赋值。它们在这里仍然是空的,但在演示中我将填写这些:“AWS ACCESS KEY”,“AWS SECRET KEY”,和“AWS REGION”。 那些"keys"等于的值将会是我们的密钥文件或者包含所有变量的文件。 这是我们要放到"git ignore"里的,这意味着它永远不会出现在仓库里,在我们的qit仓库里,因为我们从来不想让"access key"和"secret key"暴露在仓库里。 “AWS REGION”,我们甚至可以忽略这个,因为我们已经设置了默认值。只有当你想覆盖默认值时,你才需要在"terraform.tfvars"中设置它。 最后,我们有“instance.tf”。什么都没有改变。我们只是将AWS的提供商移动到一个单独的文件中。现在,您可以看到我们仍然在这个文件中填充了“AMI-ID”。我们来看看如果我们把这个也移到一个变量上会发生什么。 所以,第一个“instance.tf",这里我们将把"AMI-ID"改为"lookup"。因此,lookup会在map变量中进行查找.
我们想在这里创建一个"map变量"你可以看到在右边粗体显示的。我们要创建一个map类型的变量它具有键值相关性。我们看到默认是us-east-1然后是AMI-ID, us-east-2然后是另一个AMI-ID. 如果你再看一下"instance.tf "会发生什么。然后我们看到,我们传递了两个参数:第一个参数是变量本身,“ami”,第二个参数是你想在我们的例子AWS REGION中查找的“key”。 如果这个区域,比如说,“eu-west-1”,那么这个AMI值将是“AMI -0d729a60”,这是我们的map中的“eu-west-1”的值。 你可以使用底部的URL, https://cloudimaqes.ubuntu.com/locator/ec2/,来查找你的ami - id。因为“ami - id”可以更改,id可以在将来更改,它们对于不同的区域也是不同的。这是一个查找“ec2”实例的“ami - id”的好网站。
P11 演示使用变量
让我们看看他的演示如何在Terraform中使用变量。之前的github仓库,demo-1,里面有三个文件,instance.tf,它包含一个变量。它会使用“var.AMIS”进行查找,所有的AMIS都会存储在里面,它会查找这个键,AWS REGION。 **它的意思是我们要在vars.tf设置”,AWS_REGION”和“AMIS"变量。我们还要设置"AWS_ACCESS_KEY"和"AWS_SECRET_KEY". ** 所以,我们需要在一个单独的文件中定义这些键。这些“AMIs”你可能想要在ec2/locator这个网站上查找它们。 我们也有“providers.tf”,在这个文件中,你可以看到提供商AWS,你可以看到“ACCESS KEY”,“SECRET KEY”,“REGION”等变量。 这些变量在"vars.tf"中声明。这里是变量和名称,但它们还没有值。 这就是我们在terraform.tfvars中要做的。这通常是一个你不想放到版本控制中的文件。如果你看一下"git ignored"你会看到我们会忽略所有这些文件,所以它们永远不会被提交到版本控制中,它们永远不会出现在版本控制中,但我们现在要定义它们。 所以,我要定义我的"AWS ACCESS KEY",我的"AWS SECRET KEY"可以定义我的"AWS REGION",但我不打算这样做,因为我对默认值很满意。与“AMIS”一样,我可以覆盖它们,但这里我只使用默认值 它通常不会真正覆盖这个变量,因为如果您想更改“AMIS”,那么您要做什么呢?您将在这个“vars.tf”中进行这些更改,然后你可以提交到版本控制。这些“ami - id”是公开可用的。 你可以把它们提交到你的版本控制中," 我们会做你的"terraform计划"来看看qoinq要执行什么它会启动这个"aws实例实例"使用这个"AMI-ID"使用" t2.micro 如果你真的想测试这个,你可以用"terraform apply",但如果你只是想测试它在哪里工作,那就没必要了。因为如果我再次删除这个“tvars”,并做一个“terraform plan”,那么它将要求“access key”,它将要求“secret key”。如果我没有提供正确的值,您将看到“请求中包含的安全令牌无效”。 我得到了403错误,所以我不能这样使用。
还有,另一个提示,有时在vagrant中,如果你的时间不对,你也会收到无效的请求。所以,一定要确保时间是正确的。你可以把这个和你家里的系统比较如果时间不对你可以用"ntpdate",如果我执行"sudo apt-get install ntpdate"和"ntpdate np.ubuntu.com "那么它就会更新我的时间。你看这里,即使在这里我已经有367秒了,我的时间是错的。但是,360秒对亚马逊来说还是可以的,只有当它再多一点的时候,它才会开始抱怨。
P12 软件配置
在实例上配置软件有两种方法。我们现在做的是,我们已经启动了实例,但我们没有在它上面放任何软件。所以,我们现在所做的是,我们已经启动了实例,但我们没有在它上面放任何软件,就像它只是一个标准的Linux映像,用来启动和启动一些服务。但是,通常你会想要提供一些东西,并且已经安装了一些软件。 您可以构建自己的自定义“AMI”、自定义映像,并将您的软件与该映像捆绑在一起。 Packer是一个很好的工具。Packer是一个不同的工具,所以我将在另一个时间讨论Packer。现在我要讨论另一件事。另一种方法是引导标准化的AMls,就像您现在所做的那样,然后在上面安装所需的软件。您可以使用文件上传来实现这一点。 你可以远程执行文件和脚本,你也可以使用像Chef, Puppet, Ansible这样的自动化工具。
Terraform自动化的当前状态现在是“2016年第四季度”,chef集成在Terraform中,所以你可以在“Terraform”文件中有chef声明。此时您还没有集成Puppet代理。但是,您可以使用“remote-exec”运行Puppet。 对于Ansible,你可以先运行“terraform”,输出IP地址,稍后你会看到输出,然后在这些主机上运行“Ansible -playbook”。 这可以在一个工作流脚本中自动化,所以你首先必须运行Terraform,然后是Ansible。还有一些第三方计划将Ansible与Terraform整合在一起。所以,更好的集成即将到来,只是现在还没有。 让我们来看看五个上传,如果你想添加一个文件上传,我们可以添加供应文件到我们的资源AWS实例。我们只说"source-app.conf"这个文件将会在我们的.tf文件。 目的地是这个示例实例上的目的地。文件上传是上传文件或脚本的一种简单方法。它可以与“remote-exec”一起使用来执行脚本。因此,在这个例子中,我们确实上传了一个“config”文件,但我们也可以上传脚本,然后使用“remote-exec”,我们可以执行那个文件或脚本。供应方可以在Linux主机上使用“ssh”,也可以在Windows主机上使用“WinRM”。 这意味着我们必须在本例中使用“ssh”。因此,您可能必须重写“ssh”的默认值。你可以使用连接。 这是一个供应器文件的例子,我们会上传脚本ssh我们会修改Terraform用来连接到这个主机的参数你经常会这样做。 这里我们有一个ssh连接,有用户和密码,连接类型默认是ssh,如果你想使用另一种类型,你需要声明type =然后是another type。 我们使用一个用户和一个密码,当在Aws上旋转实例时,“ec2user”是Amazon Linux的默认用户,而ubuntu是我在本课程中使用的ubuntu图片的默认用户。 **通常在AWS上,您将使用“ssh”密钥对,而不是使用密码。它是密码的替代品。它是密码的替代品。要使用"ssh"密钥对,你需要的是另一个资源,AWS密钥对,你要给它一个名字,在本例中我们使用"mykey"并为它指定一个公钥。因此,密钥对意味着您将创建一个私钥和一个公钥。 ** 公钥就是你要上传到AWS的那个。这就是为什么你在这里定义"public key" =然后在这里你可以插入你的public key。私钥是用来登录的。 如果你看一下AWS实例示例资源,这里还有“key name”=,这里我引用了我的公钥,这样AWS就知道它需要在AWS实例上安装这个公钥。 然后,当我要使用我的"provisioner"文件,我的"provisioner"文件将上载"script.sh",
然后我要引用我的"私钥" 如果你看一下连接,我们仍然有一个用户,它需要是“ec2”用户或“ubuntu”用户。然后指定私钥,而不是指定密码。然后使用这个“私钥”通过“ssh”登录到“ec2”实例,并上传这个“script.sh”。 您也可以使用私有和公共自己登录。
所以,当我们之前第一次启动一个实例时,我们没有使用私钥,这意味着我们不能登录到这个实例,只有当你指定这个AWS密钥对时,你才能使用你的私钥登录到你的AWS实例。
然后在你上传脚本之后,你会想要执行它。可以使用“remote-exec”执行脚本,你们在幻灯片上看到的粗体是一个带"remote-exec"的供应器。这将做的是,它将使用"chmod"改变权限。它会加上"+x"这样我们就能确定我们真的能执行这个脚本,因为"+x"意味着可执行。然后,我们执行一个带有参数的脚本。
P13 软件配置DEMO
我现在要运行的演示程序是“demo-2”,这里有以下文件。首先,我需要相同的“access key”和“secret key”。所以,我要再次创建terraform.tfvars,并把我的访问权限和秘密密钥放在这里。然后,让我展示一下这些文件中有什么,我有一个"instance。tf" 这个在理论上和我给你们看的很相似,但还是有点不同。
首先,我们将把我们的AWS密钥对发送给Amazon。这是公钥,我在这里用这个变量。这将加载文件的内容这个路径将来自这个变量。 那么,让我们看看“vars.tf”。表示我有“mykey”作为私钥,还有“mykey.Pub”作为公钥。 我也定义了一个实例用户名,它将是Ubuntu。
我们再看一遍,公钥路径。如果你引用"mykey",这里我的key在AWS中将被命名为"mykey"。 然后我有2个供给者。首先是文件提供程序,然后是远程访问提供程序。文件提供者将上载"script.sh"到"/tmp",我不会上载到"/opt",因为我们将使用Ubuntu用户,而Ubuntu用户没有"/opt"权限。你可以把它上传到“/opt”,但是你必须使用一个root用户。"REMOTE-exec"会改变权限然后执行它。我将用“sudo”执行它,这意味着这个脚本将作为ROOT执行。 连接用户将是Ubuntu。 !在这里插入图片描述 这来自变量实例用户名,也就是ubuntu私钥是私钥文件路径的内容,也就是mykey. 我仍然需要创建这些文件,这是非常容易的工具称为"ssh keygen", “ssh-keygen mykey”, "ssh-keygen -f mykey"将为我们生成这个密钥。 我不打算设置密码短语,所以生成的时候什么都没写。 这就创建了“mykey”和“mykey.pub”。如果你不使用vagrant box,你可以自己做,你可以使用"Puttygen"这是另一个工具,用来创建兼容ssh的私钥和公钥。如果你用的是Mac,那么你的控制台中也有"ssh-keygen"。 还有一件事我们要做。这个连接使用ssh,默认情况下,如果您使用这个“AMI”、这个“instance_type”和这个“key_name”,我们不会指定一个安全组。我将在稍后的课程中解释安全组,但我们仍然需要打开ssh。可以使用安全组打开对该实例的ssh访问。
将演示如何手动操作。之后我们还会在Terraform中这样做。 我们到AWS控制台。选择正确的区域,我选择“俄勒冈”只是为了向您展示一个空的区域,因为我的“US”区域已经有很多安全漏洞。
在“networking”下的“VPC”,你会看到你已经有一个“VPC”和3个子网,你有一个安全组。 所以,点击这个安全组。这是一个默认的安全组。我想做的是,我想改变模块。所以,安全就像防火墙一样。我想做的是,我想允许从我的IP地址访问这个实例,这个实例将使用这些默认安全组。点击“编辑”。 我要添加另一条规则我要说"ALL TCP"流量。
然后我需要知道我的IP地址。 你复制粘贴这个,这是我的IP地址然后粘贴这个,"/32"因为它只有一个地址。这里有一个地址,点击“保存” 这个规则将允许这个源IP地址,也就是我,通过TCP访问所有端口。所以。我们现在启动这个实例,我可以通过"terraform apply"来实现。 你看这里,它首先会创建这个密钥,这是我创建的公钥然后它会使用mykey作为密钥名启动这个实例。首先它会创建实例,然后它会提供脚本,然后它会执行脚本。这里可以看到配置文件。现在,它将尝试通过“ssh”连接。 我只是暂停一下视频,因为这需要一些时间。这是结束,“Apply complete!”,添加了2个资源,你看到它执行脚本。 我还没给你们看剧本里的内容。脚本中只有几行,"apt-get update"和"apt-get install nginx" 所以,如果我向上滚动,文件被复制了,然后“remote-exec”连接到这个主机,用户是Ubuntu,使用私钥,然后它执行脚本。 首先运行“apt-get update”,然后我们可以看到它开始安装“nginx” 然后,它安装了"nginx",所以我们要复制并粘贴这个IP地址,我应该能够在浏览器中访问这个IP地址,我看到欢迎到"nginx"。"nginx"是安装的,这是一个web服务器,你可以使用脚本提供任何你想要的软件,或者在脚本中你可以使用像Puppet之类的东西,或者有很多其他机制来提供。 这是使用shell脚本的最简单和最常见的方法。 还有,当你完成时,不要忘记“terraform destroy”,我会输入“yes”,然后,它会移除键并移除AWS实例。
P14 Demo Windows服务器配置
在这个演示中,我将做的和上一个演示中完全一样,只是这次我将在Windows服务器上做.如果您对Windows Server配置不感兴趣,那么可以跳过这个演示。 在这个演示中,我将使用文件demo-2b,我已经执行了terraform apply。所以我已经有了我“terraform.tístate.backup”。 我有一个"mykey"和一个"mykey"。,我使用“ssh-kegen”工具创建的。还有一个test.txt在这个文件夹。这个,我要上传到我的windows实例。让我们看看这个windows实例中有什么。这和上一讲完全一样。 这个资源"aws实例"是不同的,我们将使用windows的"AMI"。然后,我有一个实例类型“T2.MICRO”。我要通过powershell脚本。稍后我们将更详细地了解用户数据。 这里有一些powershell脚本会在引导时执行并执行"net user"它会添加一个新用户也在变量中定义,这将使用一个带有密码的Terraform。我们要把这个用户添加到管理员组我们要配置"winrm"因为"winrm"是我们要在这个Windows服务器上上传和执行文件的地方。 我们为身份验证设置了一些参数,我们将输入"AllowUnencrypted",为了安全起见,你应该配置加密。 这只是一个简单的演示,所以我将允许这个“Unencrypted”是真实的,但你可以在网上找到如何配置证书和有这个安全的命令。 它使用5985端口,这些将允许。它还将5986用于https(安全连接)。 然后,我们会停止"winrm"我们会确保会自动启动一个boot然后我们会启动它。
现在,我们要准备这个文件,这个"test.txt",我要在"C"驱动器的"test.txt"中上传它。而且,这是一个正向的"/“而不是反向的”"。连接类型为“winrm”。 用户将是这个"terraform"用户,它在vars.tf中定义。这个带有“INSTANCE PASSWORD”的“terraform”用户 所以这里我们用和"INSTANCE PASSWORD" 使用terraform aply 会告诉你键入密码,需要复杂的密码,否则这是行不通的。你需要有大写字母和数字,它需要足够长,否则它将不符合密码策略,它将无法工作。你用"terraform apply"然后它会创建这个实例。 我用这个密码写了一个"terraform apply" 然后,它将创建“AMI”,创建这个AWS实例并在其上配置这个文件几乎需要4分钟。因此,现在已经准备好了这个实例,您就可以使用那个Terraform用户和密码登录远程桌面了。如果你用的是Mac电脑,你必须先从App Store安装远程桌面。和Linux一样,如果你在使用Linux,你需要安装一个软件来做远程桌面,它被称为OurDesktop。如果你有Windows,你可以从远程桌面客户端开始。 这是我的远程桌面工具,我要连接到IP地址,你可以在AWS控制台找到,我使用Terraform用户和密码。我要连接,然后打开文件浏览器。 这里是test。txt,这是可行的。我们有这个test。txt然后我们添加用户来执行winrm
您还可以使用管理员用户登录,只是为了向您展示它是如何工作的,因为它与Linux实例有一点不同。要获取windows密码,你可以到AWS控制台的实例中输入"获取windows密码" 在这里,您可以基于您的私钥内容,即“mykey”,然后获得密码。 另外,确保有一个安全组允许流量到你的ip地址。 因此,如果我单击default,那么您就可以更改入站规则以允许该IP地址使用正确的端口。 获得管理员密码的另一种方法是使用shell和AWS命令行实用程序,如果你还没有,可以从AWS网站下载。只要输入这个命令,“aws ec2 get-password-data --instance-id private -launch-key”,这就是这个目录中的“mykey”。如果我把这个实例ID改成正确的,我就能得到我的护照,我可以用管理员身份登录,密码是这个。以Administrator用户登录。现在,你有两个用户。获得管理员密码有点困难,这就是我在用户数据脚本中创建另一个密码的原因,因为Terraform不容易检索这个密码。 最后一件事,如果你看一下vars。,您将需要为您的区域检索“AMI-ID”,用于Windows机器。找到这个的一个简单方法是回到AWS控制台,点击这里启动实例,我在爱尔兰区域,而你可以在另一个区域,这里你可以看到"AMI-ID"。 这是你使用的Windows Microsoft Windows Server 2016基础你只需要复制粘贴到我的ID这是你可以很容易找到"AMI-ID"的方法。这对于Windows来说有点难。 此外,Terraform对于Windows实例并不像对于Linux实例那样成熟,因为目前在Terraform中还没有办法检索管理员密码。 你必须使用这些用户数据创建一个新用户,但在未来他们肯定会解决这个问题。
P15 输出属性Outputting attributes
在本节课中,我们将讨论Terraform的输出可能性。Terraform保存你创建的所有资源的属性。 例如,AWS实例资源具有“公共ip地址”属性。可以查询和输出这些属性,这对于输出有价值的信息或向外部软件提供信息非常有用。
下面是一个示例,您可以使用“output”来显示AWS资源的公共IP地址。 所以,第一行,你看到的是我们之前一直使用AWS实例资源然后我们添加一个名为“知识产权”的“输出”,我们会说,价值等于“AWS instance.example.public ip”可以指任何在你的变量属性通过指定完整的元素。资源类型,在本例中是“aws instance”,资源名称是“example”,然后属性名称是“public ip”。 您可以使用的属性还有很多,“公共ip”地址只是其中之一。你可以在Terraform网站上的AWS实例文档中找到完整的列表。 您还可以在脚本中使用这些属性。这里我们有一个“local-exec”条款。 这个命令将在本地执行,不是在AWS实例上,而是在本地执行。在本地,它会执行echo然后是"aws instance。example。private ip"它会将这个发送到"private_ips.txt"。 每次这个资源创建时它都会添加,这个“私有ip”到一个“私有ip”地址列表。如果我们有多个aws实例,然后你就可以在文本文件里给她这些"私人ip地址"。 例如,在基础设施配置之后启动自动化脚本是很有用的。 你也可以填充在Ansible主机文件中的IP地址,然后你可能能够使用Ansible playbook在这些主机上的软件供应。 另一种可能是,您可以使用“私有ip”等属性作为参数执行脚本,然后该脚本将处理资源名称和ip地址的映射。 为了澄清一点,你执行脚本,你有一个参数,可以是"私有ip"地址,这个脚本将保留资源名的某种映射,在我们的例子"example"中是" ip地址"。这样,你就有了一个包含实例名称的列表。
P16 DEMO输出属性Outputting Attributes
这个演示是来自git仓库的“demo-3”,我有一个“instannce.tf”。第一行和往常一样,然后你可以看到我在那里放了一个条款。这个local-exec会执行aws instance.example。private ip,它会把这些放到一个文件private ip。txt中。这个命令只能在Linux或Mac上运行,因为你使用的是local-exec.因此,它将不是在实例上执行,而是在本机执行。
然后,您还将输出"公共ip"地址使用"aws instance.example.public ip"作为这个输出的值。我们要复制我的“terraform.tfvars”。,只包含“AWS ACCESS KEY”和“AWS SECRET KEY”的变量。 在“vars.tf“我有一个和以前一样的。运行"terraform apply" 它会创建一个实例。此外,如果您想在稍后研究这个实例,则必须声明密钥对,为了更容易理解,我在演示中删除了这个密钥对,因为我实际上并不打算登录到这个实例。 "Local-exec"执行这个echo和这个内部IP地址,并将它添加到"private ips"。 这里,我们有这个文件,现在创建了"私有IP "这个IP地址。所以,这可能是一个工作流的一部分,我们可能运行一个Ansible剧本,将使用这个“私有ip”地址,例如,在这个实例上提供一些软件。 我们还可以输出更多的IP地址,我们可以放置名称、示例或实例类型,并将其发送到脚本或文件 你还可以看到在terraform apply的末尾我们有输出然后是ip =然后是外部ip。 这是因为我们在这里看到的“output ‘ip’”是一个公共ip地址。 **所以,当我们使用AWS时,你总是有一个私有IP,就是这个,还有一个公共IP,就是这个。 ** 目前这些都是动态的,所以你会看到不同的。在后面的课中,我们会看到如何使do为静态的。这是AWS特有的,你们可以在Terraform AWS课程中找到。
P17 remote state
在这节课中,我将谈论terraform状态。Terraform保持了基础设施的远端状态。它将其存储在一个名为terraform.tfstate的文件中。在一个名为“terraform.rfstate.backup”的文件中,还存在先前状态的备份。当你执行时,“terraform aply”一个新的“terraform.state”并且备份到磁盘。这就是terraform追踪遥远状态的方法。如果远程状态改变,你再次点击“terraform apply”,terraform将再次进行更改以满足正确的远程状态。 例如,你终止一个由terraform管理的实例,在"terraform apply"之后,该实例将重新启动。 因为,如果你手动终止一个实例实例已经消失了,然后当你执行"terraform apply"时,terraform会注意到实例不再存在了,但你必须找到那个实例,所以它会再次启动它。
你可以在版本控制中保留“terraform.tfstate”。例如,使用git,它会给你“terraform.tfstate”的历史记录。tfstate文件,实际上只是一个大Json文件。它允许您与团队成员合作。 不幸的是,当两个人同时工作时,使用git你可能会遇到冲突。你总是需要做一个“git push”和“git pull”,以确保你使用的是最新版本。本地状态在一开始运行得很好,但当你的产品变得更大时你可能想要存储你的状态久远,这就是我现在要讲的。 “terraform.tfstate文件可以远程保存,使用Terraform的后端功能。默认后端称为“local backend”,它是我们到目前为止一直在使用的本地terraform状态文件。 我们可以使用的其他后端包括:S3,它甚至有一个锁定机制,它在Amazon上使用dynamoDB,Consul,也有一个锁定机制,然后还有Terraform企业,这是一个商业解决方案。 使用后端功能肯定有好处,当在一个团队中工作时,它允许协作,远程状态对整个团队都是可用的。如果你像S3和Consul一样支持锁定,那么你就不会有冲突的问题了。只有一个人可以在同一时间更新状态。可能的敏感信息不仅存储在远程状态。 如果您的状态中有敏感信息,那么该敏感信息在本地不再可用,而只能在远程可用。一些后端还将启用远程操作,然后“terraform apply”将完全远程运行。 这些被称为“enhanced backends”,如果你能读到更多关于增强后端去这个URL。当我做这堂课的时候,只有本地后端,但我相信在未来,他们会有更多增强后端。 那么,如何配置远程状态呢? 它们实际上是配置远程状态的两个步骤: 首先,将后端代码添加到。tf”文件。 然后,运行初始化过程,让我们从一个示例开始。 要配置Consul远程存储,可以添加一个名为“backend.if”的文件有以下内容,你有terraform,后端consul,然后你把consul集群的地址,在这里加粗。您还可以选择在此Consul集群中存储状态的确切路径。 这段代码你把它放在backend.tf。或任何名为".tf"的文件。然后,这就是你的配置。 您还可以将状态存储在s3中,这可能更常用。这里你只有“后端s3”,你有一个桶名,你有一个键,键在你的目录s3中,你可以指定一个区域 如果你不指定区域,那么terraform仍然会在你进行初始化过程时询问你。当使用S3远程状态时,最好使用AWS命令行实用程序配置AWS凭据。因此,您使用"aws configure",9来为您的用户配置您的凭证。 这只是因为您不能在这个后端配置中使用变量,因为变量只在Terraform的后面阶段使用。在执行任何其他初始化之前,后端代码需要访问两个AWS和两个S3。 然后下一步是在其中执行Terraform,这非常简单。你只需要键入"terraform init"然后"terraform"就会初始化后端。
如果您没有指定区域,Terraform将询问您指定的区域,然后它将通过连接到AWS来检查凭证是否正确。 如果一切顺利,你就会得到一条成功信息。使用“terraform状态”的远程存储将确保您始终拥有状态的最新版本。它避免了提交和推送“terraform.tfstate"到版本控制。所以,它更容易维护。 您必须小心,因为Terraform远程存储并不总是支持锁定。文档总是提到远程存储是否可以使用锁定。对于我向您展示的示例,S3和Consul都支持它。也可以直接在属性中指定只读远程存储。tf”文件。 所以,如果你只是想从你的“terraform.tfstate”中读取信息。文件已经是远程的,你可以使用这段代码从状态中读取。 例如,如果您需要实例id,或者需要来自远程存储的信息,并且基于该远程存储,您希望在Terraform中执行某些操作。这只用于从您的远程文件的“只读”提要。 这实际上是一个Datasource,我稍后会讲到从数据源中,你可以创建信息,并在你的terraform项目中使用这些信息。 例如,生成输出非常有用。
接下来,我将演示如何在S3中设置远程状态。
P18 Demo 远程状态
在这个演示中,我将向您展示如何在S3中使用Terraform State,使用S3后端。你需要做的第一步是转到AWS并点击S3。在页面上,您需要创建一个新的Bucket。 你不需要指定一个Bucket名称,我将命名为“terraform-state”,然后在末尾添加一些随机字符,因为Bucket名称需要在一个区域中是唯一的。我要在爱尔兰地区创建这个Bucket然后点击“创建” 现在我们的Bucket已经创建好了。Terraform还建议启用版本控制,如果您可能不小心删除了一个文件,您可以很容易地检索到它,因为Amazon保留了所有版本。
然后,如果你不需要版本控制,你仍然可以开始挂起它,如果你不再需要它。 接下来您需要为我们的用户配置AWS。我要输入"aws config "然后我需要输入我的aws访问kev和我的密钥,以及我想要使用的区域。你不能在后端使用变量,所以你需要确保Terraform可以使用Amazon保存的凭据登录到AWS。实际上,Amazon将这些凭证保存在“~/.aws/credentials”。 这正是Terraform寻找AWS凭证的地方。
现在,让我们回到我们的"demo-4"我要创建一个新文件"backend。tf"在这个"backend。tf" 我要把我对"大地"的定义写出来。我指定一个Bucket名称、刚刚创建的Bucket和一个键。你现在可以保存这个。
然后,我们需要输入"terraform init",我们没有指定具体的区域。现在,terraform 要我们进入那个区域。我要输入“us-west-1”。然后,Terraform会告诉你“成功配置后端s3” 因此,Terraform将从现在开始使用S3作为它的远程后端。现在让我来做另一个“terraform plan”。这将启动一个示例实例,我将输入"terraform apply"
这将创建这个示例实例,就像之前的演示一样,但现在状态是S3上的"terraform-state" 让我们再来看看AWs。然后,在S3中Terraform Bucket中,我们有一个真正的Terraform demo-4 、这里,我们有状态文件,它与状态相邻
P19 数据源
对于AWs等某些提供商,Terraform提供数据源。数据源为您提供动态信息。AWS可以使用API以结构化格式提供大量数据。Terraform还使用数据源公开该信息。例如,有一个数据源为您提供了一个“ami”列表或可用性区域列表,因为这是动态信息,总是可以更改的信息,然后您可以将其用作Terraform中的输入,然后使用它。
**另一个很好的例子是数据源,它提供了AWS使用的所有IP地址。如果您想基于AWS区域过滤流量,这是非常好的,因为这样您就可以看到该区域正在使用的IP地址,然后您可以对这些地址进行过滤。你会说"我只允许列表中的IP地址"。 假设我们想让所有来自欧洲亚马逊实例的流量。在AWS中过滤流量可以使用安全组来完成。可以通过协议、IP范围和端口对进出流量进行过滤。协议类型包括DCP、UDP、ICMP。IP范围是指IP地址的范围,可以是一个IP地址,也可以是数千个IP地址和端口。“SSH”使用22端口,“HTTP”网站使用80端口。 它非常类似于Linux中的IP表,或者只是您可能使用的防火墙设备,这就是Amazon中的安全组。 ** 这里有一个我们可以使用的数据源的例子。这个数据将被用作输入。 当我们指定“regions”等于“us-west-1”,“eu-central-1”时,我们是在指定我们想要看到这些区域的所有IP地址,“us-west-1”代表爱尔兰,“eu-central-1”代表法兰克福。而且,我们还指定我们只希望将它用于“ec2”服务。我们可以使用这里看到的AWS安全组中的数据。我们可以指定一个“入口”规则,就像传入规则对传入流量一样,并且我们可以说,我们只允许来自这些IP范围“european_ec2-cidr blocks”的这些数据的IP。 所以,这个“cidr”是一个IP地址的范围。 基本上,我们说"这些范围的IP地址是允许连接的"在我们的例子中,端口443使用DCP,我们也添加了一些标签,我们添加了一个标签或当它被创建时,我们还添加了一个带有同步令牌的标签。 所以,如果数据改变了,那么这个同步令牌也会改变,下一次你运行"terraform apply"时,它会再次更新安全qgroup。
P20 数据源demo
在这个演示中,我想向你们展示Datasources是如何使用我刚才在理论中展示的那个例子的。我有“provider.tf”。vars.tf”,我指定一个默认区域在这里可以覆盖。我仍然有“AMIs”,这实际上是不必要的。 现在唯一不同的是安全性“group.tf”。我会解释这意味着什么,你有从AWS提取的数据,它包含所有的IP范围。我们对这两个区域进行过滤。 我们只需要“ec2”服务,而这正是我们要提供给安全组的。
所以,这里我们使用这个变量到"aws ip ranges", “data”,它指的是这个数据," aws ip ranges",它指的是这个,“name”, “european ec2"是"european ec2”,然后我们要使用的属性是"cidr blocks"。我要做的是"terraform apply"然后我们会看到会发生什么。 “Apply complete!”它添加了一个安全组。让我们看看控制台中这个安全组。
在“VPC”页面,在“VPC”页面,“安全组”我过滤了“来自欧洲”的安全组,它们可以添加到所有模块中。端口为443安全HTTP,协议TCP。这个源,这些IP地址,这些范围,它们来自这个数据源。它们是从AWS中提取出来的然后我们在安全组中使用它们。
这里也有技术,它创建一个日期和一个同步令牌。如果同步令牌改变,每当有更新,我做“terraform应用”再次,然后这些模块将被更新。所以,这是一个很好的方法,如果你需要管理使用数据源的动态数据。
P21 模板
模板提供程序可以帮助创建定制的配置文件。您可以基于Terraform资源属性中的变量构建模板。 例如,您可以使用Terraform资源中的公共IP地址构建模板。结果是一个可以在Terraform中用作变量的字符串。因此,得到的模板也可以在其他资源中使用,字符串包含模板。 例如,它可以是一个配置文件,这个概念可以用来创建通用模板或云初始配置。 例如,它可以是一个配置文件,这个概念可以用来创建通用模板或云init配置。 “cloud init config”只是一个在启动实例时可以读取配置文件的软件。
在AWS中,您可以在实例第一次启动时传递需要执行的命令。这也是用这片云完成的。但在AWS中,他们使用他们的措辞,它被称为“user-data”。 如果您想传递依赖于Terraform中的信息的“user-data”,例如IP地址,您可以使用它来提供一个模板。 在本课程中,有一个单独的部分是关于用户数据的,所以我将简单地向你们解释这些概念,然后我们将在后面的课程中进行演示。 首先,我们创建一个“模板文件”。只是一个简短的脚本。 然后,你创建一个“template_file”资源,它将读取这个模板文件,然后它将用Terraform创建的AWS实例的实际IP地址替换为Terraform创建的AWS实例的实际IP地址。 当你看这些代码片段时,数据模板文件,my-template,然后在第二行,我们只是指你在幻灯片顶部看到的脚本。 init.Tpl”实际上是“bash”和这个“echo命令”。 同时,我们也要指定我们想要替换的变量。 所以"myip"我们想用"aws_instance_database1.private_ip "取代"myip" 然后,您可以在创建新实例时使用“my template”资源。 假设你想运行一个web服务器,你有资源"aws_instance" "web"你将使用"user_data"这个"user_data"将是这个将要被渲染的模板。当Terraform运行时,它会看到它首先需要旋转数据库,然后它会生成一个模板,因为它会替换这个IP地址,只有这样,它才会启动web实例。02:33.920——比;02:41.360因为它会把这个带有数据库IP的模板提供给网络服务器。 web实例将在用户数据中注入一个模板,当它启动时,用户数据将创建一个文件"/etc/myapp "。使用数据库的IP地址配置。
提醒一下,这就是要执行的脚本。"myip"被一个真实的数据库IP改变,因为我们正在运行这些模板,然后它将被用作"user-date"
P22 其他供应商
我已经讨论了AWS提供程序,然后讨论了Datasources和模板提供程序。这只是让我快速概述其他提供商,你可以在Terraform使用。terrform工具创建和管理基础设施资源。 Terraform有很多供应商可供选择。AWS是最受欢迎的也是我在这门课中讨论最多的。任何开发API的公司都可以作为Terrafom的供应商。 下面是Terraform支持的其他云服务提供商的例子。谷歌云,Azure, Heroku和DigitalOcean。那些只是最受欢迎的。如果你有内部基础设施,那么你可以使用VMware vCloua, vSphere,OpenStack和Terraform。 它不仅局限于云计算提供商,您还可以使用Datadog提供商监控。GitHub用于版本控制,Mailgun用于邮件发送,DNSSimple, DNSMadeEasy, UltraDNS用于DNS托管。 完整榜单可在“https://terraform.io/docs/providers”上找到。 所以,就像我说的,任何开放API的公司都有可能成为Terraform的供应商。Terraform提供的资源非常相似。 比如看一下这个DigitalOcean示例,你可以看到我们还有一个令牌,它与“AWS ACCESS KEY”相同,在DigitalOcean中你只有一个令牌. 然后,我们有一个资源,它将旋转一个服务器,在DigitalOcean中它被称为“droplet”。 所以,我们创建了一个带有图像的新水滴,在这个例子中是“Ubuntu,然后我们给它命名为“web-1”。 一个“Region”,“New York City 2”数据中心,“size”是你的实例中内存的大小。 这就是在DigitalOceans中指定实例大小的方法。 一旦你学会了如何用AWS做所有的事情,那么就很容易开始使用其他提供商,比如DigitalOcean、谷歌cloud或Azure。 Terraform的工作方式没有改变,只是底层的API有所不同。 当然,如果你想使用Azure或谷歌云,你必须了解他们的产品,但在Terraform方面,它们是非常相似的。
P23 Modules
下一讲将是关于模块的,你可以使用模块使你的Terraform更有条理。 你也可以使用模块来使用第三方模块。模块来自GitHub或者你可以重用你的代码的一部分。 例如,您可以在AWS上创建一个网络,称为“Virtual Private network”,即VPC。 一旦你在Terraform中编写了这些资源,你就可以把它们放在一个模块中,他们可能会在其他项目中重用这些资源。或者您可以重用它们,因为您在AWS中使用多个区域。如果你想使用Git中的模块,你可以使用module,在本例中输入名称"terraform-module-example",然后输入"source" =,然后输入地址,例如"github。com",然后Git进入仓库。
您还可以使用本地文件夹中的模块。然后你就从这个开始。”/",我们知道Terraform需要在"module-example"文件夹中查找。 还可以将参数传递给模块。“源”=“module-example,我们将传递“region”,“ip-range”和“cluster-size”给这个模块。 这些参数将在"module-example"中使用在"module"文件夹中,你又有了"Terraform"文件。 因此,这里你看到的是“module-examples/vars”。Tf “声明了一个"区域”,“ip范围"和"集群大小”,因为门是输入参数。 如果你看一下“module-example/cluter”。Tf ",那么在这个例子中,我们有三个实例,这些变量可能会被使用。 然后在底部,我们有“module-example/output.Tf ",在这里我们可以将信息发送回主代码。 我们有aws-cluster和一个value,这里的value是我们启动的每个实例的公共IP地址。 因此,在主模块中,我们可以使用这个变量,“aws-cluster”,它有一个值,是所有这些实例的公共IP地址。
**这是完全相同的方式,你会做的主模块。因此,要在代码的主要部分使用模块的输出,可以使用以下代码片段. 我将在屏幕上放一些东西然后你可以使用的变量是"module “[modulename]”,在我们的示例中,"module-example。Aws-cluster “,” Aws-cluster "是我们从模块输出东西时选择的名称。 **
我只是在这里使用输出资源,但你可以在Terraform代码的任何地方使用变量。这只是一个你可以在屏幕上输出一些东西的例子,但是他们也可以在其他资源中使用模块的输出。
外部模块Demo
**我将使用一个外部模块来启动控制台集群。这些文件位于“demo-6”中。”key.Tf会获取一个公钥并将其作为mykey上传。让我们看看“vars.Tf “,我们正在寻找一个默认的"mykey”。 ** 因此,我们首先需要生成一个SSH密钥。我生成了"mykey"和"mykey。pub"这个——公钥将作为一个名为“mykey”的“aws_key_pair”上传 然后我们有“providers.Tf “,看起来一样。modules.tf,这里我们将使用模块控制台。这个模块控制台将需要从“github.com”从这个路径下载。我们传递了"key_name"和"key_path”“key_name”是公钥,因此,已经可以使用上传到AWS的公钥。然后,“key_path”是私有密钥的路径,然后可以使用它来分发文件和执行脚本。 然后,“key_path”是私有密钥的路径,然后可以使用它来分发文件和执行脚本。 你必须先运行"terraform get" "terraform get"会连接到这个远程存储库并在那些terraform中下载这个模块。现在你有了Terraform模块,一个唯一ID,这里还有git仓库。 所以,我们有一个“consul.tf”。output.tf”、,“README.md”,和“variables.tf” 你可以看看那些模块,但是使用模块的想法是,你不需要知道里面有什么,你应该能够运行它。"terraform apply"用这个模块运行这个terraform。 这里可以看到它创建了一个密钥,一个安全组,现在它创建了一个服务器实例,它使用了" T2.micro",你也可以传递一个变量来改变“实例类型”。 现在,它将主机连接到供应,现在它将安装控制台。
现在第一个已经设置好了,它正在启动第二个和第三个,这两个将加入集群,所以它们也将被供应。 第一个需要先启动的原因是,这样Terraform就知道第一个节点的IP地址,然后它就可以指示其他节点加入集群。您可以“ssh”到此主机,并查看控制台集群。 让我们确保在完成这个实验之后执行“terraform destroy”,因为您现在正在运行三个实例,它将执行“destroy”,而destroy将删除密钥、安全组和实例。
Terraform Commands Overview
在这节课中,我将给你们一个命令概述。Terraform非常关注资源定义,但是它只有有限的工具来修改、导入和创建这些资源定义。 例如,今天是2016年第四季度,仍然没有一个好的工具来导入您的非terrform维护的基础设施,并为您创建定义。 现在您可以使用一个名为“terraform”的外部工具,但是要将您当前的基础设施转换为管理terraform基础设施需要相当长的时间。 所以,有可用的工具,外部工具,但在我看来,它们仍然不够好,如果你已经有了基础设施,它仍然需要很长时间来转换为terraform管理的基础设施。但是,在未来,我认为这一切都会得到解决。 让我们看看一些可以使用的terrform命令。 首先"terraform apply",就是应用状态。 “Terraform destroy”,摧毁所有terraform 控制状态。所以,请谨慎使用这一点,因为你可能有一个开发Terraform和一个生产Terraform,你不会是第一个在自己的环境中进行Terraform破坏的人。 “Terraform fmt”将Terraform配置文件改写为规范的格式和样式。它基本上可以很好地格式化你的代码。因此,通常在提交更改之前使用这些命令,以确保格式正确。因此,通常在提交更改之前使用这些命令,以确保格式正确。 我们把"Get"看作是模块,下载和更新模块。您可以使用“terraform graph”来创建配置或执行计划的可视化表示。 所以,如果你有很多terraform文件,你可以使用“terraform graph”来创建一个你可以使用的图形表示。 这个是非常方便的,“terraform import address id”, import将尝试tina基础设施资源与id识别,并导入一个状态到"带有资源id地址的terraform "。Tistate 。这意味着,如果你有一个正在运行的实例,但你还没有拥有terraform,那么你可以使用imports导入状态,“terraform import”。 然后是地址,这是你首先要写的研究定义,然后是ID。如果它是AWS上的一个实例,那么它将是一个实例的ID。你可以在Terraform的文档中看到,在底部,总是有一个导入的例子。对于您想要添加的任何资源,ID都是不同的。 如果有人使用命令来更新你的“地形”。Tfstate "将会找到你可以使用它的方法。如果您只是创建新的基础设施,则不需要使用这个。只有当您已经拥有现有的基础设施时才会这样做。 当然,最大的缺点是,您仍然必须手动编写资源定义。 这只是为了导入一个国家。如果你想输出任何资源,你可以使用"terraform output"。使用name只会输出特定的资源。 "terraform plan"我也用过了。它显示了对基础设施所做的更改。 “Push”,我们没用过,我也不打算用。还有一种工具叫Atlas。Hashicorp的企业工具tlhat可以从集中式服务器自动运行Terraform。如果使用push,就可以将更改推送到Atlas。如果你对他们的商业服务感兴趣,可以看看Atlas,但它也是一款需要付费的软件。 “refresh”,刷新远程状态。可以识别状态文件和远程状态之间的差异。所以,如果你想区别,你只需要运行"terraform refresh"它就会比较你的。Tfstate”文件。 您可以使用“terraform remote”来配置远程状态存储。如果您想将状态存储在S3中。 “Terraform show”,显示人类可读的一个状态或计划的输出。
然后你可以使用“terraform state”。可以使用该命令进行高级状态管理。例如,重命名一个资源,你可以使用"terraform state mv" move然后你可以重命名一个资源叫做"aws instance “示例"到"aws instance.production” 如果你改变了你的状态你想要重命名一些东西,那么你必须使用这个。 “taint”,手动标记一个被污染的资源,这意味着它将在下一次应用时被销毁并重新创建。所以,如果资源有问题,你想重新创建它,你可以使用"terraform taint"。 “Validate"只是验证你的"terraform语法” 还有"untaint"如果你做了"taint"又想消除它,然后你可以做“untaint”。这不会改变任何基础设施。
P26 Demo Terraform Command
已经使用了terraform apply,有一些正在运行的基础设施,我想向你展示的只是一些有用的命令,你将能够在下一个演示中使用。所以,这个基础设施现在正在运行,我已经从terraform.tfstate”文件。你可以阅读这个Json,但如果你想让它更具可读性,你可以使用"terraform show". 然后,你就得到了为你准备的所有东西。然后,你就得到了为你准备的所有东西。该demo包含VPC、安全组、实例和部分存储。如果你需要公共IP,你可以使用"terraform show"。你会说"terraform show"我想看到所有的公共IP地址。 我可以说"grep public ",公共IP,我有一个公共IP的列表。 **通常你会使用像输出这样的东西,就像我之前展示的那样。输出,myoutput “aws instance.example.public ip"公共IP,然后你要做的是,如果你想再次知道输出,你只需要输入"terraform output”。然后,它会告诉你这些值。 显然,当你定义了输出时,读取输出会更容易,但这需要更多的工作。 这就是为什么你要用"terraform show"然后用"grep"来得到你需要的东西,我通常会很快找到Json。然后是一个标有“污点”的东西。 ** 假设我们的实例,我这里有一个实例,AWS "example"实例。假设我知道它有问题,我想让它重新创造它。
所以,如果我这样做,“terraform plan”,那么它将会比较遥远的州和我当地的州,它说什么都做不了。它不会重新创建这个AWS实例,但我想重新创建它。 所以我要做的是,我要用"terraform taint"。“terraform taint”有个名字。
如果我说,我想"污染"这个AWS实例"example"然后它会说,资源AWS实例。示例中的模块根已被标记为受污染!” 当我这样做时,"terraform plan"它会说,它想重新创建这个AWS实例。 这里,它会创建一个新的实例,因为它是污染及其依赖关系也会重现,因为在这种情况下我们有附件的体积,稍后我们将看到它意味着什么,它也需要重建,因为我们的实例将成为一个新实例。
首先,我只是想“untaint”它,这也是有可能的。所以,现在它不会再被污染了。 然后,我会给你们看一个图表,你们可以使用"terraform graph"它会生成一个图表。你甚至可以从中生成一个漂亮的PNG。 使用可以解释这一点的工具来帮助你看到DOT格式的图形输出,有软件可以把它放在一个漂亮的图形。
你也可以自己读。这里你会发现AWS卷附件实际上连接到这个AWS instance。example。 所以这两种资源之间是有关系的。 当你有两种资源之间的关系时,就有可能如果一种资源需要被重新创造,那么你的另一种资源也需要被重新创造这就是你所看到的,“terraform plan”。 您只做了一个小更改,但需要重新创建多个资源。 因此,使用不同的图表,可以帮助您理解基础架构中的依赖关系 如果你想刷新远程状态,使用"terraform refresh",它只会在本地查看remote状态和terraform remote状态。没有发现任何不符之处。 这就是刷新状态的作用。你可能想看看我的“vpc”。Tf ",你不会真正看资源,而是看它是如何格式化的。这里有4个空格。
如果您想在任何地方使用相同的格式,可以使用“terraform fmt”。如果我这样做,“terraform fmt vpc.tf”.然后您可以看到它使用了标准格式。两个空格而不是四个。因此,在将更改提交到版本控制之前,这是一种确保有正确格式的简单方法 最后,我将展示一些关于导入的内容。所以,这里我们有“terraform”。Tfstate " and in our "。tfstate“我们有“aws实例”,这可能你没有这些信息,就像“ami_id”、“availability_zone”,如果您已经创建了这些实例,然后使用“起程拓殖应用”,只有一种方法来创建起程拓殖的基础设施,这是定义,然后运用他们的资源。 但是,假设你有一些基础设施,你想要使用Terraform,但是它已经存在于,比如说,AWS上。 **如果我们移除这个移除这些行,然后如果你去做一个"terraform plan"它会想要重新创建我的AWS实例,因为它不知道这个实例,它不知道我有一个实例在本地状态,在这个本地。tfstate”文件。 ** 这就是“terraform import”的由来。导入,可以导入已经存在的基础设施在您的“。tfstate”文件。 你需要知道的是这个ID。在这里,我们有ID,这是远程状态ID,和地址,这是您的资源地址。我们要做"terraform import"它是"aws实例",然后我想导入一个aws实例。“ID。这是ID,您可以在AWS仪表板或使用AWS命令行实用程序中找到这个ID。 每个不同的资源都有不同的ID。这就是为什么你需要查看文档,在Terraform文档中,在网站上,你会找到你需要的,并将其用作ID.这是Terraform的网站:https://terraform。Io /docs/providers/"这是关于"实例" 然后我会看到,如何导入一些东西,你可以使用"terraform import aws instance “。[资源名称]i-[id]”。这里的ID是AWS实例ID,你会看到,如果你点击左边的其他东西,例如,如果你要重要一个ELB,那么ID是不同的,它是一个名字。 因此,AWS中的每个ID都是不同的。
例如,“terraform import"它不再读取变量了。 我们必须输入"eu-west-1"它导入我们的"aws instance” ID,现在是"terraform "tfstate"将被此AWS实例更新。 你可以在没有Terraform的情况下为你已经创建的所有资源做这件事。但缺点是,你仍然需要自己创造这些资源。 有软件可以帮你做,但不是很好,你仍然需要更改所有的名字和东西。所以,手动操作会更好 我希望在未来这种情况会有所改变,但目前,这只是在AWS中导入已经存在的基础设施。
P27 vpc概论
首先,您需要了解如何创建VPC。这是我们要做的第一件事,我们将首先向您解释什么是VPC,然后我将演示如何使用Terraform建立VPC。 在Amazon AWS上,我们有一个默认的VPC, VPC即Virtual Private Network。 对你来说,通过AWS启动一个实例是很好的。到目前为止,我们使用的是默认VPC。每次我们启动一个实例,它都是在这个默认VPC中启动的。VPC在网络层面隔离实例。 它就像你在云中的私人网络。 最佳实践是始终在VPC中启动实例,您可以在默认VPC中启动实例,也可以在您自己创建的VPC中启动实例,由Terraform管理的VPC是最佳选择。 **还有“EC2-Classic”,这基本上是一个大型网络,AWs客户可以在其中启动他们的实例。 现在,最好的做法是在VPC中启动一切。一些云服务提供商,比如DigitalOcean,他们没有像VPC这样的东西,它看起来更像“EC2-Classic”,你只有一个biq网络,如果你没有设置好防火墙,这样,内部网络中的某些人就可以访问您的一些服务,即使他们不应该这样做。 VPC更好,因为它是你自己的网络.它与客户网络完全隔离。 对于较小到中等规模的设置,每个地区一个VPC将适合您的需求。一个VPC中的实例不能通过私有IP地址与另一个VPC中的实例进行通信。因此,如果您在两个不同的vpc中启动了两个实例,那么它们将永远无法通信。 他们仍然可以交流,但只能使用他们的公共IP,这是不推荐的。因为,公共IP通过互联网,从互联网上你可以接触到一切。 如果这两个实例也有公共IP地址,你仍然可以彼此通信,这并不推荐。 另一种解决方案是,如果您有两个相互通信的vpc,您也可以将两个vpc链接起来。叫做"对等peering"或"VPC对等 peering". 这也是一种可能,但默认情况下,你要做的是创建一个VPC,把实例放在那里,如果它们必须相互通信,你要把它们放在同一个VPC中。 **
P28 vpc简介-第二部分
这里有一个VPC的例子,它覆盖了多个可用分区,这些可用分区是一个区域中的数据中心,有多个子网,私有子网和公共子网,在下面的幻灯片中,我将讨论这一切意味着什么。 在Amazon AWS上,首先创建自己的虚拟专用网络,以便在其中部署实例或数据库。 你在左边看到的,是你首先要创建的,然后我们将这些实例启动到这些子网中的一个,所以"main-public-1" main-private-1这些被称为子网。 每次启动一个实例时你都会说,我想把那个实例放到那个子网中。 左边的VPC使用“10.0.0.0/16”地址空间,允许使用以“10.0”开头的IP地址,如“10.0.x”。然后你可以选择编号。 这是VPC覆盖“eu-west-1”区域,该区域是爱尔兰的Amazon AWS区域。在这个区域,我们有三个区域,“eu-west-1a”、“eu-west-1b”和“euwest-1c”。 您将看到每个区域都有两个或三个区域,然后用“a”、“b”或“c”表示它们。 让我们稍微讨论一下这些私有子网,当你要建立一个VPC时,你会看到你可以使用的IP地址都是私有子网,私有IP地址。 这些子网或IP地址不能在Internet上使用。只能在VPC内部、家庭网络和办公网络中使用. 只有几个私有子网,我将在这张幻灯片上展示给你们。 我主要使用的是“10.0.0.0/8”子网,所以你可以使用地址空间从“10.0.0.0”到“10.255.255.255”。这是您可以使用的最大子网范围。如果你以后要链接你的子网,你可以使用多个"/16"子网,就像我在之前的幻灯片上展示的,因为你不需要使用"/8"。 你可以把它分成多个更小的子网。 这个“/8”是你可以使用的最大的一个,但通常你会把它分成更小的几个。 “172.16.0.0/12”,如果您使用默认VPC,您将看到实例中激活的IP地址在此范围内。 这是亚马逊默认使用的范围。然后,你还有“192.168.0.0/16”,你也可以使用它。所以,这些是私人子网。 我的意思是,当你创建VPC时,一开始你通常会选择你的子网,我会在“10”的私有子网中使用“/16”创建一个VPC,但可以随意使用其他的子网。 那么,这个“/16”和“/8”到底是什么意思呢? 假设我们有“10.0.0.0/8”子网,然后网络掩码是“255.0.0.0”。我们能使用的IP地址总数将近1700万个。这是完整的“10”范围。因此,如果你看一下示例,你可以将所有值从“10.0.0.1”分配到“10.100.200.20”或“10.255.255.255”。 您还将看到Amazon保留了一些IP地址,因此其中一些您不能使用。 然后,您有一个“10.0.0.0/16”和子网掩码“255.255.0.0”,这是您可以使用的IP地址65,536,这就是我们为VPC使用的IP地址。 所以,当我创建VPC时,我通常使用这个,它给了你足够的ip地址在你的VPC中使用,但你可以有多个VPC都以“10”开头。如果你看这些例子。如果你有“/16”,你可以有“10.0.5.1”,“10.0.20.2”,“10.0.100.3”,所有这些总是“10.0”. 这里有另一个例子,如果你使用"10.1.0.0/16",它是你得到的相同数量的IP地址,但你的IP地址以"10.1"开头。 我们的IP地址在10.0.0.0和10.0.0.255之间。 这对于一个VPC来说太小了,但是我们要用它来划分VPC的子网。 你也可以有一个“10.0.1.0/254”,然后每个IP地址从“10.0.1”开始,然后是数字。还有,“10.0.0.5/32”,这只是一个IP地址。如果需要过滤安全组中的单个主机,则指定“/32”。
P29 terraform简介-第3部分
VPC中的每个可用分区都有自己的公有子网和私有子网。看看左边, VPC中的每个可用分区都有自己的公有子网和私有子网。看一下左边,你会看到六个子网,你会看到一个公共子网和一个私有子网。这些子网有一个/24。 所以,你可以分配255个IP地址,我的是亚马逊保留的那个。 你可以看到三个区域,“eu-west-1a”,“b”和“c”。然后,你会看到一个公共和私人在每一个。 这些子网都有自己的IP范围。因此,在子网主public中启动的实例将有IP地址“10.0.3”。X”,它将在“欧盟西部1c”可用区启动。亚马逊将一个数据中心称为可用分区。 所以,在“eu-west-1”中,我们有3个可用区域,3个数据中心,如果你在主公共3中启动一个实例,它总是会在“10.0.3。x”中有一个IP地址”范围 在main private 1中启动的实例将拥有一个IP地址“10.0.4”。x”,它将位于亚马逊的“eu-west-1a”可用区。 因此,我们将一个VPC划分为多个子网,这些子网在一个特定的可用分区中完成。 子网可以是公共的,也可以是私有的。 所有的公共子网都连接到一个互联网网关。这些实例还将具有一个公共IP地址,允许从Internet访问它们。 主公共1 2 3,连接到互联网网关,这就是为什么在子网中会有公共实例启动它们会有私有IP地址,但它们也会有公共IP地址,然后它可以从互联网到达这些实例。 我们早些时候启动的一个实例也将有一个公共IP地址,这就是我能够从互联网上联系到他们的原因。 在私有子网中启动的实例不能获得公共IP地址,因此它们将无法从互联网上访问。 附带说明一下,您仍然可以使用一种称为net-gateway的机制,它允许私有实例在外部进行通信,而不是从外部到内部。 在主子网中启动的实例没有获得公共IP地址,因此它们将无法从互联网上访问。主-公有的实例可以访问主-私有的实例,因为它们都在同一个VPC中。 当然,如果您将防火墙设置为允许彼此之间的通信,如果您有一个通信规则禁用它们不能通信,那么就会出现这种情况. 但是,如果存在不同子网的实例,且实例的私有IP地址位于同一个VPC中,则实例之间可以直接通信。 通常,您将公共子网用于面向Internet的服务或应用程序、数据库、缓存服务,并将所有这些都纳入私有子网子网。 如果使用负载均衡器,通常会将本地均衡器放在公共子网中,然后将服务于应用程序的实例放在私有子网中。负载均衡器就是你从互联网上连接到的东西。 然后负载均衡器可以在内部连接到私有子网中的实例。
P30 VPC 和NAT 的demo
我将使用demo-7文件夹中的文件。与这个演示相关的文件是“nat.tf”和“vpc.tf”。 将首先解释“vpc.tf”。要创建的VPC是主资源aws VPC,名称为“main”。 在AWS中我们还给它一个标签名"main"。之后他们可以在Ul中看到,你有一个叫做main的VPC。 “cird block = 10.0.0.0/16”,则在该VPC中创建的子网为"/24"。 “Instance tenant = 'default”,这意味着你启动的每个实例都有一个默认的租户。 因此,在一个物理硬件上可以有多个实例。 如果您要求每个物理机器只有一个实例,您可以更改这个值,但它的成本要高得多,所以大多数人都将它设置为默认值。 除非你有需求,你启用DNS支持,DNS主机名,“Classiclink"是"false”,如果你想链接你的VPC到EC2经典,那么你可以把它设为"true"。 我们要创建子网。记得幻灯片上说的吗,我们将有3个私人和3个公共子网。
我们从3个公共子网开始,这3个是公共子网。这里指的是VPC,即aws_vpc.main”,再加上ID,“cidr块标准为“10.0.1.0/24”。 所以只有255 + 0,就是256个IP地址,减去我们不能使用的保留地址。你还会在启动时给每个实例一个公共IP当你初始化一个实例时,实例会从这个范围得到一个IP,你也会得到一个连接到互联网的公共IP。 在这种情况下,“可用区域”将是“eu-west-1a”,如果你想在另一个区域启动,你可能想要改变这个。 另外两个子域也是一样的。
你可以看到这里我们使用的是“10.0.2”,“availability”在“b”上。 这里我们用“10.0.3”,“availability”在“c”上。我有三个私有IP,主要的区别是我们在发行时没有映射公共IP。 所以,如果你在这个子网中启动一个实例,你只会得到一个私有IP地址,然后我们需要一个互联网网关,因为公共子网需要连接到一个互联网网关。
这个资源在这个VPC中创建了一个互联网网关,这个根表是可以推送到实例中的东西。
我们推送一条路由,表示所有非内部的流量“0.0.0.0/0”表示所有IP地址,即除了匹配VPC范围的IP地址之外的所有IP地址。这些将通过互联网网关路由。如果你想联系一个网站,这个网站会有一个ip地址,它会和你的VPC不一样。 **所以,这将通过互联网网关。这将被推入实例,但只有当我们关联这个路由表时,它才会被创建到每个公共子网。 你有3个公网子网,所以每次,这个公网子网都需要这个路由表。其他的可以暂时保留为默认值。 **
这是关于VPC和公共子网的,记得我在幻灯片中说过nat网关。 因此,默认情况下,私有实例只有私有IP地址,它们永远无法访问互联网。 如果你仍然希望实例可以访问internet,而不是反过来,比如internet不能访问你要在私有实例中启动的实例,那么你可以设置一个nat网关。这可能很有用,例如,用于更新。假设你在那里运行一个数据库,但它仍然需要获取更新。 然后你可以通过这个nat网关发送所有这些流量,并且只允许nat网关访问,例如,运行更新的服务。为此,您需要一个静态IP地址,在Amazon中称为EIP弹性IP地址。
我们将在后面详细讨论。你要用这个IP地址来创建一个"aws nat gateway"。
然后你对互联网网关做完全相同的事情,但对nat网关你说你想推送一条路由,“0.0.0.0/0”重定向或发送流量到nat网关。然后,你将这个路由表与私有实例关联起来 这是完全可选的,如果你想要一个纯粹的私有子网,不能以任何方式联系互联网。那你就不该这么做。 你就把它放在“vpc”里。Tf,而且你不用nat。Tf。 这真的取决于你的需求,也有可能你只是使用一个实例,你把它放在一个公共子网,一个私有子网仍然可以到达,例如,下载,更新,等等。
然后我们可以运行这个。所以,如果你想在没有"nat"的情况下运行这个,那么你只需要删除这个文件。否则,你必须"terraform apply"这将会建立VPC。然后,在下一节课中,我将展示如何在那个VPC上运行这个实例。
P31 在VPC中启动EC2实例
现在我们已经建立了一个VPC,我们可以开始在这个VPC中创建新的实例。构建一个EC2实例非常简单。 以前我们使用“provider.tf”。或者我们使用AWS config来管理凭据。 然后,我们有一个“instance.tf”。,然后我们有vars.tf”的区域信息和AMI id 现在,我们想在一个新创建的VPC中启动实例,使用安全组,并使用Terraform上传的密钥对。这是我们修改后的“instance.tf",如果我们仍然有资源AWS “example”,AMI ID,以及这个“实例类型”。 我们要添加的是VPC子网。现在,你会说,你想让这个实例在某个子网中启动,而这个子网只属于一个VPC。 在这种情况下,“main public 1”将是子网,安全组,你将使用,“vpc_security_group_id”。 我们可以为这个实例分配一个或多个安全组。这个安全组叫做allow "ssh"我将在下一张幻灯片中展示。现在,我们有一个公共SSH密钥,“key_name”等于,然后是一个对可以使用的公钥的“密钥名”的引用。 因此,我们需要为EC2实例创建一个新的安全组。 安全组就像防火墙一样,由AWS管理。您指定输入、输入和输出交通规则。 如果您只想访问“ssh”,这是端口22,那么您可以创建一个安全组,允许在IP地址范围“0.0.0.0/0”,这意味着所有IP地址的入口端口22。 最好的做法是只允许你的工作,或家庭,或办公室IP地址,Ti你去,“http://whatismyip.org”,你会看到你的IP地址是什么,然后你可以使用你的IP地址“/32”,因为它只有一个,所以代替这些“0.0.0.0/0”。我会使用所有的IP地址,但是当你使用所有的IP地址时,它通常会改变你的IP地址。 您还需要允许所有从实例发出的流量再次“0.0.0.0/0”,这是我们的IP地址。 所以,无处不在。通常,在传入规则中只允许一个端口,而在传出规则中只允许所有端口。你可以让它更有限制性。但大多数人他们只允许所有外出的流量。
我也不认为允许出站流量是个坏习惯。然后,我们需要创建安全组。这是我们的“allow-ssh”安全组。安全组与VPC绑定。您可以看到,我指定主VPC ID为我们的VPC。然后,指定名称、描述、入口和出口规则。这里的出口只是允许一切。 "Protocol =’-1"符合所有协议。“from_port ='o”,"to port='o "表示所有端口。和"cidr block “,如果它是"0.0.0.0/0”,那么它是所有的IP地址。 Ingress “from port = 22”, “to port = 22”, “protocol"也是”-1",如果我们可以说,"only TCP because "ssh"只需要TCP,实际上可以使它更有限制性。如果你想改变这一切,就看你自己了。 然后我们允许我们的IP地址,但你可以把它改成你的IP地址,让它更有限制性,这是最好的做法。
**为了能够登录,最后一步是确保AWS在实例上安装我们的公钥对。我们的EC2实例已经引用了一个“aws_pair. kepair”。,你只需要在Terraform中声明它。这里我们有一个名为"mykeypair"的键它指向"mykeypair.pub"。您还可以使用一个变量来代替文件名,以便您可以在以后轻松地更改它。 ** “keys/ mykeypair。将被上传到AWS,并允许在实例上安装这个公钥来启动实例。你永远不会上传你的私钥。
您使用您的私钥登录到实例,但它永远不会上载到AWS。你只需要上传或者让Terraform上传你的公钥,也就是"mykeypair ",以获取您的私钥。如果您丢失了私钥,有人可能会登录到您的服务器并窃取您的数据。
P32 在VPC中启动实例Demo
在这个简短的演示中,我将向您展示如何在VPC中使用密钥对启动带有安全组的AWS实例。 而且,如果您已经创建了VPC,那么您可能需要复制“terraform.Tfstate "和你的"terraform.tfstate。备份”。 如果没有,那么您可以重新创建VPC。有可能您必须先删除它,然后再重新创建它。 你会看到如果你得到一个错误,然后你必须先删除它。 我还创建了“mykey”和“mykey”。Pub “,记住我们可以使用"ssh-keygen -f"然后是"mykey”。 看起来和理论上一模一样,要启动子网,所以我们从主公共IP得到一个IP,如果我看看“vpc.tf, public表示它将从这个范围获得一个IP地址。 它将推出“eu-west-1a”
让我们先试试“terraform plan”,看看在你应用之前会发生什么。 我已经创建了我的VPC。这就是为什么它在这里刷新,现在我们要启动这个AWS实例"T2.micro,使用“mykeypair”,在这个子网中。 这是“mykeypair”,我们将允许端口22的“ssh”。 输入"terraform apply",然后它会启动这个实例。 我刚意识到我想连接到它,我没有要求terraform输出IP地址。因此,我可以进入AWS控制台,或者更改代码并添加一个输出字段。 或者我也可以快速进入“terraform.tfstate”,打开它。你看,这是一个大Json。 在这里,您可以立即看到私有DNS、公共DNS和公共IP。 那么,让我们用ubuntu登录到这个IP地址,这个mykey,私钥,作为密钥。 **现在,我们可以使用sudo成为administrator.我做一个“ifconfig”,我们看到,这是IP地址,子网范围内的内部IP地址,“10.0.1.90”,然后是“。90",它只是动态的,它得到这个范围内的动态IP地址。你还可以看到在/24上有一个子网“Mask”。你看不到实例本身的公网IP地址,你只看到一个网络接口有一个内部IP地址,但这是一个公共子网,也有一个公网IP,你看不到。 ** 如果我们使用“root-n”,我们看到VPC中的所有东西都有一条单独的线路,它们将直接连接,而不需要经过网关。如果没有提到这个范围,那么它将通过网关,网关是“10.0.1.1”。这些是其中一个保留IP地址,因为这是网关。所以,IP数据包需要进入互联网。 例如,如果您试图ping谷歌,那么它们将首先被发送到“10.0.1.1”,然后“10.0.1.1”将把这个包路由到Internet。
P33 EBS卷
在这节课中,我将讨论块存储,在Amazon中也被称为EBS。“T2.micro。使用这个特定AMI”实例会自动增加8 GB的EBS存储。EBS是弹性块存储的简称,也是EBS提供的一种服务。一些实例类型在实例本身上也有本地存储。这就是所谓的短暂存储。当实例终止时,这种类型的存储总是会丢失。 因此,有两种类型的EBS存储和本地存储,而我们的T2.micro。我们没有这种类型的本地存储,但是你会看到其他的实例类型有这种临时存储实例附带的GB by EBS根卷存储也被设置为在实例终止时自动删除。 您仍然可以指示AWS不要这样做,因为它仍然是永久存储,但这有违直觉。 这是一种反模式。在大多数情况下,8GB的操作系统(根块设备)就足够了。 在下一个示例中,我将添加一个额外的EBS存储卷。额外的卷可以用于日志文件或放在实例上的任何实际数据。在您指示AWS删除这些数据之前,这些数据将一直存在。 因此,在删除实例之后,卷仍然是持久的。可以使用Terraform资源添加EBS存储,然后将其附加到我们的实例。这是一个例子我们有一个AWS实例例子。 然后,我们在某个可用性区域有一个AWS EBS卷,称为“EBS -volume”。 我们还指定了十亿字节的大小,我们指定了一种类型,我在这里指定了gp2,它是通用存储,是SSD,但也可以是标准存储,是磁性存储,io1或st1。你可以在AWS网站上查找这些代码。 有些存储速度更快,比如供应应用程序,有些存储存档数据的速度会慢一些。 “gp2”是最常用的,因为它是通用存储,但没有提供SSD。 然后将该卷附加到一个EC2实例。 然后指定“device_name”,“volume_id”,它指的是AWS EBS卷和一个“instance_id”
所以,你只需要把两个资源连接在一起。在前面的示例中,我们添加了一个额外的卷。
根卷为8GB,但仍然存在。我刚刚又增加了20giqabytes作为额外的容量。 如果想增加根卷的存储或时间,可以在“aws_instance”资源中使用“root_block_device”。 这就是它的样子。你可以用“卷大小”指定“根块设备”。 在本例中是16gb,它还可以在这里指定“卷类型”,即“gp2”。 您还可以指定“delete_on_termination终止删除”标志。 这就是我之前谈到的,你可以说当这个实例终止时,我不希望AWS删除这个EBS卷。 这是有可能的,因为EBS是持久性的。 如果您将使用实例时间与临时卷,临时卷不是持久性的,所以它总是实例删除后被删除。
EBS卷DEMO
**在这个演示中,我将向您展示如何将EBS卷附加到EC2实例。对于这个演示,我将使用“demo-9”中的文件。在这个演示中,唯一与我们相关的文件是这个"instance.tf"。我们再次使用AMI的“示例”实例。 它是T2.micro 在VPC子网中加入“ssh”。 ** 我们有一个键,然后我们想要在“availability zone = 'eu-west-1a '”中添加这个“aws_ebs_volume”,称为“ebs-volume-1”。20gb大小,gp2,然后我们要附加这个。这个设备名称将是“/dev/xvdh”,在登录到实例之后,我们将需要这个。 这是卷ID,和实例ID。所以,我只需要做一个"terraform apply"。 首先,当然,你需要创建ssh密钥, 然后你可以键入"terraform apply"Apply complete,让我们再看一遍,在这里。文件,因为我需要这个公共IP。 但是,就像我说的,你可以输出这个公共IP。 当然,您也可以登录到AWS控制台,在那里您就可以很好地了解分配给实例的所有公共IP地址。 我要登录,然后输入"sudo -s",然后,在这里您可以看到“/dev/xvda1/”8gb。当然,你总是会失去一些存储空间。当这个实例终止时,我们会失去这个,因为我们没有指定这个在终止后需要保留。 另一个,你看不到,因为我们首先要在它上面创建一个文件系统。然后我们必须挂载它,然后如果我们要删除实例,该卷仍然会持久化,除非您手动删除它,或者使用Terraform删除它。 因此,记住我使用“/dev/xvdh/”作为名称,因此我应该能够在这个“xvdh”上创建文件系统。我将在这个文件系统上创建一个“ext4”文件系统,它是一个Linux文件系统。 我应该可以装上这个。 我将创建一个目录,“/data”,“mount /dev/ xvdhs / /data”,然后是“xvdh 20G”。 此时,当您重新启动机器时,这个卷将再次消失。您可以只添加一行,“/dev/xvdh/”进入“/data ext4 defaults 0 o”。如果你想知道“o o”是什么意思,就用“man fstab”吧。一切都在这里解释,
它是第5和第6个字段,这是因为dump和“fs check”,如果你对它感兴趣,可以阅读它。
然后,“unmount /data”,我们只需输入“mount /data”,而不需要输入“/dev/xvdh/”,因为它可以在“fstab”中查找。 现在,如果我们重新启动,数据就会一直可用。现在有一个问题。 假设我们终止了实例,然后使用Terraform重新启动一个实例,那么更改就会消失,因为"/etc/fstab"基于"/etc",而"/“也会消失。 所以,我们接下来要看到的是“user_data”,而“user_data”将允许我们在启动时执行脚本。 其中一个脚本可以是在"fstab"文件中添加一行以确保我们可以挂载”/data".当我们以这种方式工作时,我们实际上是在创建不可变的基础设施,因为我们的数据将是大量的。我的意思是你想保留我们的数据。 我们可能会快照这些EBS卷。但是,如果我们丢失了所有的实例,那么我们可以重新启动实例,然后我们可以确保这些实例,当它们使用用户数据和脚本重新启动时,它们与卷和卷上正确的软件处于完全相同的状态。 所以,从理论上讲,你可以把你的整个基础设施拆掉,然后重新启动你的整个基础设施,它看起来完全一样。
P35 Userdata
在这一讲中,我将讨论Userdata。AWS中的Userdata可以在启动时用于进行任何定制。 这意味着在启动实例时将执行Userdata。 不是在重新启动或重新启动实例时,而是在启动时。您可以安装额外的软件,准备实例加入集群。例如,“consul cluster”或ECS集群,这是一个docker实例类。 这也是AWS提供的服务。或者它可以执行命令和脚本。 你也可以像我在上节课解释的那样,挂载卷。Userdata在启动时挂载卷非常有用。Userdata仅在实例创建时执行,而不是在实例重新启动时执行。 Terraform允许您将Userdata添加到“aws_instance”资源中,就像简单命令的字符串一样,或者使用模板。 记得我们课上提供的模板吗,你们可以用它来做这个。它用于更复杂的指令。 **我将展示一个Userdata的例子,用一个字符串。它将在引导时安装OpenVPN应用服务器。这里我们有AWS “instance.tf”。 我想你现在差不多都能背下来了。只添加了粗体文本。 ** 这里我写上,user_data =,然后是一个字符串。在这个字符串中,可以有一个脚本。 这是一个bash脚本,bash表示一个新行,它将从"openvpn"网站做双重get,下载"openvpn-as"包,然后我们将安装它。 这将在引导时安装OpenVPN应用程序。 接下来,您可以执行URL,或者您可以向脚本添加一些内容,以确保您拥有OpenVPN安装的密钥和用户。
另一个更好的例子是使用Terraform的模板系统。在这里,我们使用一个变量作为Userdata,这个变量指的是一个“clouddinit”。被渲染的配置。 让我们来看看这个“cloudinit.tf”配置。我们将使用提供程序" clouddinit "然后我们将使用一个模板文件引用另一个脚本,就是你在这里看到的那个。 这是一个“clouddinit”脚本。让我们先关注左边的,然后我会解释右边的。我们传递一个 变量 这只是一个你可以传递变量的例子。它实际上并没有被使用。
然后,我们有一个名为“cloudinit-example”的资源“template_cloudinit_config”。
我们说我们不会使用“gzip”或“base64_encode”,这只是生成的clouddinit脚本的不同文件格式,当你传递Userdata时。 在这种情况下,我们可以把它作为明文传递。它有一部分,我们的文件名是init.cfg,还有内容。 并且,内容类型是“text/could-config”。内容本身将来自呈现的脚本中的这个模板文件。 如果你看一下它的来源,它来自资源"template_file" "init_script"它会读取这个"initscript" 看看“初始化脚本”。它是一个云配置脚本。它有一定的格式。您可以查看谷歌如何格式化云配置scrípts。这是很简单的。您可以说,“repo_update:true”,这将更新您的存储库。 “Repo_update:all”会将操作系统的所有包升级到最新版本。但是,无论你是使用Amazon Linux还是Ubuntu Linux,这一点都不重要。 它知道当它使用yum时,他们是使用“apt-get”的人。 你需要安装一个docker包并将输出发送到“cloud-init-output.log”。我们使用这个模板的原因是我们也可以传递变量。 为什么这个“clouddinit”配置被分成几个部分,是因为它可以有多个部分。 在这个例子中,我们使用了一个“template_cloudinit_config”,但是它有多个部分。 如果你看一下第一部分,我们有内容类型shellscript。 这将是一个shell脚本在本例中只会说"echo ‘Hello’"但它可以有一些更有用的东西。 我将在下一个演示中展示一些非常类似的东西,小格式,和音量大小。 如果您查看第二部分,它是一个upstart脚本。它是一个可以启动、停止、重启或重新加载服务的空洞脚本。 您可以使用upstart脚本,甚至可以使用systemd脚本,这是另一种类型的初始化脚本. 这些脚本只负责服务的状态,您可以启动脚本,也可以停止脚本,这个脚本负责启动一个docker容器,所以它可以执行一个docker命令来启动一个容器,然后启动一个进程。
P36 UserdataDEMO
在这个演示中,我将向你展示如何使用Userdata,我将使用“demo-10”下的文件。让我们看一下"instance。tf"。 这是我编辑的行,“user_data”来自“data”。template_cloudinit _config.cloudinit-example。“我也有一个20 qigabytes容量的EBS。 我想要实现的是,每当这个实例启动时,它需要附加这个卷,如果这个卷没有格式化,它也需要格式化它。因此,最终结果是,你可以立即使用我们的实例,如果卷上还没有数据,它就挂载为空卷,如果卷上已经有数据,它就挂载而不格式化。 “device_name”“/ dev / xvdh”,我把它放到变量var.INSTANCE_DEVICE_NAME中。 现在,我还将在我的" clouddinit "中使用这个变量。文件,因为我将把设备作为变量传递给一个shell脚本。 我也有"初始化脚本"和我在理论里给你看的一样。所以,我有一个“初始脚本”作为shellscript,然后我有两个部分,指的是渲染脚本。所以,这两个脚本,然后运行到部分。然后我们有“cloutinit-example”,它被渲染,然后在这个“user_data”属性中被引用。
那么,脚本是什么样的呢?让我从第一个开始,“init.cfg”。实际上我不用这个变量。这个变量区域实际上没有被使用,“repo_updated: true”, “repo_update:all”。 我安装了“docker.io。在Ubuntu中,这个包不叫docker,而是叫docker。如果你想安装docker,那么它只是一些其他的包。 我还想要LVM2,它是Linux卷管理器。我将使用卷管理器来创建我的设备。这是我经常做的,这是很好的练习。 让我们看看脚本“volumes.sh”。这是一个bash脚本。所以,这就是为什么我在这里有一些“text/x-shellscripts”,以“!/bin!bash”开始。LVM已安装,因此" vchange -ay",它正在刷新LVM状态,它将查看,是否已经存在LVM卷? 然后,它将查看这个“xvdh”设备,这将输出文件系统。 如果它已经有了一个文件系统,那么我们就不想执行下面这些东西,因为下面这些命令会格式化设备。 如果上面没有文件系统,我们显然会格式化它。 假设我们第一次运行它,它上面没有文件系统。 然后我们要做"pvcreate" “vgcreate data” “lvcreate"我要给它起个名字。 这些命令您可以查找它们,它们是LVM的一部分,它只是三个命令来创建Linux卷。 这类卷比默认卷更灵活,因为你可以很容易地扩展它们,或者你可以在AWS卷上编辑,然后合并它们。 所以,这是一个很好的工具也是使用这些东西的最佳实践。 因此,我们创建了这个卷组数据并创建了这个逻辑volume1,然后从现在开始,我们实际上可以使用“/dev/data/volume1”而不是“xvdh”。你要创建这个文件系统然后我们要创建一个数据目录,”-p"的意思是如果它已经存在,那就什么都不做。 将“/dev/data/volume1 /data ext4 defaults 0 0 ”这一行添加到“/etc/fstab”. 我们正准备登上它。 因此,这个脚本第一次运行时,它会查看是否没有挂载文件系统,它创建一个文件系统,然后挂载它。第二次运行时,它执行“vqchange-ay”,将看到这个“/dev/data/volume1”,然后跳过所有这些,04:41.180->04:45.210,它直接指向这个,然后这个"/dev/data/volume1 “就会存在,因为我们之前创建了这个? 如果我们有一个全新的实例,但是这个EBS卷必须被保留。然后LVM上仍然有这个文件系统。 该命令将识别它为其上的文件系统。 这个会把这个文件系统映射到”/dev/data/volume1"然后我们就可以挂载它。 然后你会看到我们的数据,即使实例可能被销毁,我们仍然会看到我们的数据。这是非常强大的。用户数据、EBS和持久性。
我将向你们展示它的作用。如果你“terraform apply”。首先你创建一个键,然后你应该能做"terraform apply" 这些都启动了。我总是忘记输入输出,所以我还是看一下这个文件,然后"ssh -i mykey ubuntu",你可以用"-l ubuntu"或者直接用"ubuntu", IP地址。 然后,让我们看看是否安装了docker。docker已经安装。现在LVM,让我们看看“/dev/data/volume1”是否存在。而且,它是挂载在"/data",它是20gb。它被格式化了,然后被挂载了。因此,我们还可以看到日志文件“cloud-init-output.log”。 看,这里你会看到,还有什么正在被执行。 因此,在这里创建了文件系统。
我们还可以使用PV显示、LV显示来查看这个LVM驱动器的属性。 因此,您可以在这里看到,我们有卷组“data”,容量为“xvdh”,容量为20gb,以及“/dev/data/volume1”。如果您要销毁实例,那么下次它将不再格式化实例,它将保留这些数据中的文件。
P37 静态ip 动态公网ip ,Route53
在这节课中,我将讨论静态ip和DNS。私有ip地址将自动辅助到EC2实例。 VPC中的每个子网都有自己的范围。例如,“10.0.1.0直到”10.0.1.255. 通过指定私有IP,可以确保EC2实例总是使用相同的IP地址。 看一下这个示例实例。 这里,我们分配了一个私有IP地址。 如果我们不分配这个私有IP,它就会得到一个主公共IP范围内的随机IP地址。 如果我们显式地指定它需要获取IP地址“10.0.1.4”,那么这个实例将始终具有相同的内部IP。
这个是在公共子网中启动的,所以它仍然会得到一个动态的公共IP。可以使用弹性IP地址(eip)。 我刚才给你们看的是我们自己范围内的私有IP地址。这些eip是公共IP地址。 这是一个可以附加到实例的公共静态IP地址. 我仍然分配了私有IP,但现在我添加了另一个资源“aws_eip”,名称为“example-eip”。然后指定需要分配给它的实例,以及它在VPC中的位置,在我们的例子中是正确的。 获得这个之后,我们的实例将拥有一个静态私有IP和一个静态公共IP.您可以单独使用它们。 您可以有一个动态私有IP和一个静态公共IP,或者反过来。 如果您保留了一个EIP而不分配给一个实例,那么我们必须为它付费,否则它是免费的。 一般来说,你只需要确保你总是把你的ElP分配给一个实例,你不需要为此付费。 你可以使用“aws_eip.example-eip.”public_ip"属性和输出资源一起显示"terraform apply"后面的ip地址。 因此,这个资源“aws_eip”有一个属性public IP,您可以在输出或其他资源中使用它。 通常情况下,您不会使用IP地址,而是使用主机名。这就是route 53发挥作用的地方。您可以使用Route 53在AWS上托管域名。 您首先需要使用AWS或任何认可的注册机构注册一个域名。 然后,您可以在Route 53中创建一个区域。例如,您可以创建一个区域“example.com”并添加DNS记录,例如“server1.example.com”。 然后"server1.example.com"可以解析为您分配给实例的一个publicIP地址。 如果您想要“ssh”您的实例。你可以使用"ssh""server1.example.com"然后你可以托管一个网站,然后你的网站也需要DNS。 在Terraform中也可以添加区域和记录。这里我们有一个资源aws_route53_zone用于example.com 然后,我们可以添加一个名称为“server1.example.com”的“aws_route53_record”,它指向“aws eip”。例子eip.public.ip”。 因此,这里我们使用公共IP属性,以确保将"server1.example.com"解析为这个公共IP。 从那时起,我们可以使用"server1.example.com", 它将指向我们的实例。 要将主机名解析为IP,需要使用类型“a”,“ttl”表示存活时间,也就是它在缓存中停留的时间。 这是它在缓存中停留的秒数。还有其他类型,比如邮件服务器的“MX”。别名是“CNAME”。还有IPV6类型,还有文本类型。 你有多种类型,但A是最常用的。
还有一个提示,当您注册您的域名时,您需要将AWS名称服务器添加到域。 你可以去另一个注册商,但一定要确保reqistrar知道你将使用Amazon。 您需要设置所调用的名称服务器。route 53有很多域名服务器,要知道特定域名的域名服务器,你可以使用"output"资源输出属性"aws_route53_zone.example-com.name_servers"。 因此,这个“aws_route53_zone.example-com.name_servers”有一个可以输出的name服务属性,这些名称是您需要用来指向您的域名以读取53的名称。
|