如何从S3等远程源加载cloud-config?

时间:2016-11-10 14:37:05

标签: amazon-web-services amazon-s3 coreos cloud-init

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

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

我试图在S3上引用配置的压缩cloud-config:

#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添加了一个drop-in,所以我需要重新启动它。问题是脚本永远不会重启docker。运行ExecStart=/usr/bin/systemctl daemon-reload似乎会破坏整个事情并重新启动它并且systemd会陷入循环中。

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

1 个答案:

答案 0 :(得分:0)

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

点火可以获取远程配置:

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

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