Установка управления цепочкой инструментов Rust с помощью cloud-init на виртуальной машине Linux Azure VM


Мотивация

Для одного из моих текущих проектов я выполняю удаленную разработку по SSH из Visual Studio Code на Windows в Linux Azure VM.

Структура сборки и требования к производительности не позволяют мне использовать локальные WSL или GitHub Codespaces.

Чтобы получить воспроизводимую среду для такого случая, я обычно обращаюсь к поддержке облачной установки виртуальных машин в Azure — использование визуализации ВМ или других инструментов, таких как Ansible, все еще было бы слишком сложным для этого простого требования.

Однако при установке rustup / управлении Rust Toolchain в ходе автоматизированного процесса, такого как Docker или как в моем случае с cloud-init, эта установка обычно выполняется в контексте root, и целевой пользователь может не иметь доступа или возможности использовать rustup.

Понимая, что это крайний случай, который, возможно, не может быть использован вами напрямую, я все же хотел поделиться некоторыми аспектами, которые не так просто найти — ни для многопользовательской установки rustup, ни для обработки контекста пользователя в cloud-init.

Поскольку cloud-init используется в основном для поднятия простых серверных систем в облако, многопользовательские соображения, конечно, не так актуальны.

cloud-init.txt

Этот cloud-init.txt предназначен для виртуальной машины на базе Ubuntu 22.04. Он устанавливает инструментарий rustup, а затем делает его доступным для целевого пользователя, которого я позже использую для SSH в системе:

#cloud-config
package_upgrade: true
packages:
- apt-transport-https
- build-essential
- cmake
runcmd:
- export USER=$(awk -v uid=1000 -F":" '{ if($3==uid){print $1} }' /etc/passwd)
- export RUSTUP_HOME=/opt/rust
- export CARGO_HOME=/opt/rust
- curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y --no-modify-path --default-toolchain stable --profile default
- echo 'nn# added by cloud initnsource /opt/rust/env' >> /home/$USER/.profile
- sudo -H -u $USER bash -c 'source /opt/rust/env && rustup default stable'
Войти в полноэкранный режим Выход из полноэкранного режима

Давайте разберем основные части:

определение пользователя администрирования ВМ во время cloud-init

Имя пользователя, которое ставится на ВМ Azure, контролируется конфигурацией, подобной этой, например, в Bicep

    osProfile: {
      computerName: computerName
      adminUsername: adminUsername
      adminPassword: adminPasswordOrKey
      customData: base64(customData)
      linuxConfiguration: ((authenticationType == 'password') ? json('null') : linuxConfiguration)
    }
Войти в полноэкранный режим Выйти из полноэкранного режима

но оно недоступно во время инициализации облака. Поэтому с помощью этой строки ниже имя пользователя этого пользователя будет получено и помещено в переменную окружения для последующего использования:

- export USER=$(awk -v uid=1000 -F":" '{ if($3==uid){print $1} }' /etc/passwd)
Войти в полноэкранный режим Выйти из полноэкранного режима

предполагается, что первый пользователь, созданный на виртуальной машине Azure, получит uid 1000

Установить инструментарий rustup

С помощью этих утверждений инструментарий устанавливается в папку, к которой пользователь сможет получить доступ позже:

- export RUSTUP_HOME=/opt/rust
- export CARGO_HOME=/opt/rust
- curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y --no-modify-path --default-toolchain stable --profile default
Войти в полноэкранный режим Выйти из полноэкранного режима

--default-toolchain stable --profile default — хотя это не требуется непосредственно при установке пользователем root, это помогает контролировать неуправляемую установку и избежать предупреждений

добавить цепочку инструментов в PATH для целевого пользователя

Чтобы поместить toolchain в PATH, расширяется .profile пользователя:

- echo 'nn# added by cloud initnsource /opt/rust/env' >> /home/$USER/.profile
Войти в полноэкранный режим Выход из полноэкранного режима

$USER определяется выше

установка инструментария для целевого пользователя

Раздел выше сделает toolchain доступным для пользователя в целом, эта строка устанавливает профиль по умолчанию для пользователя:

- sudo -H -u $USER bash -c 'source /opt/rust/env && rustup default stable'
Войти в полноэкранный режим Выйти из полноэкранного режима

Но подождите, есть еще кое-что…

  • как автоматически добавить в виртуальную машину последний выпуск docker-buildx для многоплатформенных сборок
#cloud-config
package_upgrade: true
packages:
- apt-transport-https
- jq
- build-essential
- cmake
- libssl-dev
- openssl
- unzip
- pkg-config
runcmd:
- export USER=$(awk -v uid=1000 -F":" '{ if($3==uid){print $1} }' /etc/passwd)

- export RUSTUP_HOME=/opt/rust
- export CARGO_HOME=/opt/rust
- curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y --no-modify-path --default-toolchain stable --profile default
- echo 'nn# added by cloud initnsource /opt/rust/env' >> /home/$USER/.profile
- sudo -H -u $USER bash -c 'source /opt/rust/env && rustup default stable'

- curl -fsSL https://get.docker.com -o get-docker.sh
- sudo sh get-docker.sh
- sudo usermod -aG docker $USER
- wget -q -O /usr/libexec/docker/cli-plugins/docker-buildx $(curl -s https://api.github.com/repos/docker/buildx/releases/latest | jq -r ".assets[] | select(.name | test("linux-amd64")) | .browser_download_url")
- chmod u+x /usr/libexec/docker/cli-plugins/docker-buildx

- curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
Вход в полноэкранный режим Выйти из полноэкранного режима

Пожалуйста, дайте мне знать, имеет ли смысл постить в сообщество такие самородки, как этот.

Оцените статью
devanswers.ru
Добавить комментарий