cloud-config 文件未載入,單元未在從 AMI 創建的機器上啟動
我們正在編寫使用 terraform(在 AWS 上)執行以下操作的程式碼:
- 使用我們提供的 cloud-config yaml 文件創建一個 core-os 實例 (1)
- 從該實例創建 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 文件傳遞給您要創建的每個框,單元將啟動。這使您的基礎架構比您必須對內容進行快照更不可變。