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