我只能访问我们团队的模块,因为全局清单由基础架构团队维护。 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
变量。
答案 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。
我没有仔细检查,这会导致前导路径或附加(我假设后者),所以如果这对你很重要,你会想要仔细检查。