我对资源类型文件和包有疑问。
我通过File-RT将Ubuntu上的msi文件复制到Windows计算机(我没有samba共享)
我通过Package-RT安装了msi文件
到目前为止,它仍然有效,但是我的问题是,当我在客户端上调用puppet agent --test时,msi文件将被复制到Windows,然后将其删除。
所以我的问题是:复制,安装和删除后是否有办法再次忽略将复制文件复制到计算机?
预先感谢
UPDATE ::::::::::::::::::::::::::::::::
#Copy file to Windows Client
file { 'copy_msi_file_to_win_client':
source => "puppet:///modules/test_msi/test.msi",
ensure => 'present',
path => "C:/test.msi",
source_permissions => ignore,
require => Exec['test'],
}
#install TEST on Windows Client
Package { 'TEST APP NAME':
ensure => 'installed',
provider => 'windows',
source => "c:/test.msi",
require => File['copy_msi_file_to_win_client'],
}
#Remove test.msi file
exec { 'remove_test_msi_file':
command => 'Remove-Item c:/test.msi -Force',
onlyif => 'if(Get-Service "TEST_SERVICE_NAME") { exit 0 } else { exit 1 }',
provider => powershell,
}
最好的问候, 安迪
答案 0 :(得分:0)
您是否使用Puppetlab's rsync module?
根据实现副本的方式,可以使用 if 语句检查文件是否在路径中(如果不在路径中),然后运行副本。
如果您正在使用 exec ,则可以使用'onlyif',您可以编写将返回布尔值的powershell或* nix命令,如果布尔值为false,则exec不会为运行
答案 1 :(得分:0)
我“解决”了,我每次都将msi文件复制到C:\ Windows \ Temp,稍后我将尝试更好地解决它。
答案 2 :(得分:0)
这当然不是做事情的“木偶”方法。 Puppet是一种声明性语言,因此它试图将服务器保持在特定状态。这不是编排工具,这就是您要在此处执行的操作。
也就是说,我认为解决这个问题的唯一方法是在主机上设置一个事实变量。在清单应用第二遍之前,清单将返回。该文件,您将要在“删除项目”命令之后添加。我认为即使在Windows上,该文件也可以简单地为“ MY_FILE_HAS_BEEN_APPLIED = true”。之后,只需在清单中放置一些条件逻辑,例如“ if($ facts ['MY_FILE_HAS_BEEN_APPLIED']!= true){一切都在这里}“,那么您就可以进行了。
Happy!
答案 3 :(得分:0)
我建议您保持节点清洁安装介质。您可以使用Chocolatey Puppet模块并部署自己的内部nuget服务器。也许Puppet已经支持带有 url 的文件资源。
答案 4 :(得分:0)
我认为您可以使用transition
module解决此问题。像这样:
transition { 'install media':
resource => File['C:/test.msi'],
attributes => {
'ensure' => 'present',
},
prior_to => [
Package['TEST APP NAME'],
],
}
file { 'C:/test.msi':
ensure => 'absent',
source => "puppet:///modules/test_msi/test.msi",
}
package { 'TEST APP NAME':
ensure => 'installed',
provider => 'windows',
source => "c:/test.msi",
require => File['C:/test.msi'],
}