在puppet中传输和删除文件

在puppet中传输和删除文件,puppet,Puppet,我正试图将一个文件从puppet master复制到puppet代理中。使用它进行安装。然后删除该文件。我已经测试了脚本,直到安装部分,它工作正常。唯一的问题是删除文件时。在添加了几行之后,我得到了这个错误 Error: Failed to apply catalog: Duplicate declaration: File[/home/mypackage-4.4.0.rpm] is already declared in file /etc/puppet/manifests/site.pp:2

我正试图将一个文件从puppet master复制到puppet代理中。使用它进行安装。然后删除该文件。我已经测试了脚本,直到安装部分,它工作正常。唯一的问题是删除文件时。在添加了几行之后,我得到了这个错误

Error: Failed to apply catalog: Duplicate declaration: File[/home/mypackage-4.4.0.rpm] is already declared in file /etc/puppet/manifests/site.pp:23; cannot redeclare at /etc/puppet/manifests/site.pp:31
这是我写的pp文件:

class mypackage {
    $version = '4.6.0'
    if $::operatingsystem == 'CentOS' {
            exec { "mypackage-uninstall":
                    path    => ['/usr/bin','/usr/sbin/','/bin','/sbin'],
                    command => "/bin/rpm -e mypackage",
            }
            file { "mypackage-${version}.rpm":
                    path    =>"/home/mypackage-${version}.rpm",
                    source  => "puppet:///modules/mypackage-${version}.rpm"
            }
            exec { "mypackage-install":
                    path    => ['/usr/bin','/usr/sbin','/bin','/sbin'],
                    command => "/bin/rpm -ivh /home/mypackage-${version}.rpm",
                    require => file["/home/mypackage-${version}.rpm"],
            }
#this is the part that i add to delete back what has been copied to the agent
            file { "mypackage-${version}.rpm":
                    path    => /home/mypackage-${version}.rpm",
                    ensure  => absent,
            }
     }
}
我已尝试将声明更改为
文件{“mypackage remove”:
。但出现了相同的错误。如何声明用于复制的文件并将其声明为删除


我使用的是CentOS 6.0。我的puppet master和agent都是3.7.5。

在puppet中,您可以定义所需的资源状态

Puppet是一种配置管理解决方案,允许您定义IT基础架构的状态,然后自动强制执行所需的状态

所以像文件这样的东西不会存在一段时间,然后它会神奇地消失。如果您使用
file
resource下载/复制文件,您不能通过
file
resource删除它。要删除它,请使用
exec
eg

exec { "remove file":
        path    => ['/usr/bin','/usr/sbin','/bin','/sbin'],
        command => "rm /home/mypackage-${version}.rpm",
        require => File["/home/mypackage-${version}.rpm"],
}
更新: 有几件事值得一提:

  • 创建时,您使用.So而不是

    require => file["/home/mypackage-${version}.rpm"]
    
    但是:

  • 要定义不同的文件,可以多次使用
    文件
    资源,但每个资源必须相同

    通过使实例的标题和名称/名称变量包含$title值或其他参数,可以使实例中的资源不同

    对于资源,属性是一个namevar。这意味着它也必须是唯一的。仅更改文件名而不更改路径,仍将导致
    重复声明
    错误


  • 在Puppet中,定义所需的资源状态

    Puppet是一种配置管理解决方案,允许您定义IT基础架构的状态,然后自动强制执行所需的状态

    所以像文件这样的东西不会存在一段时间,然后它会神奇地消失。如果您使用
    file
    resource下载/复制文件,您不能通过
    file
    resource删除它。要删除它,请使用
    exec
    eg

    exec { "remove file":
            path    => ['/usr/bin','/usr/sbin','/bin','/sbin'],
            command => "rm /home/mypackage-${version}.rpm",
            require => File["/home/mypackage-${version}.rpm"],
    }
    
    更新: 有几件事值得一提:

  • 创建时,您使用.So而不是

    require => file["/home/mypackage-${version}.rpm"]
    
    但是:

  • 要定义不同的文件,可以多次使用
    文件
    资源,但每个资源必须相同

    通过使实例的标题和名称/名称变量包含$title值或其他参数,可以使实例中的资源不同

    对于资源,属性是一个namevar。这意味着它也必须是唯一的。仅更改文件名而不更改路径,仍将导致
    重复声明
    错误