未加载云配置文件,并且未在通过 AMI 创建的机器上启动单元

未加载云配置文件,并且未在通过 AMI 创建的机器上启动单元

我们正在开发使用 terraform(在 AWS 上)执行以下操作的代码:

  1. 使用我们提供的 cloud-config yaml 文件创建一个 core-os 实例(1)
  2. 从该实例创建 AMI

到目前为止,整个过程运行良好。

当我们通过 AWS 控制台从该 AMI 启动实例 (2) 时。新启动的实例不使用 cloud-config 文件。

它 (2) 具有通过 cloud-config yaml 文件在实例 (1) 中创建的服务/systemd 单元。但这些服务已停止运行。如果我们使用以下命令显式启动它们,它们将运行良好systemctl

我们如何确保从该 AMI 创建的任何实例都应在启动时启动这些服务/systemd 单元或应加载该云配置文件?

(我们也将 cloud-config yaml 保存在机器内部的某个位置,如果我们通过手动运行 cloud-config 文件coreos-cloudinit --from-file=path/to/file/cloud-config.yaml,一切都会正常工作。但我们希望它在启动时就能正常工作,而无需任何手动步骤)

这是我们的云配置文件

#cloud-config
coreos:
  etcd2:
    # generate a new token for each unique cluster from https://discovery.etcd.io/new?size=3
    # specify the initial size of your cluster with ?size=X
    discovery: https://discovery.etcd.io/2cb27f1fecb57e14837016e04547aa32
    # multi-region and multi-cloud deployments need to use $public_ipv4
    advertise-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
    initial-advertise-peer-urls: http://127.0.0.1:2380
    # listen on both the official ports and the legacy ports
    # legacy ports can be omitted if your application doesn't depend on them
    listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
    listen-peer-urls: http://0.0.0.0:2380,http://0.0.0.0:7001
  units:
    - name: etcd2.service
      command: start
    - name: fleet.service
      command: start
    - name: hello.service
      command: start
      content: |
        [Unit]
        Description=hello_docker
        After=docker.service
        Requires=docker.service

        [Service]
        TimeoutStartSec=0
        ExecStartPre=-/usr/bin/docker rm busybox1
        ExecStartPre=/usr/bin/docker pull busybox
        ExecStart=/usr/bin/docker run --rm --name busybox1 busybox /bin/sh -c "while true; do echo Hello Docker; sleep 1; done"
        ExecStop=/usr/bin/docker stop busybox1

答案1

您不需要为 CoreOS 设备制作自己的 AMI,只需使用官方的 CoreOS AMI。将相同的云配置文件传递给您要创建的每个设备,设备就会启动。与必须对内容进行快照相比,这使您的基础架构更加不可改变。

答案2

我遗漏的是,第一个实例 (1) 使用脚本作为用户数据,然后通过 cloud-init 命令运行云配置。

相反,我必须将我的云配置复制到 /usr/share/oem/ 中,以便 AMI 创建的实例也默认使用该云配置。

此外,以下内容可能会对面临类似问题的人有所帮助,但正如所提到的,它不会在第一次启动时启动。

您需要启用服务(确保它们具有安装部分)。

#cloud-config

coreos:
  units:
    - name: "example.service"
      enable: true
      content: |
        [Service]
        Type=oneshot
        ExecStart=/usr/bin/echo Hello World

        [Install]
        WantedBy=multi-user.target

该服务不会在第一次启动时启动(因为该单元是在 systemd 实现 multi-user.target 之后启用的),但它会在后续启动时运行。

另外,在拍摄快照时,请确保先删除 /etc/machine-id。否则,所有机器都会有相同的 ID。

参考:关联

相关内容