利用 Terraform+用户数据+Ansible 进行服务器配置

首先

在使用云端运营系统时,通常会结合使用Terraform和Ansible(也可以使用Chef或者Puppet)。
(这里我们选择使用Ansible)。

通常情况下,以下方法被广泛用于:
1. 使用Terraform在云平台上构建基础架构
2. 使用API获取部署目标服务器的信息
3. 使用Ansible对获取的服务器进行配置和应用部署

在某种程度上,我也认为可以考虑这种使用方式。

1. 使用Terraform在云上构建基础设施。
2. 通过使用虚拟服务器的用户数据功能(※),执行Ansible进行配置管理。
※用户数据功能指的是在虚拟服务器实例启动时可以执行任意命令的功能。

在这里,我们以阿里巴巴云为例,介绍了Terraform+用户数据+Ansible的使用方法。这种思路在许多其他云计算平台上也应该适用。

咦,你不知道阿里巴巴云计算?它在2017年2月进入了东京地区。

公开源代码

首先,所有源代码都已在此处发布。

这是一个整理了阿里云上Terraform示例的项目。

https://github.com/mosuke5/terraform_for_alibabacloud_examples

这是一个与Ansible相关的基本样本。如果您想要实际执行或查看其中的内容,请随时参考。

解释

使用Terraform创建实例并启动用户数据。

以下是Terraform模板文件中创建ECS部分的内容。
阿里云ECS是一种虚拟服务器服务,类似于AWS的EC2,请注意。
重点关注用户数据部分。

resource "alicloud_instance" "web" {
  instance_name = "terraform-ecs"
  availability_zone = "${var.zone}"
  image_id = "centos_7_3_64_40G_base_20170322.vhd"
  instance_type = "ecs.n4.small"
  io_optimized = "optimized"
  system_disk_category = "cloud_efficiency"
  security_groups = ["${alicloud_security_group.sg.id}"]
  vswitch_id = "${alicloud_vswitch.vsw.id}"
  password   = "${var.ecs_password}"

  # ユーザデータ
  user_data = "${file("provisioning.sh")}"
}

用户数据功能可以执行编写的shell脚本或cloud-init。可以将预先准备好的provisining.sh执行。
为了提高可读性,建议使用${file(“xxxxx”)}来读取文件。

然而,用户数据存在数据大小的限制,如果想要执行更多的处理,可以使用#include指令来执行外部文件。(参考)

  user_data = "#include\nhttps://xxxxxxxx.com/provisioning.sh"
}

服务器配置

您可以使用用户数据功能进行服务器配置。
但是,您是否想通过Shell脚本来完成服务器配置呢?

只要是想努力的人都可以,但我对使用Shell脚本来努力没有自信。
所以,我还是希望能使用Ansible和Chef之类的工具进行自动化部署。
为了更高效地进行自动化部署,只需要在用户数据中执行以下步骤即可。

    1. Ansible的安装

 

    1. 下载Playbook(※)

 

    执行Playbook

“Playbook” 是指用于 Ansible 的文件,用于描述服务器的配置内容。

#!/bin/bash
yum install -y wget epel
yum install -y ansible
cd /root
wget https://raw.githubusercontent.com/mosuke5/terraform_for_alibabacloud_examples/add/ansible-basic-sample/basic_sample_with_ansible/playbook.yml
ansible-playbook playbook.yml

Ansible剧本

对于有过Ansible经验的人来说,没有什么特别的。如果你还没有使用过Ansible或者其他类似的部署工具,那么请务必抓住这个机会去尝试一下。

Ansible可以作为本地执行工具来使用。
通常我们通过SSH来执行,但由于Ansible是在要执行的服务器上进行配置,所以推荐使用本地执行方式,速度更快。
以下是一个简单的Playbook,只安装和启动httpd。

---
- hosts: 127.0.0.1
  connection: local
  tasks:
  - name: be sure httpd is installed
    yum: name=httpd state=installed

  - name: be sure httpd is running and enabled
    service: name=httpd state=started enabled=yes

仅需执行以下步骤,即可在启动服务器后进行httpd的安装和启动,并完成网页服务器的设置。

优点和缺点

当然,这种方法有其优点和缺点。
作为优点,它可以在服务器启动时进行配置,因此不需要额外考虑配置工作。
然而,由于配置需要时间,因此不推荐在AutoScaling中使用。
此外,这只是对启动的服务器进行配置,并不擅长与其他服务器或服务进行协作式配置。

我个人认为,将服务器中间件的安装事先制作成镜像,然后使用用户数据+Ansible来部署应用程序和服务器特定设置,会更加实践性强。

总结

通过将用户数据与Ansible相结合,可以在服务器实例启动时实现高级配置。然而,这种方法既有优点也有缺点,因此在使用和选择上需要理解其中的区别并进行适当的组合或并用。

尽管如此,我认为从用户数据中轻松运行Ansible是一个很大的优点。

Here’s a paraphrase in Chinese:

“附赠”

以前我写了关于阿里云日本区域对Terraform的支持,请也看一下这个。
“阿里云日本区域已经支持Terraform,我进行了尝试。”

bannerAds