我正在使用 vagrant 和 puppet 来为开发环境设置虚拟机。我想简单地在 .pp 文件中设置一些环境变量。使用适用于 Ubuntu 64 位的虚拟盒子和 vagrant 基础盒子。
我现在有这个。
$bar = 'bar'
class foobar {
exec { 'foobar':
command => "export Foo=${bar}",
}
}
但是在配置时出现错误:找不到命令“导出”。
这看起来应该很简单,我是否缺少 exec 类型的某种需求或路径?我注意到文档中有一个环境选项可以设置环境变量,我应该使用它吗?
如果您只需要 puppet run 中对所有 exec 资源可用的变量,那么有什么问题:
Exec { environment => [ "foo=$bar" ] }
?
完成此操作的最简单方法是将环境变量放入 /etc/environment 中,这确保它们可用于所有内容(或几乎所有内容)。
类似这样的:
class example($somevar) {
file { "/etc/environment":
content => inline_template("SOMEVAR=${somevar}")
}
}
将类参数化的原因是这样您可以通过自动变量查找从 hiera 定位它(http://docs.puppetlabs.com/hiera/1/puppet.html#automatic-parameter-lookup)...如果你在 /etc/environment 中粘贴了一些东西,通常最好将其设置为环境特定的。
注意:我只在ubuntu上测试过这个
我解决这个问题的方法是也使用/etc/profile.d:
$bar = 'bar'
file { "/etc/profile.d/my_test.sh":
content => "export Foo=${bar}",
mode => 755
}
这可确保每次您登录(例如 ssh)时,变量 $MYVAR 都会导出到您的环境中。通过 puppet 申请并登录(例如 ssh localhost)后, echo $Foo 将返回 bar
您可以通过在
/etc/environment
中的一行上定义环境变量来设置环境变量,并且可以在 puppet 中使用 file_line
确保文件内有一行。将这两者结合成以下解决方案:
file_line { "foo_env_var":
ensure => present,
line => "Foo=${bar}",
path => "/etc/environment",
}
您可以尝试以下操作,为此设置环境变量
exec
:
class foobar {
exec { 'foobar' :
command => "/bin/bash -c \"export Foo=${bar}\"",
}
}
这样的事情可以在保留 /etc/environment 文件的现有内容的同时起作用:
/代码/环境/{环境}/清单/环境/变量.pp:
define profile::environment::variable (
$variable_name,
$value,
$ensure => present,
) {
file_line { $variable_name:
path => '/etc/environment',
ensure => $ensure,
line => "$variable_name=$value",
match => "$variable_name=",
}
}
用法(在节点清单的正文中):
profile::environment::variable { 'JAVA_HOME':
variable_name => 'JAVA_HOME',
value => '/usr/lib/jvm/java-1.8.0',
}
我知道这是一个老问题,但我能够设置
PS1
提示值并将其添加到我的 .bashrc
文件中,如下所示:
$PS1 = '\[\e[0;31m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \$ '
在班级内:
exec {"vagrant-prompt":
unless => "grep -F 'export PS1=\"${PS1}\"' ${HOME_DIR}/.bashrc",
command => "echo 'export PS1=\"${PS1}\"' >> ${HOME_DIR}/.bashrc",
user => "${APP_USER}",
}
-F
使得grep
将其解释为固定字符串。否则它将找不到它并不断添加到 .bashrc
文件中。
另一种变化。这样做的优点是不需要
stdlib
(与 file_line
解决方案一样),并且保留 /etc/environment
的现有内容:
exec {'echo foo=bar>>/etc/environment':
onlyif => 'test -f /etc/environment',
unless => 'grep "foo=bar" /etc/environment',
path => '/usr/bin',
}
查看文档 https://puppet.com/docs/puppet/5.5/types/exec.html
class envcheck {
file { '/tmp/test':
ensure => file,
}
exec { 'foobar':
command => 'echo $bar >> /tmp/test',
environment => ['bar=foo'],
path => ['/bin/'],
}
}
使用 puppet 为所有资源设置环境变量的唯一真正方法是在 puppet 运行或使用此模块之前预定义它们: https://github.com/rbramwell/set_env
这里最被接受的答案在技术上是不正确的。 这是一个资源引用,它修改所有“exec”资源并向它们添加环境参数。 https://www.puppet.com/docs/puppet/7/lang_resources.html#adding-or-modifying-attributes
但是其他资源(例如“包”资源)不会受到它们的影响。就我而言,我有一个丑陋的供应商 RPM,它在安装时需要一个环境变量,而我无法通过临时木偶提供该环境变量,因此我需要链接的模块才能使其正常工作。