Linux Azure VM에서 cloud-init를 사용하여 Rust 도구 체인 관리 설치

6280 단어 vmrustazure

동기 부여



현재 프로젝트 중 하나를 위해 Windows의 Visual Studio Code에서 Linux Azure VM으로 원격 SSH 개발을 수행합니다.

build structure and performance requirements prevent me from using local WSL or GitHub Codespaces



이러한 경우에 대해 재현 가능한 환경을 얻으려면 일반적으로 cloud-init support for virtual machines in Azure을 사용합니다. VM 이미징 또는 Ansible과 같은 다른 도구를 사용하는 것은 여전히 ​​이 간단한 요구 사항에 비해 너무 많을 것입니다.

그러나 rustup / Rust Toolchain management을 Docker와 같은 자동화 프로세스 중에 설치하거나 제 경우에는 cloud-init을 설치하는 경우 해당 설치는 일반적으로 루트 컨텍스트에서 실행되며 대상 사용자는 rustup에 액세스할 수 없거나 사용할 수 없습니다.

이것이 당신이 직접 재사용할 수 없는 엣지 케이스라는 것을 알고 있기 때문에, 나는 여전히 거기에서 찾기 쉽지 않은 몇 가지 측면을 공유하고 싶었습니다. multi-user rustup installation 또는 cloud-init 내 사용자 컨텍스트 처리 .

as cloud-init is primarily used to bring up plain server systems in the cloud, multi user considerations surely are not that relevant



클라우드 초기화.txt



cloud-init.txt는 Ubuntu 22.04 기반 VM에 맞게 조정되었습니다. 이것은 기본적으로 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 '\n\n# added by cloud init\nsource /opt/rust/env' >> /home/$USER/.profile
- sudo -H -u $USER bash -c 'source /opt/rust/env && rustup default stable'


필수 부분을 분석해 보겠습니다.

cloud-init 중에 VM의 관리 사용자를 결정합니다.

The user name, which is put on the Azure VM, is controlled by a configuration like this e.g. in Bicep

    osProfile: {
      computerName: computerName
      adminUsername: adminUsername
      adminPassword: adminPasswordOrKey
      customData: base64(customData)
      linuxConfiguration: ((authenticationType == 'password') ? json('null') : linuxConfiguration)
    }

but is not available during cloud-init. So with this line below, the username of this user is obtained and put into an environment variable for later use:

- export USER=$(awk -v uid=1000 -F":" '{ if($3==uid){print $1} }' /etc/passwd)

it is assumed that the first user created on the Azure VM will get 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 - although not directly required during root user installation, it helps controlling the unattended installation and avoiding warnings



대상 사용자를 위한 툴체인 PATH 추가



툴체인을 PATH에 넣기 위해 사용자의 .profile가 확장됩니다.

- echo '\n\n# added by cloud init\nsource /opt/rust/env' >> /home/$USER/.profile


$USER is determined above



대상 사용자를 위한 툴체인 설치



위의 섹션은 일반적으로 사용자가 도구 체인을 사용할 수 있도록 하며, 이 줄은 사용자를 위한 기본 프로필을 설치합니다.

- sudo -H -u $USER bash -c 'source /opt/rust/env && rustup default stable'


  • sudo -H -u $USER는 대상 사용자
  • 의 컨텍스트에서 bash -c로 지정된 명령을 실행합니다.

  • 위의 source /opt/rust/env에 대한 추가가 현재
  • 에 아직 적용되지 않았으므로 PATH가 필요합니다.



    하지만 잠깐만 더...


  • $USER 환경 변수도 사용할 수 있습니다. VM에 Docker를 설치하고 사용자를 docker 그룹의 구성원으로 만들 때
  • 다중 플랫폼 빌드용 최신 릴리스docker-buildx를 VM에 자동으로 추가하는 방법

  • #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 '\n\n# added by cloud init\nsource /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
    



    이와 같은 단일 덩어리가 이 커뮤니티에 게시하는 것이 합당한지 알려주세요.

    좋은 웹페이지 즐겨찾기