【问题标题】:How to execute mysql script insertion on terraform user_data?如何在 terraform user_data 上执行 mysql 脚本插入?
【发布时间】:2019-09-16 11:25:33
【问题描述】:

脚本的最后一行没有执行。

我尝试在创建的实例上手动执行代码并且成功。

#!/bin/bash

#install tools
apt-get update -y
apt-get install mysql-client -y

#Create MySQL config file
echo "[mysql]" >> ~/.my.cnf
echo "user = poc5admin" >> ~/.my.cnf
echo "password = poc5password" >> ~/.my.cnf

#test
echo "endpoint = ${rds_endpoint}" >> ~/variables
hostip=$(hostname -I)
endpoint=${rds_endpoint}
echo "$hostip" >> ~/variables

#I have created a table here but I will remove the code since it is unnecessary...

#Create User
echo "CREATE USER 'poc5user'@'%' IDENTIFIED BY 'poc5pass';" >> ~/mysqlscript.sql
echo "GRANT EVENT ON * . * TO 'poc5user'@'%';" >> ~/mysqlscript.sql

cp mysqlscript.sql /home/ubuntu/mysqlscript.sql
mysql -h $endpoint -u poc5admin < ~/mysqlscript.sql

预期结果:应该在 RDS 实例上创建了数据库、表和用户。

【问题讨论】:

  • 你尝试过什么调试问题?
  • 你检查/var/log/cloud-init-output.log了吗?它应该告诉你到底发生了什么。
  • 感谢您的回复@Mohit。我尝试检查日志并发现了这一点。 ``` ERROR 1045 (28000): Access denied for user 'poc5admin'@'10.1.0.115' (using passw ord: NO) ``` 我想知道 terraform 在哪里执行命令。因为我可以在root home和ubuntu home上成功执行命令。

标签: mysql terraform terraform-provider-aws


【解决方案1】:

您可以像这样从 bash 脚本插入或创建数据库,但不推荐使用 RDS 的方法。最好将您的数据放在 s3 和 import from the s3 上。

这是创建数据库的示例

resource "aws_db_instance" "db" {
  allocated_storage    = 20
  storage_type         = "gp2"
  engine               = "mysql"
  engine_version       = "5.7"
  instance_class       = "db.t2.micro"
  name                 = "mydb"
  username             = "foo"
  password             = "foobarbaz"
  parameter_group_name = "default.mysql5.7"
  s3_import {
    source_engine         = "mysql"
    source_engine_version = "5.6"
    bucket_name           = "mybucket"
    bucket_prefix         = "backups"
    ingestion_role        = "arn:aws:iam::1234567890:role/role-xtrabackup-rds-restore"
  }
}

~/.my.cnf 为什么需要这个?最好将这些脚本放在 s3 文件中。

第二件事,如果您仍然对在本地环境中运行感兴趣,那么您可以从 local-exec 插入

resource "null_resource" "main_db_update_table" {

  provisioner "local-exec" {
    on_failure = "fail"
    interpreter = ["/bin/bash", "-c"]
    command = <<EOT
        mysql -h ${aws_rds_cluster.db.endpoint}  -u your_username -pyour_password your_db < mysql_script.sql
     EOT
  }
}

但最好使用 s3。

如果你想从远程导入,你可以探索remote-exec

使用用户数据,您可以执行此操作,但您的 MySQL 脚本似乎无法正确生成。最好将脚本 cp 到远程,然后在远程使用本地 exec 运行。

【讨论】:

    【解决方案2】:

    没有 terraform "user_data" 这样的东西。用户数据是 EC2 实例的引导脚本,您可以使用它来安装软件/二进制文件或在启动时执行脚本。

    脚本将由 cloud-init 执行,而不是由 terraform 本身执行。 terraform 的职责是为 ec2 实例设置用户数据。

    您可以查看 cloud-init 输出日志,该日志也应该包含您的用户数据脚本的结果。

    从您的代码中,我无法理解您复制了以下文件的哪个步骤。

    cp mysqlscript.sql /home/ubuntu/mysqlscript.sql
    mysql -h $endpoint -u poc5admin < ~/mysqlscript.sql
    

    我假设您正在创建一个新服务器并且它没有任何文件。

    【讨论】:

      【解决方案3】:

      感谢您的意见。我通过将配置文件移动到 /etc/mysql/my.cnf 然后执行

      找到了答案
      mysql -h $endpoint -u poc5admin < ~/mysqlscript.sql
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-14
        • 2019-01-23
        • 2021-09-06
        • 2022-01-12
        • 1970-01-01
        • 2022-09-22
        • 2020-06-12
        相关资源
        最近更新 更多