【问题标题】:execute commands in a CoreOS cloud-config (e.g. to add swap)在 CoreOS 云配置中执行命令(例如添加交换)
【发布时间】:2015-01-20 05:43:38
【问题描述】:

我发现与标准的cloud-config 文件不同,CoreOS 的cloud-config 文件中没有runcmd 选项。目前,我通过将以下内容添加到我的cloud-config 来启用 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) 如果是前者,那又如何?

【问题讨论】:

    标签: digital-ocean systemd coreos swapfile


    【解决方案1】:

    @cboettig - 多亏了你的单元文件示例和 @philibaker 注释,我才得以实现 - 基本上我唯一需要做的就是将 ExecStartPre 更改为:

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

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

    【讨论】:

      【解决方案2】:

      正如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;"
      

      【讨论】:

        猜你喜欢
        • 2014-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-26
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 2020-05-18
        相关资源
        最近更新 更多