问题 在CoreOS cloud-config中执行命令(例如添加交换)


我看到这与标准不同 cloud-config 文件,没有 runcmd CoreOS中的选项 cloud-config 文件。目前,我通过在我的网站上添加以下内容来启用CoreOS机器上的交换 cloud-config

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 文件本身,但我不知道如何在没有a的情况下运行这些命令 runmcd 在 cloud-config。也许这可以通过编辑我的方式来完成 swap.service 单位或可能通过添加另一个 unit,但我还没弄清楚怎么样。

所以,这给我留下两个问题:(1)可以这样做还是总是需要手动运行最后的命令? (2)如果是前者,那怎么样?


10903
2017-11-21 23:37


起源



答案:


@cboettig - 感谢您的单元文件示例和@philibaker说明,我明白了 - 基本上我唯一要做的就是更改 ExecStartPre 至:

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

这包括preexec步骤中的整个设置。


3
2017-12-12 16:58





正如指出的那样 这是Github上一个问题的答案,你最终写一个单位来调用你选择的命令。 这个答案,给出了使用任意命令的一个很好的例子:

#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;"

7
2017-11-24 00:24