使用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"]
}
广告
将在 10 秒后关闭
bannerAds