[shell] Vagrant 프로비저닝 후 사용자로 명령 실행

초기 프로비저닝 후 일반 사용자로 실행해야하는 몇 가지 명령이 있습니다. 별도의 쉘 스크립트와 명령을 사용하여이 작업을 수행 할 수 있다고 생각 su --login -c <command> vagrant했지만 .bashrc에서 사용자의 경로 또는 기타 환경 설정을 가져 오지 않습니다.

예 :

#!/usr/bin/env bash
su --login -c "rbenv install 2.0.0-p353" vagrant
su --login -c "rbenv global 2.0.0-p353" vagrant
su --login -c "gem update --system" vagrant
su --login -c "yes | gem update" vagrant
su --login -c "gem install rdoc" vagrant
su --login -c "gem install rails pg" vagrant

이를 수행하는 방법이 있습니까? Puppet 또는 Chef와 같은 다른 프로비저닝 도구로 수행해야할까요? 를 소스로하는 또 다른 쉘 스크립트를 만들고 .bashrc: file 프로 비저 너를 사용하여 상자에 복사하고 이와 같은 명령을 실행하는 것을 생각했지만 일종의 해킹처럼 보입니다.

이 작업을 수행하는 올바른 방법은 무엇입니까?



답변

당신은 이것을 사용하여이 작업을 수행 할 수 있어야한다 방랑 쉘 제공자를 , 예를

Vagrant.configure("2") do |config|
  $script = <<-SCRIPT
  rbenv install 2.0.0-p353
  rbenv global 2.0.0-p353
  gem update --system
  yes | gem update
  gem install rdoc
  gem install rails pg
  SCRIPT

  config.vm.provision "shell", inline: $script, privileged: false
end

핵심은 privileged: false기본 사용자가 아닌 기본 사용자를 사용 하도록 지정 하는 것입니다 root.


답변

셸 프로 비저 너가 로그인 셸에서 루트가 아닌 사용자로 명령을 실행해야하는 상황에 대한 솔루션을 문서화하고 싶었습니다 .

프로비저닝 명령을 쉘 스크립트 (예 : ‘bootstrap.sh’)에 넣으십시오.

#! /bin/bash

rbenv install 2.0.0-p353
rbenv global 2.0.0-p353
gem update --system
yes | gem update
gem install rdoc
gem install rails pg

그런 다음 Vagrantfile에서 :

Vagrant.configure(2) do |config|

  $script = "/bin/bash --login /vagrant/bootstrap.sh"
  config.vm.provision :shell, privileged: false, inline: $script

end

/vagrant/bootstrap.sh경로를 vagrant 머신 내부의 프로비저닝 스크립트에 대한 올바른 경로로 바꿔야합니다 .

rvmVagrant로 프로비저닝하는 동안 명령이 작동하도록 특별히이 솔루션을 사용했습니다 .


답변

@jabclab@evanhsu 모두 나와 함께 작동하지 않습니다.

rbenvVagrant Provisioning 프로세스 내에서 설치 하고 사용합니다.

사용하기 전에 다음 명령을 사용하여 rbenv명령을

export PATH="$HOME/.rbenv/bin:$PATH"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
eval "$(rbenv init -)"

Bootstrap.sh 파일

#!/usr/bin/env bash

sudo apt-get update
echo "========================= install dependencies for install rbenv ==========================="
sudo apt-get install -y autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
echo "========================= install rbenv =========================================="
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >>  ~/.bashrc
echo 'eval "$(rbenv init -)"' >>  ~/.bashrc
echo "========================= install ruby build plugin for rbenv ======================="
git clone https://github.com/rbenv/ruby-build.git  ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
echo "========================= install ruby v2.5.0 =========================================="
export PATH="$HOME/.rbenv/bin:$PATH"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
eval "$(rbenv init -)"
rbenv install 2.5.0
rbenv global 2.5.0
ruby -v
gem -v
echo "========================= install bundler dependencies manager for ruby ====================="
gem install bundler
rbenv rehash

그런 다음 VagrantFile파일에는 방랑 프로비저닝 라인이 포함됩니다.

deploy_config.vm.provision :shell, privileged: false, path: "bootstrap.sh"

@creisor의 Gits의 내 답변 소스

이 질문rbenv대한 답변 에서 방랑 프로비저닝 프로세스 내에서 명령 을 사용하는 또 다른 방법


답변

때때로 권한이있는 명령과 권한이없는 명령을 혼합하고 싶을 때가 있습니다. 상황에 따라 runuser를 사용하십시오.

runuser -l vagrant -c 'command'


답변