【问题标题】:Why might a nohup command fail in Terraform "aws_instance" user_data not run at instance launch为什么在 Terraform “aws_instance” user_data 中的 nohup 命令可能会在实例启动时失败
【发布时间】:2019-01-16 07:55:58
【问题描述】:

我正在使用 Terraform v0.11.7 和 AWS 提供商 1.30 构建一个环境,以使用基于 Debian 9.5 AMI 构建的 locust 运行负载测试。

我的模块公开了一个 num_instances 变量,用于确定所使用的 locust 命令行。下面是我的配置。

resource "aws_instance" "locust_master" {
  count                   = 1

  ami                     = "${var.instance_ami}"
  instance_type           = "${var.instance_type}"
  key_name                = "${var.instance_ssh_key}"
  subnet_id               = "${var.subnet}"
  tags                    = "${local.tags}"
  vpc_security_group_ids  = ["${local.vpc_security_group_ids}"]

  user_data = <<-EOF
              #!/bin/bash
              # Install pip on instance.
              curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
              sudo python3 get-pip.py
              rm get-pip.py
              # Install locust and pyzmq on instance.
              sudo pip3 install locustio pyzmq
              # Write locustfile to instance.
              echo "${data.local_file.locustfile.content}" > ${local.locustfile_py}
              # Write locust start script to instance.
              echo "nohup ${var.num_instances > 1 ? local.locust_master_cmd : local.locust_base_cmd} &" > ${local.start_sh}
              # Start locust.
              sh ${local.start_sh}
              EOF
}

resource "aws_instance" "locust_slave" {
  count                   = "${var.num_instances - 1}"

  ami                     = "${var.instance_ami}"
  instance_type           = "${var.instance_type}"
  key_name                = "${var.instance_ssh_key}"
  subnet_id               = "${var.subnet}"
  tags                    = "${local.tags}"
  vpc_security_group_ids  = ["${local.vpc_security_group_ids}"]

  user_data = <<-EOF
              #!/bin/bash
              set -x
              # Install pip on instance.
              curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
              sudo python3 get-pip.py
              rm get-pip.py
              # Install locust and pyzmq on instance.
              sudo pip3 install locustio pyzmq
              # Write locustfile to instance.
              echo "${data.local_file.locustfile.content}" > ${local.locustfile_py}
              # Write locust master dns name to instance.
              echo ${aws_instance.locust_master.private_dns} > ${local.locust_master_host_file}
              # Write locust start script to instance.
              echo "nohup ${local.locust_slave_cmd} &" > ${local.start_sh}
              # Start locust.
              sh ${local.start_sh}
              EOF
}

如果我在启动后通过 SSH 连接到 locust_master 实例,我会看到 /home/admin/start.sh 脚本,但它似乎没有运行,因为我没有看到 nohup.out 文件和 locust不在我的运行进程中。如果我在该主机上手动运行相同的sh /home/admin/start.sh 脚本,服务就会启动,我可以断开与主机的连接并仍然可以访问它。 locust_slave 主机上也出现了同样的问题。

什么可能导致在 aws_instance user_data 中运行 start.sh 失败?在 user_data 中执行脚本时我应该注意哪些问题?

非常感谢!

【问题讨论】:

  • /var/log/cloud-init-output.log 有什么有用的吗?

标签: terraform terraform-provider-aws


【解决方案1】:

感谢您的提示!我不知道那个日志文件,它确实指出了这一点。这是一个相对路径问题。我假设user_data 命令将以/home/admin 作为工作目录执行,所以locust 找不到locustfile.py 文件。使用locustfile.py 的绝对路径解决了这个问题。

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 2019-06-28
    • 2019-01-23
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    相关资源
    最近更新 更多