【学习笔记】Terraform

# 概要
担当项目里面，使用chef进行着自动部署。
然后因为下面的问题，决定转移到别的pf上。
就顺便学习了terraform
（学了第一课就发现，因为功能上的不同，terraform并不能用来代替chef，嘛，都开始了学完吧。。）

https://www.udemy.com/course/terraform-cn/learn/lecture/20940432?start=60#overview

## 解決したい問題
社内的chef有一个很致命的问题：管理者权限付与が複雑かつ管理しにくい
- 利用者ごとで権限管理があるし、更に細かいDataBagの管理がある
- DataBagの権限付与は元Adminしかできない

实际运用上，因为组内人员变动和笔记本的更新带来的私有钥匙丢失。
最后组内只有一个人还保留着权限。

冷汗之后，请最后剩下的组员把权限给了当前组的所有人之后，
决心放弃chef，移行到别的pf上
# 正文
## Terraform和各PF（chef）的关系和作用范围
视频链接：https://www.udemy.com/course/terraform-cn/learn/lecture/20925020#overview
看到这里有点小失落，原本是希望terraform可以一站式地把部署也一块做了的。
想要完美替代chef，需要terraform+ansible或者单纯用ansible的样子了。
![スクリーンショット 2021-02-14 13.19.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260826/42b63c22-3d23-cf4c-3618-b15400c8d584.png)
![スクリーンショット 2021-02-14 13.19.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260826/31cf0b76-e051-af63-def9-a06b947bbef5.png)

## 2-6 配置开发环境
### 概要
- 这里用vagrant来部署terraform, aws等课程上用的东西
- vagrant背后用visualbox来开启虚拟机

### 代码
```
# 先来到Vagrantfile所在文件夹
❯ pwd
/Users/syao/git/terraform_devops_env

# 开启terraform
vagrant up

# 登陆到开发环境
vagrant ssh

# 关掉虚拟机(不会删掉，想删用destroy)
vagrant halt
```

## 2-7 SFTP
### 概要
这里解释了怎么用vscode的SFTP插件来实现本地Mac的编辑内容实时反映到Docker的Container里面。
这其实有很多的应用场景，譬如在本地IDE编辑一个文件，实时反映到我的服务器上。
很久没有做インフラの相关配置了，这不失为一个很好的工具。
### 做密匙
如果还没的话，`ssh-keygen`来生成密匙,把公有钥匙放到container的.ssh下面

```
# 本地Mac
❯ ll
total 24
8 -rw-------  1 syao  staff  2622  2 14 16:05 id_rsa
8 -rw-r--r--  1 syao  staff   582  2 14 16:05 id_rsa.pub
8 -rw-r--r--  1 syao  staff  1117  2 14 16:16 known_hosts

# authorized_keys就是本地过去的id_rsa.pub
$ vagrant ssh 
$ ll .ssh
vagrant@devops-box:~$ ll .ssh
total 16
-rw------- 1 vagrant vagrant  971 Feb 14 07:14 authorized_keys
-rw-r--r-- 1 vagrant vagrant  222 Feb 14 07:15 known_hosts
```

### 配置SFTP
SFTP的说明都在EXTENSION里面可以看
1. 打开VSCODE
2. CMD+SHIFT+P 打开RUN界面
3. 输入SFTP： Config

```
{
    "name": "My Server",
    "context": "sftp_test",
    "host": "devops-box",
    "protocol": "sftp",
    "port": 22,
    "username": "vagrant",
    "remotePath": "/home/vagrant/terraform_study",
    "uploadOnSave": true,
    "privateKeyPath": "~/.ssh/id_rsa"
}
```

### 手动发送（一般不需要）
1. 打开VSCODE
2. CMD+SHIFT+P 打开RUN界面
3. 输入SFTP： Syn Local->Remote

## 2-9
复习一下2-8里vagrant做的事情，他装了一个OS然后装了一个terraform。
现在我们要在这个terrafrom上面搞事情了

### 重新设置SFTP
1. 打开VSCODE
2. CMD+SHIFT+P 打开RUN界面
3. 输入SFTP： Config 
config文件只改一行
```
"context": "terraform_test"
```

### 登陆虚拟机check
如下tf文件都被发过来了的话OK

```
$ vagrant ssh
vagrant@devops-box> cd terraform_study
vagrant@devops-box> ll
total 16
drwxrwxr-x 2 vagrant vagrant 4096 May  7 08:06 ./
drwxr-xr-x 6 vagrant vagrant 4096 Feb 14 07:27 ../
-rw-rw-r-- 1 vagrant vagrant  224 May  7 08:05 instance.tf
-rw-rw-r-- 1 vagrant vagrant   46 May  7 08:06 versions.tf
```

### 开始Terraform
下面的代码执行之前
1. 先更新`instance.tf`里面的AWS密匙
2. AMI（amazon machine image）设定（跑到AWS上自己新建一个看看就知道）
3. 新建
4. AWS确认。发现的确有个新建的instance在跑
5. 删除（不然会被收钱的）
6. AWS确认。发现新建的instance被删除了Terminated， OK

```
#新建代码
## 初始化。下载provider的包啊之类
vagrant@devops-box> terraform init

## 执行plan。有点类似dry-run，这时候如果密匙没有更新的话出error
vagrant@devops-box> terraform plan

## 应用
vagrant@devops-box> terraform apply

#删除代码
vagrant@devops-box> terraform destroy
```

## 2-10 使用变量
- tf文件可以拆分，然后通过变量的方式来被读取
- .tfvars 秘密情報可以放到这个文件里来防止被上传到GIT

## 2-15 state和backend
- terraform的状态文件会自动生成到文件terraform.tfstate
- 为了保证协同开发的顺利进行，我们可以将tfstate文件放到backend上去
- 这里的backend不用理解的很复杂，单纯看成是一个放状态文件的数据库即可

## 2-22 data source
- 动态变量.根据设定计算出特定的值，然后输出json给terrafrom其他的程序来读取

## 3-34
- 服务器压力测试工具： stress
- CloudWatch: AWS的监控工具

## 3-36
- Packer
    - 定制Machine Image.好处是事先download和install一些软件，节约时间
    - Packer的位置（本页面最上面），在Terraform的上游

## 4-39
- Terraform Cloud。在VCS上的修改会自动反映到环境
    - Github的UI，做着CICD的事。

# 感想
1. Terraform在功能上和AWS的CloudFormation一样。用哪个仁者见仁。这里有个比较可以参考：https://qiita.com/answer_d/items/74c3d317058d48394d21 （补充一点，因为Terraform是有GUI的，所以GUI不算是Terraform的缺点）
1. 现状Y使用私有云而且自成一派，所以Terrafrom的支持上和使用上比较局限。provider选择Kubernetus的话，自动架构（注意：架构）部署应该是Y社内目前的最大应用场景