Shell 使用Puppet设置环境变量

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类型的某种要求或路径?我注意到文档中有一个设

我正在使用vagrant with puppet为开发环境设置虚拟机。我只想在.pp文件中设置几个环境变量。使用64位Ubuntu的虚拟盒和浮动基本盒

我现在有这个

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

查看文档

  • 创建一个空文件是因为在shell Puppet中会发生回音,这是在运行命令,而不是我们正在查看的命令
  • 将环境变量栏设置为等于foo
  • 设置echo二进制文件的路径,这通常不是系统命令所必需的,但了解它很有用

  • 谢谢你的回复,我真的找到了解决办法。虽然它删除了关于找不到命令的错误,但不幸的是,它没有产生预期的结果。当我ssh到虚拟机时,没有设置环境变量Foo。这是一个noop。它修改专门为此
    exec
    资源分叉的shell的环境。然后,该外壳立即终止。导出无效。exec语句在他登录到服务器时不会导出变量。我知道-这就是为什么我说“如果您只需要puppet运行中可用的变量”。这个问题并没有说明变量需要在用户shell中设置。我喜欢简单简洁的修复方法,而不喜欢这会污染我的
    /etc/environment
    。谢谢。如果您需要与/etc/environment文件中的其他环境变量共存,这是最干净的解决方案。您还可以使用match参数来确保行在更改后不会重复。您将如何使用该变量?只是
    $foo_env_var
    foo_env_var
    是仅由puppet使用的行的名称。这里设置的环境变量是
    Foo
    ,因此使用它就像
    $Foo
    -例如:
    echo$Foo