2014-11-21 67 views
11

我看到,與標準cloud-config文件不同,CoreOS cloud-config文件中沒有runcmd選項。目前,我通過添加以下到我的cloud-config使CoreOS計算機上的交換:在CoreOS雲配置中執行命令(例如添加交換)

units: 
    - name: swap.service 
     command: start 
     content: | 
     [Unit] 
     Description=Turn on swap 

     [Service] 
     Type=oneshot 
     Environment="SWAPFILE=/1GiB.swap" 
     RemainAfterExit=true 
     ExecStartPre=/usr/sbin/losetup -f ${SWAPFILE} 
     ExecStart=/usr/bin/sh -c "/sbin/swapon $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)" 
     ExecStop=/usr/bin/sh -c "/sbin/swapoff $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)" 
     ExecStopPost=/usr/bin/sh -c "/usr/sbin/losetup -d $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)" 

     [Install] 
     WantedBy=local.target 

然後初始化我CoreOS圖像後,我要SSH到機器上並運行:交換之前

sudo fallocate -l 1024m /1GiB.swap && sudo chmod 600 /1GiB.swap \ 
&& sudo chattr +C /1GiB.swap && sudo mkswap /1GiB.swap 

sudo reboot 

會被啓用(例如由top證明)。

好像我應該能夠做到在cloud-config文件本身,後者的命令,但我不是我怎麼能在cloud-config沒有runmcd場運行這些命令清楚。也許這可以通過編輯我的swap.service單元或者可能通過添加另一個unit來完成,但我還沒有弄清楚如何。因此,這給我留下了兩個問題:(1)可以這樣做,還是總是需要手動運行最後的命令? (2)如果前者如何呢?

回答

3

@cboettig - 感謝你的單元文件示例和@philibaker筆記,我這是怎麼回事 - 基本上我不得不做的唯一的事情是改變ExecStartPre至:

ExecStartPre=/bin/bash -c "\ 
    fallocate -l 2g $SWAPFILE && \ 
    chmod 600 $SWAPFILE && \ 
    chattr +C $SWAPFILE && \ 
    mkswap $SWAPFILE && \ 
    losetup -f $SWAPFILE" 

並且包括在preexec步驟中的整個設置。

7

正如在this answer to an issue on Github中指出的那樣,您最終將編寫一個單元來調用您選擇的命令。 This answer,給出了用任意命令的一個很好的例子:

#cloud-config 
.... 
coreos: 
    units: 
    - name: runcmd.service 
     command: start 
     content: | 
     [Unit] 
     Description=Creates a tmp foo file 

     [Service] 
     Type=oneshot 
     ExecStart=/bin/sh -c "touch /tmp/foo;"