23

我正在使用 vagrant 和 puppet 来为开发环境设置虚拟机。我想简单地在 .pp 文件中设置一些环境变量。为 Ubuntu 64 位使用虚拟盒子和流浪者基础盒子。

我目前有这个。

$bar = 'bar'

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

但是在配置时出现错误:找不到命令“导出”。

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

4

9 回答 9

22

如果您只需要 puppet 运行中可用的变量,那么有什么问题:

Exec { environment => [ "foo=$bar" ] }

?

于 2013-08-24T10:33:38.370 回答
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 上测试过这个

于 2013-08-24T03:36:00.630 回答
4

我解决它的方法是也使用/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

于 2014-04-23T14:43:33.573 回答
4

您可以通过在行中定义环境变量来设置环境变量,/etc/environment并且可以使用file_linein puppet 确保文件内的行。将这两者结合到以下解决方案中:

file_line { "foo_env_var":
    ensure  => present,
    line    => "Foo=${bar}",
    path    => "/etc/environment",
}
于 2018-10-23T17:01:31.240 回答
2

您可以尝试以下方法,它为此设置环境变量exec

class foobar {
   exec { 'foobar' :
     command => "/bin/bash -c \"export Foo=${bar}\"",
   }
}
于 2013-08-23T21:57:39.123 回答
2

在保留 /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',
}
于 2018-12-18T17:35:23.703 回答
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文件中。

于 2015-06-09T17:50:10.807 回答
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',
}
于 2021-05-07T18:34:35.050 回答
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 二进制文件的路径,这对于系统命令通常不是必需的,但对了解很有用。
于 2021-05-08T18:10:09.580 回答