Подтвердить что ты не робот

Установка переменных среды с марионеткой

Я пытаюсь разработать лучший способ установить некоторые переменные среды с марионеткой.

Я мог бы использовать exec и просто сделать export VAR=blah. Однако это будет продолжаться только для текущей сессии. Я также думал о просто добавлении его в конец файла, такого как bashrc. Однако тогда я не думаю, что есть надежный метод, чтобы проверить, все ли оно готово; так что в конечном итоге он будет дополняться каждым марионеткой.

4b9b3361

Ответ 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',
}