使用Puppet设置环境变量

时间:2013-08-23 21:02:12

标签: shell ubuntu vagrant puppet

我正在使用vagrant with puppet为开发环境设置虚拟机。我想在.pp文件中设置一些环境变量。使用Ubuntu 64位的虚拟框和流浪汉基础框。

我现在有这个。

$bar = 'bar'

class foobar {
   exec { 'foobar':
     command => "export Foo=${bar}",
   }
}

但是在配置时我收到错误:无法找到命令' export'。

这似乎应该很简单,我错过了exec类型的某种需求或路径?我注意到在文档中有一个环境选项来设置环境变量,我应该使用它吗?

9 个答案:

答案 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/'],
  }
}
  1. 创建一个空文件,因为在 shell 中会发生回声 Puppet 正在运行命令,而不是我们正在查看的那个。
  2. 将环境变量 bar 设置为等于 foo。
  3. 设置 echo 二进制文件的路径,这对于系统命令通常不是必需的,但了解一下很有用。