如何在 terraform user_data 上执行 mysql 脚本插入?
How to execute mysql script insertion on terraform user_data?
脚本的最后一行没有执行。
我尝试在创建的实例上手动执行代码并且成功了。
#!/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
预期结果:应该有一个数据库,Table和在 RDS 实例上创建的用户。
没有 terraform "user_data" 这样的东西。用户数据是 EC2 实例的 bootstrap 脚本,您可以使用它来安装 software/binaries 或在启动时执行脚本。
该脚本将由 cloud-init 执行,而不是由 terraform 本身执行。 terraform 的职责是为 ec2 实例设置用户数据。
您可以检查 cloud-init 输出日志,其中也应该包含您的用户数据脚本的结果。
从你的代码中,我无法理解你是在哪一步复制了以下文件。
cp mysqlscript.sql /home/ubuntu/mysqlscript.sql
mysql -h $endpoint -u poc5admin < ~/mysqlscript.sql
我假设您正在创建一个新服务器并且它没有任何文件。
您可以从 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 脚本似乎无法正确生成。最好将脚本复制到远程,然后 运行 在远程中使用本地执行程序。
感谢您的投入。我通过将配置文件移动到 /etc/mysql/my.cnf 然后执行
找到了答案
mysql -h $endpoint -u poc5admin < ~/mysqlscript.sql
脚本的最后一行没有执行。
我尝试在创建的实例上手动执行代码并且成功了。
#!/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
预期结果:应该有一个数据库,Table和在 RDS 实例上创建的用户。
没有 terraform "user_data" 这样的东西。用户数据是 EC2 实例的 bootstrap 脚本,您可以使用它来安装 software/binaries 或在启动时执行脚本。
该脚本将由 cloud-init 执行,而不是由 terraform 本身执行。 terraform 的职责是为 ec2 实例设置用户数据。
您可以检查 cloud-init 输出日志,其中也应该包含您的用户数据脚本的结果。
从你的代码中,我无法理解你是在哪一步复制了以下文件。
cp mysqlscript.sql /home/ubuntu/mysqlscript.sql
mysql -h $endpoint -u poc5admin < ~/mysqlscript.sql
我假设您正在创建一个新服务器并且它没有任何文件。
您可以从 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 脚本似乎无法正确生成。最好将脚本复制到远程,然后 运行 在远程中使用本地执行程序。
感谢您的投入。我通过将配置文件移动到 /etc/mysql/my.cnf 然后执行
找到了答案mysql -h $endpoint -u poc5admin < ~/mysqlscript.sql