我尝试用Ansible从さくらのクラウド上进行基础架构编排
如果你对昨天的”SprintBoot”感到疲倦,那么尝试一下”jooby”如何?因此,今天的标题就改变了色彩。
顺便说一下,我也在大约一年半前接触过一点点jooby。
我记得它很轻量且运行速度很快。
那么,现在我们来说正题。
尝试使用Ansible从さくらのクラウド运行Terraform。
因为我们使用了Sakura Cloud,所以这些说明将从Sakura Knowledge中引用。
Terraform 是什么?
Terraform是一种用于通过代码构建、修改和管理基础架构及其版本的命令行工具。这里的基础架构包括计算资源、存储、网络等基本部分,以及负载均衡器、DNS、数据库、CDN等应用程序等,这些构成了系统的基础。Hashicorp公司主导着开发工作,他们还开发了Vagrant、Packer和Consul等产品,并将其作为开源项目在GitHub上进行推进。
Ansible是一种工具
最近,诸如Chef和Puppet这样的配置管理工具很受欢迎,但是一种新的备受关注的配置管理工具是”Ansible”。Ansible的配置文件简洁,并且可以在不安装特殊软件的情况下使用,具有最小化的工作量,可以实现各种设置的自动化。本次将介绍关于Ansible的基本用法。
顺便问一下,樱花云是什么?
樱花云是一种高性能且价格低廉的基于IaaS云服务,提供以每小时为单位的多种服务,包括服务器和存储等。[链接]https://cloud.sakura.ad.jp/
周围也有很多人照顾我。。。
我会尝试做这件事
因为从Ansible2.5开始,Terraform的管理命令也被默认添加了,所以我决定在这个机会下尝试在Sakura Cloud上使用它。
我先说一下,如果一开始就使用Ansible来搭建服务器,那就会陷入“先有鸡还是先有蛋”的境地,所以我认为在生产环境中使用它需要仔细考虑。
前提 tí) – prerequisite/condition
-
- さくらのクラウドのアカウント、APIキーが必要
-
- CentOS7にて環境構築
- 若干のサーバ費用発生
安装Ansible
由于我们将从EPEL存储库导入,所以需要使用以下命令:
sudo yum install epel-release
sudo yum install ansible
创建Ansible的Playbook
我按照以下目录结构进行了准备。
Terraform的安装也将通过Ansible进行。
※以下内容已在GitHub上公开。
.
├── ansible.cfg
├── inventories
│ └── local
│ └── hosts
├── local_private_key
├── roles
│ └── terraform
│ ├── files
│ │ └── sakura.tf
│ └── tasks
│ └── main.yml
└── site.yml
任务的构成如下所示。
- name: mkdir exec dir
file:
path: /var/tmp/test
state: directory
- name: download and unzip terraform
unarchive:
src: https://releases.hashicorp.com/terraform/0.11.10/terraform_0.11.10_linux_amd64.zip
dest: /var/tmp/test
remote_src: yes
- name: download and unzip terraform-provider-sakuracloud
unarchive:
src: https://github.com/sacloud/terraform-provider-sakuracloud/releases/download/v1.8.0/terraform-provider-sakuracloud_1.8.0_linux-amd64.zip
dest: /var/tmp/test
remote_src: yes
- name: copy tf file
copy:
src: sakura.tf
dest: /var/tmp/test
backup: yes
- name: terraform apply
terraform:
project_path: /var/tmp/test
state: present
binary_path: /var/tmp/test/terraform
force_init: yes
register: result
- name: debug
debug:
msg: "{{ result.stdout }}"
掘一个工作目录,然后下载Terraform的二进制文件和适用于Sakura Cloud的插件,并将TF文件放在相同的目录中进行执行,这是非常粗糙的。在使用Ansible时,考虑到重要因素幂等性,并不会在临时目录中创建各种文件等,不过这次只是试一试……
创建Terraform的TF文件
# genareate ssh key
resource sakuracloud_ssh_key_gen "key" {
name = "foobar"
provisioner "local-exec" {
command = "echo \"${self.private_key}\" > id_rsa; chmod 0600 id_rsa"
}
provisioner "local-exec" {
when = "destroy"
command = "rm -f id_rsa"
}
}
# target zone
provider sakuracloud {
token = "****"
secret = "****"
zone = "is1b" # tk1v=Sandbox
}
# archive data
data sakuracloud_archive "centos" {
filter = {
name = "Tags"
values = ["current-stable", "arch-64bit", "distro-centos"]
}
}
# disk config
resource "sakuracloud_disk" "disk" {
name = "disk01"
source_archive_id = "${data.sakuracloud_archive.centos.id}"
password = "PUT_YOUR_PASSWORD_HERE"
ssh_key_ids = ["${sakuracloud_ssh_key_gen.key.id}"]
disable_pw_auth = true
}
# server config
resource "sakuracloud_server" "server" {
name = "server01"
disks = ["${sakuracloud_disk.disk.id}"]
nic = "shared"
tags = ["@group-b", "@boot-cdrom", "@keyboard-us"]
# provisioning connection
connection {
user = "root"
host = "${self.ipaddress}"
private_key = "${sakuracloud_ssh_key_gen.key.private_key}"
}
provisioner "remote-exec" {
inline = [
"hostname",
] # provision command
}
}
# show ip address
output "ip_addr" {
value = "${sakuracloud_server.server.ipaddress}"
}
创建密钥信息,并通过指定北海道第2地区的API密钥,从最新的CentOS存档安装操作系统。
在本地创建的密钥信息通过磁盘修复功能导入,并执行类似于配置的命令。
最后创建的服务器直接连接到共享全局段,因此输出了全局IP。
通过这样的操作,从生成服务器到SSH连接环境都会完成,不需要使用Sakura Cloud控制台。
请注意,上述为可以使用root进行SSH的简易配置,并非用于生产环境,敬请知悉。。。
我实际尝试过
执行剧本
使用Ansible的Playbook,在本地的清单文件中运行site.yml。
PLAY [web] ******************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************
ok: [localhost]
TASK [terraform : mkdir exec dir] *******************************************************************************************
changed: [localhost]
TASK [terraform : download and unzip terraform] *****************************************************************************
changed: [localhost]
TASK [terraform : download and unzip terraform-provider-sakuracloud] ********************************************************
changed: [localhost]
TASK [terraform : copy tf file] *********************************************************************************************
changed: [localhost]
TASK [terraform : terraform apply] ******************************************************************************************
changed: [localhost]
TASK [terraform : show result] **********************************************************************************************
ok: [localhost] => {
"result.stdout_lines": [
"sakuracloud_ssh_key_gen.key: Creating...",
" fingerprint: \"\" => \"<computed>\"",
" name: \"\" => \"foobar\"",
" private_key: \"\" => \"<computed>\"",
" public_key: \"\" => \"<computed>\"",
~~~~省略~~~~~
"sakuracloud_server.server (remote-exec): Connected!",
"sakuracloud_server.server (remote-exec): localhost.localdomain",
"sakuracloud_server.server: Creation complete after 37s (ID: 113001601565)",
"",
"Apply complete! Resources: 3 added, 0 changed, 0 destroyed.",
"",
"Outputs:",
"",
"ip_addr = 153.127.196.37"
]
}
在最后,日志中显示了通过远程命令发出的结果(类似于提供程序)以及IP地址。
“sakuracloud_server.server(远程执行):localhost.localdomain”,
“ip 地址 = 153.127.196.37”
请在樱花云控制台进行确认
服务器工作目录
[vagrant@localhost qiita-2018]$ ls -l /var/tmp/test/
total 106736
-rw------- 1 root root 1676 Dec 4 15:58 id_rsa
-rw-r--r-- 1 root root 1469 Dec 4 15:58 sakura.tf
-rwxrwxr-x 1 root root 89397536 Oct 24 00:00 terraform
-rwxr-xr-x 1 root root 19877376 Oct 30 14:00 terraform-provider-sakuracloud_v1.8.0_x4
-rw-r--r-- 1 root root 9449 Dec 4 16:00 terraform.tfstate
在任务中创建了一个名为terraform.tfstate的文件。这个文件是一个非常重要的文件,它保存着Terraform认可的云平台的状态,并且在使用Terraform时,如何管理这个文件是关键。
由于我没有进行实际操作,所以这次不会讨论太多,但根据官方文档,不推荐使用Git进行管理。
如果是使用SakuraCloud,则最好使用对象存储;如果是使用AWS,则最好使用S3进行管理。
-> 其实我本想尝试使用对象存储进行管理,但在SakuraCloud上,它说我现在不能创建新的小包(故障?),所以我放弃了这个想法。。。
所感 – (the feeling)
通过使用Ansible,我感觉相对于直接使用Terraform,难度增加了一些。但是仍然认为通过代码化进行管理有一些优势。
然而,就像我之前提到的那样,如果尝试使用Ansible来进行进一步的服务器配置,感觉好像是鸡生蛋的问题,我并不清楚最佳的解决方法。
请用中文进行本地化的释义,只需要一个选项:
原始参考来源
HashiCorp 的 Terraform
适用于 Sakura Cloud 的 Terraform
terraform – 管理 Terraform 部署(以及计划)- Ansible 文档
示例代码
最后
请注意不要忘记删除已创建的服务器。
那么,那么。