puppet - 如何附加到路径变量?

时间:2014-08-11 18:28:50

标签: puppet

我只能访问我们团队的模块,因为全局清单由基础架构团队维护。 PATH变量在全局清单中设置。

我想附加到PATH变量,但是puppet忽略了我的exec块。

file { "/etc/profile.d/set_java_home.sh":
    ensure => file,
    source => "puppet:///modules/teamXXX/set_java_home.sh",
    mode => "u=rw,go=r"
}

Exec { path => [ "\${PATH}", "\${JAVA_HOME}/bin" ] }

如何附加PATH变量?

修改

我应该提到,我希望为用户的shell环境而不是puppet的执行环境增强PATH变量。

3 个答案:

答案 0 :(得分:6)

Puppet无法改变正在运行的shell的环境。没有子进程可以 - 将环境复制到每个子进程,然后只能访问其单个副本。

要向所有新登录shell的PATH附加内容,您需要更改profile配置文件。如果您使用的是最新版本的bash,则应该有一个/etc/profile.d。您可以使用以下资源:

file { '/etc/profile.d/append-java-path.sh':
    mode    => '644',
    content => 'PATH=$PATH:/my/java/home/bin',
}

答案 1 :(得分:1)

三个问题:

1)您无法访问本地客户端环境变量,如PATH和JAVA_HOME,除非您有一个将它们注入Puppet客户端环境的facter脚本。我的猜测是你没有。

2)Exec块设置自己的本地环境,在Exec块结束时销毁。因此,您可以在Exec块中设置所需的所有路径,并且它不会对其余块执行任何操作。请参阅Puppet源代码中的provider / exec.rb。

3)除非某些其他块具有before => Exec [“my_exec_block”]在其中,Exec块将以任意半随机顺序运行,可能不是在您希望它运行时。

最好的办法是将操作作为脚本运行,并在实际脚本中设置PATH。因此:

file { "/opt/myapp/install_java_app":
      notify => Exec["install_java_app"],
      mode => 755,
      source => "puppet:///modules/myapp/install_java_app",
      before => Exec["install_java_app"]
    }
exec { "install_java_app" :
      path => "/usr/bin:/usr/sbin:/bin:/sbin:/opt/myapp",
      command => "install_java_app",
      refreshonly => true
    }

然后/ opt / myapp / install_java_app会在其中包含您需要的任何PATH分配。

这有点笨重,但那就是Puppet。

答案 2 :(得分:1)

以下是如何附加到路径的示例:

Exec { path => [ '/bin' ] }

exec { [ 'ls', 'who' ]: returns => 0; }

Exec[who] { path +> [ '/usr/bin' ] }

可悲的是,资源覆盖无法绕过 - +>语法为only valid there

我没有仔细检查,这会导致前导路径或附加(我假设后者),所以如果这对你很重要,你会想要仔细检查。