Shell 使用Puppet设置环境变量
我正在使用vagrant with puppet为开发环境设置虚拟机。我只想在.pp文件中设置几个环境变量。使用64位Ubuntu的虚拟盒和浮动基本盒 我现在有这个Shell 使用Puppet设置环境变量,shell,ubuntu,vagrant,puppet,Shell,Ubuntu,Vagrant,Puppet,我正在使用vagrant with puppet为开发环境设置虚拟机。我只想在.pp文件中设置几个环境变量。使用64位Ubuntu的虚拟盒和浮动基本盒 我现在有这个 $bar = 'bar' class foobar { exec { 'foobar': command => "export Foo=${bar}", } } 但是当设置时,我得到一个错误:找不到命令“export” 这似乎应该足够简单,我是否缺少exec类型的某种要求或路径?我注意到文档中有一个设
$bar = 'bar'
class foobar {
exec { 'foobar':
command => "export Foo=${bar}",
}
}
但是当设置时,我得到一个错误:找不到命令“export”
这似乎应该足够简单,我是否缺少exec类型的某种要求或路径?我注意到文档中有一个设置环境变量的环境选项,我应该使用它吗?您可以尝试以下方法,为这个
exec
设置环境变量:
class foobar {
exec { 'foobar' :
command => "/bin/bash -c \"export Foo=${bar}\"",
}
}
实现这一点的最简单方法是将您的环境变量放在/etc/environment中,这样可以确保它们对任何东西(或几乎所有东西)都可用 大概是这样的:
class example($somevar) {
file { "/etc/environment":
content => inline_template("SOMEVAR=${somevar}")
}
}
$PS1 = '\[\e[0;31m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \$ '
将类参数化的原因是,您可以通过自动变量查找()从hiera将其作为目标。。。如果要在/etc/environment中粘贴某些内容,通常最好将其设置为特定于环境
注意:我只在ubuntu上测试过这个,如果您只需要puppet运行中可用的变量,那么有什么问题:
Exec { environment => [ "foo=$bar" ] }
?我绕过它的方法是同时使用/etc/profile.d:
$bar = 'bar'
file { "/etc/profile.d/my_test.sh":
content => "export Foo=${bar}",
mode => 755
}
这确保了每次登录(exssh)时,变量$MYVAR都会导出到您的环境中。通过puppet和登录(ex ssh localhost)应用后,echo$Foo将返回bar我知道这是一个老问题,但我能够设置
PS1
提示值并将其添加到我的.bashrc
文件中,如下所示:
class example($somevar) {
file { "/etc/environment":
content => inline_template("SOMEVAR=${somevar}")
}
}
$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
文件。您可以通过在/etc/environment
中的一行定义环境变量来设置它,并且可以使用puppet中的file\u line
确保文件中有一行。将这两者结合到以下解决方案中:
file_line { "foo_env_var":
ensure => present,
line => "Foo=${bar}",
path => "/etc/environment",
}
这样做可以在保留/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=",
}
}
用法(在节点清单的主体中):
另一种变体。这样做的优点是不需要
stdlib
(与文件行
解决方案一样),并且/etc/environment
的现有内容得到保留:
exec {'echo foo=bar>>/etc/environment':
onlyif => 'test -f /etc/environment',
unless => 'grep "foo=bar" /etc/environment',
path => '/usr/bin',
}
查看文档
谢谢你的回复,我真的找到了解决办法。虽然它删除了关于找不到命令的错误,但不幸的是,它没有产生预期的结果。当我ssh到虚拟机时,没有设置环境变量Foo。这是一个noop。它修改专门为此
exec
资源分叉的shell的环境。然后,该外壳立即终止。导出无效。exec语句在他登录到服务器时不会导出变量。我知道-这就是为什么我说“如果您只需要puppet运行中可用的变量”。这个问题并没有说明变量需要在用户shell中设置。我喜欢简单简洁的修复方法,而不喜欢这会污染我的/etc/environment
。谢谢。如果您需要与/etc/environment文件中的其他环境变量共存,这是最干净的解决方案。您还可以使用match参数来确保行在更改后不会重复。您将如何使用该变量?只是$foo_env_var
?foo_env_var
是仅由puppet使用的行的名称。这里设置的环境变量是Foo
,因此使用它就像$Foo
-例如:echo$Foo