Puppet 如何清理Exec资源创建的文件?

Puppet 如何清理Exec资源创建的文件?,puppet,Puppet,我正在尝试编写一个puppet类,该类将使用OpenStacks创建cirros图像 我上木偶课。它下载图像文件并将其转换为原始图像。 然后使用原始图像格式文件创建浏览图像。 我还想从中删除下载的图像文件和原始图像文件 本地磁盘 这是我试过的清单: class create_glance_cirros_image ( $cirrosver = '0.3.5', $cirros_download_url = 'http://download.cirros-clo

我正在尝试编写一个puppet类,该类将使用OpenStacks创建cirros图像

我上木偶课。它下载图像文件并将其转换为原始图像。 然后使用原始图像格式文件创建浏览图像。 我还想从中删除下载的图像文件和原始图像文件 本地磁盘

这是我试过的清单:

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],
}