使用 Puppet 设置环境变量

问题描述 投票:0回答:10

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

我现在有这个。

$bar = 'bar'

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

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

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

shell ubuntu vagrant puppet
10个回答
22
投票

如果您只需要 puppet run 中对所有 exec 资源可用的变量,那么有什么问题:

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


16
投票

完成此操作的最简单方法是将环境变量放入 /etc/environment 中,这确保它们可用于所有内容(或几乎所有内容)。

类似这样的:

class example($somevar) {
    file { "/etc/environment":
        content => inline_template("SOMEVAR=${somevar}")
    }
}

将类参数化的原因是这样您可以通过自动变量查找从 hiera 定位它(http://docs.puppetlabs.com/hiera/1/puppet.html#automatic-parameter-lookup)...如果你在 /etc/environment 中粘贴了一些东西,通常最好将其设置为环境特定的。

注意:我只在ubuntu上测试过这个


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


4
投票

您可以通过在

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

file_line { "foo_env_var":
    ensure  => present,
    line    => "Foo=${bar}",
    path    => "/etc/environment",
}

2
投票

您可以尝试以下操作,为此设置环境变量

exec

class foobar {
   exec { 'foobar' :
     command => "/bin/bash -c \"export Foo=${bar}\"",
   }
}

2
投票

这样的事情可以在保留 /etc/environment 文件的现有内容的同时起作用:

/代码/环境/{环境}/清单/环境/变量.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',
}

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
文件中。


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

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

0
投票

使用 puppet 为所有资源设置环境变量的唯一真正方法是在 puppet 运行或使用此模块之前预定义它们: https://github.com/rbramwell/set_env

这里最被接受的答案在技术上是不正确的。 这是一个资源引用,它修改所有“exec”资源并向它们添加环境参数。 https://www.puppet.com/docs/puppet/7/lang_resources.html#adding-or-modifying-attributes

但是其他资源(例如“包”资源)不会受到它们的影响。就我而言,我有一个丑陋的供应商 RPM,它在安装时需要一个环境变量,而我无法通过临时木偶提供该环境变量,因此我需要链接的模块才能使其正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.