Puppet:变量内部的变量

时间:2014-08-27 07:46:36

标签: puppet

希望是一个简单的问题,有没有办法将变量放在其他变量中?在我的特定用例中,我试图让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}

任何有助于实现这一目标或实现类似目标的帮助都会非常有用。

谢谢!

2 个答案:

答案 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:}