Вопрос или проблема
Я хочу развернуть виртуальную машину на linux с помощью cloud init. Я хотел бы подготовить домашнюю директорию пользователя так, чтобы изначально был доступен набор инструментов. В идеале, .profile
будет содержать расширения для переменной среды PATH, а также некоторые удобные bash-алиасы в .bash_aliases
.
Пока что я попытался запустить этот user-data
скрипт для cloud-init
#cloud-config
users:
- default
- name: user
groups: adm, audio, cdrom, dialout, floppy, video, plugdev, dip, libvirtd, sudo
# пароль 'user'.
# генерировать пароль с помощью `openssl passwd -6 -salt your_unique_salt`
# --------------------------------
# НЕ ИСПОЛЬЗУЙТЕ В ПРОИЗВОДСТВЕННЫХ СИСТЕМАХ
# --------------------------------
passwd: $6$your_unique_salt$cI00puVwNOLtx8.mV2A8ye/cS9WxpFpC78U7A8NP5Z/ih8/i00dmGD0HlO4ni21iojOhzIm0Lcot/vxyx0wSk0
lock_passwd: false
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
hostname: tools-dev
manage_etc_hosts: localhost
ssh_pwauth: true
package_upgrade: true
package_update: true
packages:
- curl
write_files:
- path: /home/user/.profile
permissions: '0755'
defer: true
append: true
content: |
export PATH=$HOME/.local/sometool/bin:$PATH
- path: /home/user/.bash_aliases
permissions: '0755'
defer: true
content: |
alias ll="ls -al"
- path: /etc/network/interfaces.d/additional.link
permissions: '0644'
content: |
auto ens3
iface ens3 inet dhcp
hostname cynthion-dev
.bash_alias
был записан, но пустой. .profile
не содержит никаких изменений. Я прошел несколько итераций с установкой явного owner
на созданного user
, но тоже без успеха.
Какие у меня есть варианты для изменения файлов в домашней директории пользователя?
Я смог получить желаемые результаты, используя этот конкретный cloud-config.
Одной из возможных причин является отсутствие ожидания завершения cloud-init. Модуль write_files_deferred
запускается довольно поздно при начальной загрузке, после обновления и апгрейда пакетов, так что вам может потребоваться подождать несколько секунд/минут после подключения к вашему экземпляру, чтобы увидеть изменения. Вы можете запустить cloud-init status --wait
и убедиться, что он завершил выполнение, прежде чем проверять содержимое этих файлов.
Другой причиной может быть использование версии cloud-init, которая еще не поддерживает defer
. Более старые ОС, которые не обновили cloud-init, еще не будут поддерживать defer
. Запуск cloud-init schema --system
покажет, используете ли вы неправильный cloud-config, а cloud-init --version
может сказать, какая версия у вас установлена. https://docs.cloud-init.io/ поддерживает показ документации в зависимости от версии.
.
Ответ или решение
Cloud-init — это мощный инструмент для автоматизации инициализации облачных виртуальных машин. Он позволяет выполнять различные задачи конфигурации с помощью набора инструкций, описанных в формате YAML. Если вы хотите настроить домашнюю директорию пользователя таким образом, чтобы обеспечить наличие определенного набора инструментов и изменить файлы .profile и .bash_aliases, у нас есть несколько рекомендаций и примеров для обеспечения успешной конфигурации.
Теория (Theory)
Основное преимущество cloud-init заключается в том, что он может выполняться в цепочке различных этапов инициализации системы. Это дает возможность управлять последовательностью действий и оставить более сложные задачи конфигурации на более поздние этапы, когда все необходимые пакеты установлены и система готова к приему изменений.
В данном случае, важный элемент конфигурации — это модуль write_files
, который управляет записью файлов на виртуальную машину. Версия cloud-init также играет важную роль, поскольку не все функции доступны в более старых версиях. Например, параметр defer
, поддерживаемый более поздними версиями, обеспечивающий выполнение определенных задач в конце инициализации, может быть недоступен или работать некорректно на устаревших версиях.
Пример (Example)
Ваша конфигурация cloud-init, состоящая из YAML файла с параметрами, выглядит достаточно полным; однако, есть несколько моментов, на которые стоит обратить внимание:
-
Параметр
defer
: убедитесь, что версия cloud-init, установленная на вашей системе, поддерживает этот параметр. Эти изменения изwrite_files
модуля могут не применяться, если defer работает неправильно или не поддерживается. -
Контроль выполнения cloud-init: Используйте команду
cloud-init status --wait
, чтобы убедиться, что все этапы инициализации действительно завершены. Многие пользователи могут столкнуться с проблемами из-за преждевременной проверки состояния системы до завершения работы cloud-init. -
Проверка версии и конфигурации: Используйте
cloud-init --version
для проверки версии иcloud-init schema --system
для проверки на наличие синтаксических ошибок. Это помогает исключить потенциальные несоответствия в структуре конфигурации.
#cloud-config
users:
- default
- name: user
groups: adm, audio, cdrom, dialout, floppy, video, plugdev, dip, libvirtd, sudo
passwd: $6$your_unique_salt$cI00puVwNOLtx8.mV2A8ye/cS9WxpFpC78U7A8NP5Z/ih8/i00dmGD0HlO4ni21iojOhzIm0Lcot/vxyx0wSk0
lock_passwd: false
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
hostname: tools-dev
manage_etc_hosts: localhost
ssh_pwauth: true
package_upgrade: true
package_update: true
packages:
- curl
write_files:
- path: /home/user/.profile
permissions: '0755'
defer: true
append: true
content: |
export PATH=$HOME/.local/sometool/bin:$PATH
- path: /home/user/.bash_aliases
permissions: '0755'
defer: true
content: |
alias ll="ls -al"
- path: /etc/network/interfaces.d/additional.link
permissions: '0644'
content: |
auto ens3
iface ens3 inet dhcp
hostname cynthion-dev
Применение (Application)
При использовании cloud-init для модификации домашних директорий пользователей, убедитесь, что все предпосылки выполнены. Проверьте поддержку используемых вами параметров в вашей версии cloud-init, особенно параметра defer
. Проанализируйте этапы конфигурации cloud-init, чтобы понять порядок выполнения скриптов.
Если какая-либо часть конфигурации не выполняется, начните с проверки журналов cloud-init, доступных в /var/log/cloud-init.log
и /var/log/cloud-init-output.log
. Это может дать вам представление о возникших ошибках или предупреждениях.
Для более гранулярного контроля над файловыми операциями, рассмотрите возможность использования скриптов в разделе runcmd:
или bootcmd:
для выполнения команд после применения всех изменений. Это модули, которые выполняются на более поздних этапах, но они требуют немного другой конфигурации и не требуют использования defer
.
Подводя итоги, следует помнить, что успешная конфигурация с использованием cloud-init требует внимания к деталям и проверок на всех этапах инициализации. Надеюсь, эти рекомендации помогут вам в успешной автоматизации инициализации ваших виртуальных машин.