如何在terraform user_data上执行mysql脚本插入?

时间:2019-09-13 05:24:18

标签: mysql terraform terraform-provider-aws

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

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

#!/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实例上应该创建了一个数据库,表和用户。

3 个答案:

答案 0 :(得分:0)

没有诸如地形“ user_data”之类的东西。用户数据是EC2实例的引导脚本,可用于在启动时安装软件/二进制文件或执行脚本。

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

您可以检查cloud-init输出日志,这些日志也应具有用户数据脚本的结果。

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

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

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

答案 1 :(得分:0)

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

enter image description here

这里是示例,它将创建数据库

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 :(得分:0)

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

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