Добавление строк в / etc / profile с помощью puppet?

16

Я использую Puppet для установки текущего JDK и Tomcat.

package {
    [ "openjdk-6-jdk", "openjdk-6-doc", "openjdk-6-jre",
      "tomcat6", "tomcat6-admin", "tomcat6-common", "tomcat6-docs", 
      "tomcat6-user" ]:
    ensure => present,
}

Теперь я хотел бы добавить

JAVA_HOME="/usr/lib/java"
export JAVA_HOME

чтобы /etc/profileпросто убрать это с дороги. Я не нашел прямого ответа в документах, пока. Есть ли рекомендуемый способ сделать это?

В общем, как мне сказать puppet поместить этот файл туда или изменить этот файл? Я использую Puppet для одного узла (в автономном режиме), чтобы просто попробовать его и вести журнал настроек сервера .

Мик
источник
1
Если вы попадаете в Puppet, проверьте Example42 для предварительно собранных модулей. Они не всегда работают так, как вы хотите, но они последовательны и стабильны. github.com/example42/puppet-modules
kashani

Ответы:

26

Добавьте файл /etc/profile.d/с суффиксом .sh. Он будет получен как часть / etc / profile в Red Hat и Debian и его производных, чего не скажешь о других дистрибутивах. Вообще говоря, если это вообще возможно, лучше добавлять фрагменты, а не заменять распределенные файлы, поскольку это более безопасно в будущем.

Таким образом, в кукольный, следующее будет делать:

file { "/etc/profile.d/set_java_home.sh":
    ensure => present,
    source => ...[whatever's appropriate for your setup]...,
    ...
}

Это то, что вы ищете или вам нужно больше деталей?

отметка
источник
1
Это также работает на OpenSUSE и Gentoo.
Камил Кисиэль
1
Спасибо, это здорово. Получил это почти работает, просто нужно найти подходящий способ ссылки на файл относительно .ppисточника.
мику
1
Предполагается, что Puppet 0.25 или лучше source => puppet: /// $ modulename / $ file с реальным системным путем, равным $ modulename / files / $ file
kashani
2
IIRC 2.6.5 и более поздние версии выдают предупреждение об устаревании, если вы используете обозначение puppet: /// $ modulename / files / $ filename. это должно выглядеть как кукла: /// modules / $ modulename / files / $ filename
ztron
42

Решение mark лучше всего подходит для добавления материала в профиль каждого, но если вам когда-нибудь понадобится убедиться, что некоторые строки находятся в файле, в Puppet Labs есть отличный модуль stdlib, который включает file_line, который будет делать то, что вам нужно. Ранее я использовал echo и grep в типе exec для этого, но file_line намного проще и чище.

Вот помощь для этого:

Ensures that a given line is contained within a file. The implementation
matches the full line, including whitespace at the beginning and end. If
the line is not contained in the given file, Puppet will add the line to
ensure the desired state. Multiple resources may be declared to manage
multiple lines in the same file.

Example:

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',
}

In this example, Puppet will ensure both of the specified lines are
contained in the file /etc/sudoers.
Марк Маккинстри
источник
2
Удостоверьтесь, что у вас включена подключаемая синхронизация на клиенте, в противном случае кажется, что это происходит автоматически.
Гак
1
вот документ с прямым якорем forge.puppetlabs.com/puppetlabs/stdlib#resources
Франческо Касула