我正在使用vagrant with puppet为开发环境设置虚拟机。我想在.pp文件中设置一些环境变量。使用Ubuntu 64位的虚拟框和流浪汉基础框。
我现在有这个。
$bar = 'bar'
class foobar {
exec { 'foobar':
command => "export Foo=${bar}",
}
}
但是在配置时我收到错误:无法找到命令' export'。
这似乎应该很简单,我错过了exec类型的某种需求或路径?我注意到在文档中有一个环境选项来设置环境变量,我应该使用它吗?
答案 0 :(得分:17)
如果您只需要木偶运行中可用的变量,那么错误:
Exec { environment => [ "foo=$bar" ] }
答案 1 :(得分:16)
最简单的方法是将你的环境变量放在/ etc / environment中,这可以确保它们可用于所有内容(或几乎所有内容)。
这样的事情:
class example($somevar) {
file { "/etc/environment":
content => inline_template("SOMEVAR=${somevar}")
}
}
让参数化类的原因是你可以使用自动变量查找(http://docs.puppetlabs.com/hiera/1/puppet.html#automatic-parameter-lookup)从hiera中定位它...如果你在/ etc / environment中粘贴了某些东西,通常最好是你真正制作它具体环境。
注意:我只在ubuntu上测试了这个
答案 2 :(得分:4)
我解决它的方法是使用/etc/profile.d:
$bar = 'bar'
file { "/etc/profile.d/my_test.sh":
content => "export Foo=${bar}",
mode => 755
}
这确保了每次登录(ex ssh)时,变量$ MYVAR都会导出到您的环境中。通过puppet和登录(ex ssh localhost)申请后,echo $ Foo将返回栏
答案 3 :(得分:3)
您可以尝试以下操作,为此exec
设置环境变量:
class foobar {
exec { 'foobar' :
command => "/bin/bash -c \"export Foo=${bar}\"",
}
}
答案 4 :(得分:2)
您可以通过在/etc/environment
中的一行上定义环境变量来设置环境变量,并且可以在puppet中使用file_line
来确保文件中的一行。将这两种方法合并为以下解决方案:
file_line { "foo_env_var":
ensure => present,
line => "Foo=${bar}",
path => "/etc/environment",
}
答案 5 :(得分: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
文件。
答案 6 :(得分:0)
这样的事情在保留/ etc / environment文件的现有内容的同时会起作用:
/ code / environments / {environment} /manifests/environment/variable.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',
}
答案 7 :(得分:0)
另一种变体。这样做的优点是不需要 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',
}
答案 8 :(得分:0)
查看文档 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/'],
}
}