Puppet 如何清理Exec资源创建的文件?
我正在尝试编写一个puppet类,该类将使用OpenStacks创建cirros图像 我上木偶课。它下载图像文件并将其转换为原始图像。 然后使用原始图像格式文件创建浏览图像。 我还想从中删除下载的图像文件和原始图像文件 本地磁盘 这是我试过的清单:Puppet 如何清理Exec资源创建的文件?,puppet,Puppet,我正在尝试编写一个puppet类,该类将使用OpenStacks创建cirros图像 我上木偶课。它下载图像文件并将其转换为原始图像。 然后使用原始图像格式文件创建浏览图像。 我还想从中删除下载的图像文件和原始图像文件 本地磁盘 这是我试过的清单: class create_glance_cirros_image ( $cirrosver = '0.3.5', $cirros_download_url = 'http://download.cirros-clo
class create_glance_cirros_image (
$cirrosver = '0.3.5',
$cirros_download_url = 'http://download.cirros-cloud.net',
$curl = '/usr/bin/curl',
$download_dir = '/root',
$qemu_img = '/usr/bin/qemu-img',
$qemu_img_args = 'convert -f qcow2 -O raw',
$image_name = 'cirros',
$is_public = 'no',
$container_format = 'bare',
$disk_format = 'raw',
$min_ram = '1024',
$min_disk = '1',
$properties = { 'img_key' => img_value },
$ensure = 'present',
) {
$cirros_image = "cirros-${cirrosver}-x86_64-disk.img"
$raw_cirros_image = "cirros-${cirrosver}-x86_64-disk.raw"
$image_url = "${cirros_download_url}/${cirrosver}/${cirros_image}"
$target_file = "${download_dir}/${cirros_image}"
$raw_target_file = "${download_dir}/${raw_cirros_image}"
$curl_args = "--output ${target_file}"
$download_command = "${curl} ${curl_args} ${image_url}"
$convert_command = "${qemu_img} ${qemu_img_args} ${target_file} ${raw_target_file}"
exec { $download_command:
creates => $target_file,
refreshonly => true,
}
exec { $convert_command:
creates => $raw_target_file,
refreshonly => true,
require => Exec[$download_command],
}
glance_image { $image_name:
ensure => $ensure,
name => $image_name,
is_public => $is_public,
container_format => $container_format,
disk_format => $disk_format,
source => $raw_target_file,
min_ram => $min_ram,
min_disk => $min_disk,
properties => $properties,
require => Exec[$convert_command],
}
file { $target_file:
ensure => 'absent',
}
file { $raw_target_file:
ensure => 'absent',
}
}
当我运行它时,会出现以下错误:
Error: Execution of '/usr/bin/openstack image create --format shell cirros --private --container-format=bare --disk-format=raw --min-disk=1 --min-ram=1024 --property img_key=img_value --file=/root/cirros-0.3.5-x86_64-disk.raw' returned 1: [Errno 2] No such file or directory: '/root/cirros-0.3.5-x86_64-disk.raw'
Error: /Stage[main]/Create_glance_cirros_image/Glance_image[cirros]/ensure: change from absent to present failed: Execution of '/usr/bin/openstack image create --format shell cirros --private --container-format=bare --disk-format=raw --min-disk=1 --min-ram=1024 --property img_key=img_value --file=/root/cirros-0.3.5-x86_64-disk.raw' returned 1: [Errno 2] No such file or directory: '/root/cirros-0.3.5-x86_64-disk.raw'
为什么require没有导致exec执行
更新:根据Matt的建议,我修改了清单,如下所示:
exec { $download_command:
creates => $target_file,
unless => "/usr/bin/openstack image list --format=value | cut -d' ' -f2 | grep \"^${image_name}$\"",
notify => Exec[$convert_command],
}
exec { $convert_command:
creates => $raw_target_file,
refreshonly => true,
}
glance_image { $image_name:
ensure => present,
name => $image_name,
is_public => $is_public,
container_format => $container_format,
disk_format => $disk_format,
source => $raw_target_file,
min_ram => $min_ram,
min_disk => $min_disk,
properties => $properties,
}
exec { "/bin/rm -f ${target_file}":
subscribe => Exec[$convert_command],
refreshonly => true,
}
file { $raw_target_file:
ensure => 'absent',
require => Glance_image[$image_name],
}
将
exec
资源设置为refreshonly
意味着它们需要一个刷新信号来触发和应用。这可以通过订阅
或通知
完成。由于第二个exec
取决于第一个,因此可以按如下方式执行:
exec { $download_command:
creates => $target_file,
refreshonly => true,
notify => Exec[$convert_command],
}
或:
第一个更为棘手,因为它没有与任何东西建立关系。如果您希望文件下载是幂等的,我建议使用文件
资源
file { $target_file:
source => $image_url,
}
这将使您的两个资源都是幂等的,并且仅当您希望它们时才应用,从而实现您的目标
不过,您需要将图像文件删除修改为exec
。类似这样的方法会奏效:
exec { "/bin/rm -f ${target_file}":
subscribe => Exec[$convert_command]
refreshonly => true,
}
创建和使用原始图像文件后,还需要应用原始图像文件删除:
file { $raw_target_file:
ensure => 'absent',
require => Glance_image[$image_name],
}
file { $raw_target_file:
ensure => 'absent',
require => Glance_image[$image_name],
}