Ответ 1
У вас должно быть обеспечение script добавить строку в ваш .profile:
echo "export VAR=value" >> ~/.profile
При входе в систему .profile script будет считаться bash, и переменная будет установлена.
У меня есть бродячая работа Ubuntu для целей развития. Я использовал создатель оболочки script для загрузки/установки зависимостей и создания некоторых псевдонимов, но я ударил стену с точки зрения использования создателя среды для создания переменных среды (которые используются для нескольких флагов в моем проекте). Первоначально у меня было что-то вроде:
export MY_VAR='value'
В моем устройстве обеспечения безопасности script, но затем выяснилось, что вы не можете добавлять переменные окружения изнутри оболочки script, запустив ее в обычном режиме. Достаточно справедливо, поэтому я попытался вместо этого изменить свою линию Vagrantfile:
config.vm.provision "shell", inline: "source setup.sh"
Это не решило проблему. Переменные среды все еще не были. Я попытался добавить экспорт напрямую как встроенный:
config.vm.provision "shell", inline: "export MY_VAR='value'"
Не повезло. По-прежнему нет глобальной среды, когда я ssh'ed дюйма Есть ли способ использовать оболочку script для установки переменной среды bash, или это время, чтобы бросить полотенце на средства обеспечения оболочки и узнать шеф-повара?
У вас должно быть обеспечение script добавить строку в ваш .profile:
echo "export VAR=value" >> ~/.profile
При входе в систему .profile script будет считаться bash, и переменная будет установлена.
Увидев, что принятый ответ действительно добавляет export VAR=value
к вашему .profile(или .bashrc) файлу каждый раз при запуске vagrant provision
, вот как я быстро добавил переменные среды
source ~/.profile && [ -z "$VAR" ] && echo "export VAR=value" >> ~/.profile
Структура:
source ~/.profile
: загрузите текущий .profile
файл[ -z "$VAR"]
: проверьте, установлен ли или нет VAR
, если нет:echo "export VAR=value" >> ~/.profile
: добавьте строку экспорта в .profile
Объединяя все это:
Обычно я использую puphpet для своих бродячих боксов, поэтому я склонен придерживаться структуры каталогов, которую он использует, что означает предоставление моего обеспечения script в puphpet/shell/*
(относительно файла Vagrantfile
). В этом файле вы можете добавить столько переменных среды, сколько захотите:
#!/usr/bin/env bash
#Replace .profile with .bashrc if required
source ~/.profile
if [ -z "$VAR" ]; then # only checks if VAR is set, regardless of its value
echo "export VAR=value" >> ~/.profile
fi
#other env variables and profile stuff here
Если вы хотите установить переменные среды на определенное значение, даже если они установлены, вы можете заменить [ -z "$VAR" ]
на это (как предлагалось Maks3w):
if [ -z "$VAR" ] || [ "$VAR" != "value" ]; then
#same as before
fi
Затем просто добавьте это в свой Vagrantfile:
config.vm.provision "shell", path: "puphpet/shell/your-script.sh"
Это должно сделать трюк...
В этом ответе показано, как добавлять переменные среды, просто изменяя VagrantFile
с помощью синтаксиса Ruby HEREDOC (Here doc)
$install_user_vars = <<SCRIPT
source ~/.profile
if [ -z "$VAR" ] || [ "$VAR" != "value" ]; then
echo "export VAR=value" >> ~/.profile
fi
if [ $(pwd) != "/vagrant" ]; then
echo "cd /vagrant" >> ~/.profile
fi
SCRIPT
config.vm.provision "shell", inline: $install_user_vars
Примечание. Закрытие SCRIPT
должно быть первым символом в его собственной строке
Вот как я получил $GOPATH
working:
config.vm.provision "shell", inline: <<-SHELL
echo -n > /etc/profile.d/gopath.sh
echo 'export GOPATH=$HOME/go' >> /etc/profile.d/gopath.sh
echo 'export PATH=$PATH:$GOPATH/bin' >> /etc/profile.d/gopath.sh
SHELL
Использование одиночных кавычек и $HOME
(вместо ~
) было необходимо --- я не мог заставить его работать иначе.
Я искал то же самое. Я хотел установить переменные среды http(s)_proxy
в Vagrantfile. Требовалось, чтобы я мог изменить эти переменные в любое время и vagrant reload
для их применения.
Наконец, я придумал решение:
config.vm.provision "shell", inline: "> /etc/profile.d/myvars.sh", run: "always"
config.vm.provision "shell", inline: "echo \"export http_proxy=http://proxy.somedomain.com:3128\" >> /etc/profile.d/myvars.sh", run: "always"
config.vm.provision "shell", inline: "echo \"export https_proxy=https://proxy.somedomain.com:3128\" >> /etc/profile.d/myvars.sh", run: "always"
0)/etc/profile.d/*.sh скрипты запускаются при запуске оболочки bash
1) удаляет все из myvars.sh
2) задает первую переменную
3) устанавливает вторую переменную
Из-за run: "always" Я могу добавлять/удалять переменные, а после vagrant reload
они применяются.
В CentOs7 вам нужно поместить env vars в /etc/profile.d/
В моем случае это сработало:
machine.vm.provision 'shell',
inline: 'sudo su - && echo "export VAR1=test export VAR2=test" > /etc/profile.d/vars.sh'