使用Terraform进行Mariadb操作
首先
最近我在使用MariaDB进行个人开发工作。
在进行MariaDB的操作时,我考虑到如果能够通过Terraform进行管理会很方便,于是我进行了一番调查,发现了下面这个mysql提供商,所以我尝试使用了它。
以随意方式建立MariaDB
这次我们使用了docker-compose来启动mariadb。
version: '3.7'
services:
db:
image: mariadb:10.5.10
restart: always
ports:
- 3306:3306
environment:
- MARIADB_ROOT_PASSWORD=root
我已经创建了docker-compose.yaml文件,可以使用以下命令启动。
$ docker-compose up -d
使Terraform可以处理Mariadb
我所使用的Terraform版本如下。
$ terraform version
Terraform v0.12.31
顺便说一下,我在尝试使用 MySQL 提供程序在版本为 1.0.0 和 1.4.0 的情况下,但没有成功。在创建 main.tf 文件后,将其表示如下。
provider "mysql" {
endpoint = "127.0.0.1:3306"
username = "root"
password = "root"
}
最后,请输入以下命令进行准备工作。
$ terraform init
创建数据库
我们将在这里创建一个名为testdb的数据库。
首先确认数据库尚未创建。
$ mysql -h 127.0.0.1 -u root -p
Enter password: root
mysql> show databases;
--------------
show databases
--------------
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
使用Terraform创建数据库。
我将在刚才创建的main.tf文件中添加以下内容。
resource "mysql_database" "testdb" {
name = "testdb"
}
执行Terraform apply并将其反映到数据库中。
$ terraform apply
terraform apply
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# mysql_database.testdb will be created
+ resource "mysql_database" "testdb" {
+ default_character_set = "utf8"
+ default_collation = "utf8_general_ci"
+ id = (known after apply)
+ name = "testdb"
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
输入一个值: 输入“是”并进行反映后,将检查数据库。
我们确认了testdb已被成功创建。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| testdb |
+--------------------+
4 rows in set (0.00 sec)
使用Terraform创建数据库用户。
我使用Terraform创建了数据库。
接下来,我将创建用户。
resource "mysql_user" "testuser" {
user = "testuser"
host = "%"
plaintext_password = "testuser"
}
我将申请并进行确认。
mysql> select user, host from mysql.user;
+-------------+-----------+
| User | Host |
+-------------+-----------+
| root | % |
| testuser | % |
| mariadb.sys | localhost |
| root | localhost |
+-------------+-----------+
$ mysql -h 127.0.0.1 -u testuser -p
Enter password: testuser
mysql>
给创建的用户授予权限
因为刚刚创建了用户,所以现在将授予创建表的权限。
顺便提一下,由于刚刚创建,所以还没有任何权限。
show grants for `testuser`@`%`;
+---------------------------------------------------------------------------------------------------------+
| Grants for testuser@% |
+---------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `testuser`@`%` IDENTIFIED BY PASSWORD '*3A2EB9C80F7239A4DE3933AE266DB76A7846BCB8' |
+---------------------------------------------------------------------------------------------------------+
我們將在 main.tf 中添加以下內容並執行 apply。
resource "mysql_grant" "testgrant" {
user = mysql_user.testuser.user
host = mysql_user.testuser.host
database = mysql_database.testdb.name
privileges = ["CREATE"]
}
当您提交申请后,我们将进行确认。对于testdb,已授予了CREATE权限,看起来没有问题。
show grants for `testuser`@`%`;
+---------------------------------------------------------------------------------------------------------+
| Grants for testuser@% |
+---------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `testuser`@`%` IDENTIFIED BY PASSWORD '*3A2EB9C80F7239A4DE3933AE266DB76A7846BCB8' |
| GRANT CREATE ON `testdb`.* TO `testuser`@`%` |
+---------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
使用Terraform修改访问权限
我刚刚使用grant进行了权限授予。接下来我将尝试在CREATE权限之外还加上DELETE权限。
resource "mysql_grant" "testgrant" {
user = mysql_user.testuser.user
host = mysql_user.testuser.host
database = mysql_database.testdb.name
privileges = ["CREATE","DELETE"]
}
我会尝试将代码更改后应用并进行修改。修改的内容如下所示。
看起来修改没有问题。
# mysql_grant.testgrant must be replaced
-/+ resource "mysql_grant" "testgrant" {
database = "testdb"
grant = false
host = "%"
~ id = "testuser@%:`testdb`" -> (known after apply)
~ privileges = [ # forces replacement
"CREATE",
+ "DELETE",
]
table = "*"
tls_option = "NONE"
user = "testuser"
}
mysql> show grants for `testuser`@`%`;
+---------------------------------------------------------------------------------------------------------+
| Grants for testuser@% |
+---------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `testuser`@`%` IDENTIFIED BY PASSWORD '*3A2EB9C80F7239A4DE3933AE266DB76A7846BCB8' |
| GRANT DELETE, CREATE ON `testdb`.* TO `testuser`@`%` |
+---------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
最后
我尝试使用Terraform操作MariaDB。似乎无法进行表的创建、数据的插入和选择等操作,仅限于初始配置和用户管理等主要功能。我不禁想象是否可以通过迁移工具等来管理表的创建呢?
通过Terraform可以管理许多基础设施资源,还可以管理Docker等其他资源,所以我很想尝试使用它。
谢谢。
填补
根据出现在Github上的情况来看,本次我们使用了MySQL的提供程序,但目前似乎没有维护并且没有发布新版本。
- https://www.terraform.io/docs/providers/mysql/index.html
请在以下中文选项中作出选择:
-
- https://github.com/hashicorp/terraform-provider-mysql
- https://www.terraform.io/docs/providers/mysql/index.html
请提供”main.tf”的完整代码。
provider "mysql" {
endpoint = "127.0.0.1:3306"
username = "root"
password = "root"
}
resource "mysql_database" "testdb" {
name = "testdb"
}
resource "mysql_user" "testuser" {
user = "testuser"
host = "%"
plaintext_password = "testuser"
}
resource "mysql_grant" "testgrant" {
user = mysql_user.testuser.user
host = mysql_user.testuser.host
database = mysql_database.testdb.name
privileges = ["CREATE","DELETE"]
}