выполнять команды в облачной конфигурации CoreOS (например, чтобы добавить своп)

Я вижу, что в отличие от стандартного файла cloud-config в файле CoreOS cloud-config нет опции runcmd. В настоящее время я включаю своп на машине с 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, но я не понимаю, как я могу запускать такие команды без поля runmcd в cloud-config. Возможно, это можно сделать, либо отредактировав мой блок swap.service, либо добавив еще один блок unit, но я не совсем понял, как это сделать.

Итак, у меня остается два вопроса: (1) Можно ли это сделать или всегда нужно будет запускать последние команды вручную? (2) Если первое, то как?


person cboettig    schedule 21.11.2014    source источник


Ответы (2)


@cboettig - благодаря вашему примеру файла модуля и заметке @philibaker, я понял это - в основном единственное, что мне нужно было сделать, это изменить ExecStartPre на:

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

и это включает в себя всю настройку на этапе preexec.

person Guss    schedule 12.12.2014

Как указано в этом ответе на вопрос на 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;"
person phillbaker    schedule 24.11.2014