0

我在 Amazon EC2 上运行 CoreOS 服务器。我想在启动时提供服务器的用户数据太长,我的启动配置无法处理。我将如何解决这个问题?

我要走的路径是将 cloud-config yaml 文件发送到 S3,使用有权访问 S3 上的对象的 IAM-Role 启动服务器,下载、验证并安装它。然而,“安装它”部分被证明是棘手的。

我试图引用 S3 上的配置的精简云配置:

#cloud-config
coreos:
  update:
    reboot-strategy: off

  units:
    - name: extra-cloudinit.service
      command: start
      content: |
        [Unit]
        Description=Gets S3 cloud-config and runs it.

        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=-/bin/mkdir /cloud-init
        ExecStart=/bin/docker run --rm -v /cloud-init/:/data/ pebbletech/docker-aws-cli aws s3 cp s3://my-deployment/cloud-config/cloud-init-v1.yaml /data/
        ExecStart=/bin/bash -c 'cd /cloud-init/; echo "efc158573d28193f63887c911ac5b01af287d2dd  cloud-init-v1.yaml" | sha1sum -c -'
        ExecStart=/usr/bin/coreos-cloudinit --from-file=/cloud-init/cloud-init-v1.yaml
        ExecStart=/usr/bin/systemctl restart docker

我在托管在 S3 上的 cloud-config 中为 docker 添加了一个插件,因此我需要重新启动它。问题是脚本永远不会重新启动 docker。运行ExecStart=/usr/bin/systemctl daemon-reload似乎杀死了整个事情并重新启动它并且 systemd 陷入了一个循环。

我错过了什么?这似乎是一个很常见的用例?这是反模式吗?作为一种解决方法,我可以将一些东西移动到用户数据云配置中,但是我在 2 个地方有主配置,这看起来很奇怪。我只想在 S3 中将该对象引用为用户数据。

4

1 回答 1

0

查看 Ignition,它是 cloud-init 的继任者。Ignition在 systemd 启动之前运行,因此您可以避免所有这些问题。

Ignition 可以获取远程配置:

{
  "ignition": {
    "version": "2.0.0",
    "config": {
      "replace": {
        "source": "http://example.com/config.json",
        "verification": { "hash": "sha512-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" }
      }
    }
  }
}

您将其提供给用户数据,就像您将云配置一样。获取远程配置的文档:https ://coreos.com/ignition/docs/latest/examples.html#replacing-the-config-with-a-remote-config

于 2016-11-10T21:31:24.483 回答