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

时间:2017-10-26 16:59:42

标签: puppet

我正在尝试编写一个用OpenStacks Glance创建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'

为什么没有要求导致执行人员执行?

更新:根据马特的建议,我将清单修改为:

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

1 个答案:

答案 0 :(得分:1)

exec资源设置为refreshonly意味着他们需要刷新信号才能触发并应用。这可以使用subscribenotify来完成。由于您的第二个exec取决于第一个,您可以这样做:

exec { $download_command:
  creates     => $target_file,
  refreshonly => true,
  notify      => Exec[$convert_command],
}

或:

exec { $convert_command:
  creates     => $raw_target_file,
  refreshonly => true,
  subscribe   => Exec[$download_command],
}

第一个是棘手的,因为它没有与任何东西建立关系。如果您希望文件下载是幂等的,我建议改为使用file资源。

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],
}
相关问题