Я использую LXC в качестве лабораторной платформы для тестирования скриптов SaltStack. Лаборатория состоит из +5 контейнеров Ubuntu 12.04 LTS, которые я создаю путем клонирования контейнера шаблона с помощью salt-minion
предустановлен.
После создания контейнера шаблона и установки salt-minion
, шаблон получает свою соль minion_id
на основе hostname
(test-template
). Если я lxc-clone
этого шаблона, все клоны будут иметь minion_id
, но я бы хотел, чтобы клоны имели minion_id
соответствие их hostname
(test-machine-{1,2,3,4,5}
).
Есть ли способ сделать это с помощью сценария bash
или я должен пойти другим путем, чтобы добиться того же эффекта?
ОБНОВИТЬ:
Я заглянул в некоторые из lxc
скрипты и выяснил, что lxc
скрипты используют /usr/share/lxc/lxc.functions
файл, который определяет get_default_lxcpath
функция, поэтому мой текущий сценарий выглядит примерно так:
. /usr/share/lxc/lxc.functions
# clone template
lxc-clone -o $template -n "$container"
# create saltstack minion config dir if does not exist
minion_id_path="$(get_default_lxcpath)/$container/rootfs/etc/salt"
mkdir -p "$minion_id_path"
# set minion-id directly from container name
echo "$container" > "$minion_id_path/minion_id"
Мне не нравится это решение, так как оно сильно зависит от внутренних компонентов lxc и saltstack, но выполняет свою работу.
ОБНОВЛЕНИЕ 2:
После предложения в комментариях о том, как salt-minion
создаст новые minion_id
когда существующий удален, я сократил это до двух команд:
. /usr/share/lxc/lxc.functions
# clone template
lxc-clone -o $template -n "$container"
# delete minion_id to allow salt-minion to generate a new one
rm "$(get_default_lxcpath)/$container/rootfs/etc/salt/minion_id"
Я по-прежнему хотел бы видеть более общий / надежный подход, не зависящий от внутреннего устройства SaltStack и LXC.
Использовать docker
с dockerfile
. Вы можете легко найти в Интернете примеры для обоих salt-minion
и salt-master
.
Возьмите файлы и приступайте к созданию изображений (это всегда хорошая идея пометить их). Учитывая такую структуру каталогов (внимательно следуя приведенным выше примерам):
docker/
├── salt-master
│ ├── Dockerfile
│ └── supervisor-salt.conf
└── salt-minion
├── Dockerfile
└── supervisor-salt.conf
тебе надо cd docker/salt-master
и выдаем:
# docker build -t kstaken/ubuntu-salt-master .
эквивалент для salt-minion
:
# cd docker/salt-minion
# docker build -t kstaken/ubuntu-salt-minion .
Этот процесс создает повторно используемые изображения:
# docker images | grep kstaken
kstaken/ubuntu-salt-minion latest 557c052f5b14 19 seconds ago 253.5 MB
kstaken/ubuntu-salt-master latest 1f41866d05e1 5 minutes ago 262.7 MB
которые вы можете начать на переднем плане (и прикрепить к ним) или в фоновом режиме по мере необходимости. Вы также можете ссылка на сайт их:
# docker run --detach=true --hostname=salt-master --networking=true kstaken/ubuntu-salt-maste
# docker run --detach=true --hostname=minion1 --networking=true --link bersek_morse:linked-server kstaken/ubuntu-salt-minion
# docker run --detach=true --hostname=minion2 --networking=true --link berserk_morse:linked-server kstaken/ubuntu-salt-minion
Результат очень легко реализовать в сценариях:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4fae47241a73 kstaken/ubuntu-salt-minion:latest /usr/bin/supervisord 4 seconds ago Up 2 seconds goofy_fermi
6030e7f882ba kstaken/ubuntu-salt-minion:latest /usr/bin/supervisord 25 seconds ago Up 23 seconds desperate_hawking
22b18a387e21 kstaken/ubuntu-salt-master:latest /usr/bin/supervisord 3 minutes ago Up 3 minutes 4505/tcp, 4506/tcp berserk_morse,desperate_hawking/linked-server,goofy_fermi/linked-server