Как изменить файлы в домашнем каталоге пользователя через cloud-init?

Вопрос или проблема

Я хочу развернуть виртуальную машину на 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 файла с параметрами, выглядит достаточно полным; однако, есть несколько моментов, на которые стоит обратить внимание:

  1. Параметр defer: убедитесь, что версия cloud-init, установленная на вашей системе, поддерживает этот параметр. Эти изменения из write_files модуля могут не применяться, если defer работает неправильно или не поддерживается.

  2. Контроль выполнения cloud-init: Используйте команду cloud-init status --wait, чтобы убедиться, что все этапы инициализации действительно завершены. Многие пользователи могут столкнуться с проблемами из-за преждевременной проверки состояния системы до завершения работы cloud-init.

  3. Проверка версии и конфигурации: Используйте 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 требует внимания к деталям и проверок на всех этапах инициализации. Надеюсь, эти рекомендации помогут вам в успешной автоматизации инициализации ваших виртуальных машин.

Оцените материал
Добавить комментарий

Капча загружается...