Установка переменных среды с марионеткой
Я пытаюсь разработать лучший способ установить некоторые переменные среды с марионеткой.
Я мог бы использовать exec и просто сделать export VAR=blah
. Однако это будет продолжаться только для текущей сессии. Я также думал о просто добавлении его в конец файла, такого как bashrc. Однако тогда я не думаю, что есть надежный метод, чтобы проверить, все ли оно готово; так что в конечном итоге он будет дополняться каждым марионеткой.
Ответы
Ответ 1
Я бы рассмотрел этот связанный вопрос.
*.sh
скрипты в /etc/profile.d
читаются во время входа пользователя (как говорится в сообщении, в то же время /etc/profile
).
Переменные export
-ed в любом script, размещенном в /etc/profile.d
, будут поэтому доступны для ваших пользователей.
Затем вы можете использовать ресурс file
, чтобы гарантировать, что это действие идемпотентная. Например:
file { "/etc/profile.d/my_test.sh":
content => 'export MYVAR="123"'
}
Ответ 2
Или альтернативный вариант означает невосприимчивый результат:
Пример
if [[ ! grep PINTO_HOME /root/.bashrc | wc -l > 0 ]] ; then
echo "export PINTO_HOME=/opt/local/pinto" >> /root/.bashrc ;
fi
Этот параметр позволяет установить эту переменную окружения, когда присутствие
Приложение pinto делает его более агрессивным, чем необходимость составлять пользователя
.bash_profile
независимо от того, какие приложения могут наступить на ящик.
Ответ 3
Если вы добавите его в свой bashrc, вы можете проверить его в ENV-хеше, выполнив
ENV[VAR]
Что вернет = > "blah"
Ответ 4
Если вы посмотрите на Github Boxen, они исходят из script (/opt/boxen/env. sh) из ~/.profile. Этот script запускает кучу вещей, включая:
for f in $BOXEN_HOME/env.d/*.sh ; do
if [ -f $f ] ; then
source $f
fi
done
Эти скрипты, в свою очередь, устанавливают переменные среды для своих соответствующих модулей.
Ответ 5
Если вы хотите, чтобы переменные влияли на всех пользователей /etc/profile.d - это путь.
Однако, если вы хотите, чтобы они были для определенного пользователя, что-то вроде .bashrc имеет больше смысла.
В ответ на "Я не думаю, что есть надежный метод, чтобы проверить, все ли там готово, поэтому он будет добавляться при каждом запуске puppet", теперь есть ресурс file_line, доступный из модуля puppetlabs stdlib:
"Гарантирует, что данная строка содержится в файле. Реализация соответствует полной строке, включая пробелы в начале и конце. Если строка не содержится в данном файле, Puppet добавляет строку в конец файла, чтобы желаемое состояние. Можно объявить несколько ресурсов для управления несколькими строками в одном файле. "
Пример:
file_line { 'sudo_rule':
path => '/etc/sudoers',
line => '%sudo ALL=(ALL) ALL',
}
file_line { 'sudo_rule_nopw':
path => '/etc/sudoers',
line => '%sudonopw ALL=(ALL) NOPASSWD: ALL',
}