希望是一个简单的问题,有没有办法将变量放在其他变量中?在我的特定用例中,我试图让puppet安装一大堆二进制文件(ant,maven,jdk等)变得棘手。
假设我有以下表现:
$package_name = [ 'ant', 'maven' ]
$package_ant_versions = [ '1.7.1', '1.8.4', '1.9.4' ]
$package_ant_prefix = 'apache-ant-'
$package_ant_suffix = '-src.tar.gz'
$package_maven_versions = [ '3.0.4' ]
$package_maven_prefix = 'apache-maven-'
$package_maven_suffix = '.tgz'
$path = 'repo.domain.com/software'
所以有我的变数。现在我正在尝试编写一个exec语句,它将遍历所有包和变量并在本地下载它们,所以我可以安装它们。
以下是我对该命令的尝试:
exec { 'download-packages':
command => "/usr/bin/aws s3 cp ${path}/${package_name}/${package_${package_name}_prefix}/{package_${package_name}_versions}/${package_${package_name}_suffix} /tmp"
}
我希望它能起作用的方式是它会遍历所有变量。例如,使用定义的变量,将运行的命令是:
/usr/bin/aws s3 cp repo.domain.com/software/ant/apache-ant-1.7.1-src.tar.gz /tmp
/usr/bin/aws s3 cp repo.domain.com/software/ant/apache-ant-1.8.4-src.tar.gz /tmp
/usr/bin/aws s3 cp repo.domain.com/software/ant/apache-ant-1.9.4-src.tar.gz /tmp
/usr/bin/aws s3 cp repo.domain.com/software/maven/apache-maven-3.0.4.tgz /tmp
最终结果是我只想在清单中添加/更改版本(例如,我可以通过更改来进入并添加ant版本1.9.3:
$package_ant_versions = [ '1.7.1', '1.8.4', '1.9.4' ]
到
$package_ant_versions = [ '1.7.1', '1.8.4', '1.9.3', '1.9.4' ]
让木偶完成剩下的工作(假设文件在尝试下载的位置可用)。
我确信我做错了,但我希望我想要达到的最终结果是明确的。当我尝试将变量放在变量中时似乎打破了:
${package_${package_name}_prefix}
${package_${package_name}_versions}
${package_${package_name}_suffix}
任何有助于实现这一目标或实现类似目标的帮助都会非常有用。
谢谢!
答案 0 :(得分:3)
首先,如上所述,使用如下结构。
$packages = {
'ant' => {
'versions' => [ '1.7.1', '1.8.4', '1.9.4', ],
'prefix' => 'apache-ant-',
'suffix' => '-src.tar.gz',
},
'maven' => {
'versions' => [ '3.0.4', ],
'prefix' => 'apache-maven-',
'suffix' => '-bin.tar.gz',
}
}
请注意,在单个exec资源中无法合理使用版本数组。我想你想要这个:
define software_download($versions, $prefix, $suffix) {
software_version_download { $versions:
software => $name,
prefix => $prefix,
suffix => $suffix,
}
}
define software_version_download($software, $prefix, $suffix) {
$version = $name
exec { "download-$software-$version":
command => "/usr/bin/aws s3 cp ${path}/${software}/${prefix}${version}${suffix} /tmp",
}
}
define software_download
接受您的数据并将其多路复用到software_version_download
定义,将每个不同版本作为资源$name
传递。从那以后,构建了最终的命令。
如果您的数据位于哈希值中,您可以create_resources('software_download', $packages)
或更少地通过清单代码神奇地获取数据:
software_download {
'ant':
'versions' => [ '1.7.1', '1.8.4', '1.9.4', ],
'prefix' => 'apache-ant-',
'suffix' => '-src.tar.gz';
'maven':
'versions' => [ '3.0.4', ],
'prefix' => 'apache-maven-',
'suffix' => '-bin.tar.gz';
}
答案 1 :(得分:1)
您可以使用inline_template执行此操作:
exec { 'download-packages':
command => inline_template("/usr/bin/aws s3 cp ${path}/${package_name}/<%=package_${package_name}_prefix%>/<%=package_${package_name}_versions%>/<%=package_${package_name}_suffix%> /tmp")
}
但是,正如@FelixFrank所说,也许是一种结构化的方式。
解决了变量内变量的问题。对于数组问题,您可以emulate使用foreach语句:
$package_name= [ "ant", "maven" ]
define download-packages() {
exec { 'download-packages-$name':
command => "/usr/bin/aws s3 cp ${path}/${name}/${package_${name}_prefix}/{package_${name}_versions}/${package_${name}_suffix} /tmp"
}
}
download-packages{ $package_name:}