Amazon-Web-Services

cloud-config 文件未載入,單元未在從 AMI 創建的機器上啟動

  • June 2, 2016

我們正在編寫使用 terraform(在 AWS 上)執行以下操作的程式碼:

  1. 使用我們提供的 cloud-config yaml 文件創建一個 core-os 實例 (1)
  2. 從該實例創建 AMI

到目前為止,該過程執行良好。

當我們通過 AWS 控制台從該 AMI 啟動實例 (2) 時。新啟動的實例不使用 cloud-config 文件。

它 (2) 具有通過 cloud-config yaml 文件在實例 (1) 中創建的服務/系統單元。但是這些服務已經死了。如果我們明確地使用它們啟動它們,它們工作得很好systemctl

我們如何確保從該 AMI 創建的任何實例都應該在啟動時啟動這些服務/系統單元,或者應該載入該雲配置文件?

(我們也將 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) 使用腳本作為使用者數據,然後通過 cloud-init 命令執行 cloud-config。

相反,我必須將我的雲配置複製到 /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。

參考:連結

您不需要製作自己的 CoreOS AMI,只需使用官方的 CoreOS AMI。將相同的 cloud-config 文件傳遞給您要創建的每個框,單元將啟動。這使您的基礎架構比您必須對內容進行快照更不可變。

引用自:https://serverfault.com/questions/780203