Puppet 在不触发更改通知的情况下下载文件
Puppet download a file without triggering a change notification
我遇到了一个傀儡难题。大多数从网络下载文件的资源,如 wget 或 remote_file,依赖于以下两种情况之一来验证是否需要更新文件:来自服务器的 Last-Modified header,或者校验和。如果您想确保始终安装最新版本的文件,则校验和不实用,因为您每次都需要更新 puppet master 中的校验和,这正是我打算避免的。 Last-Modified header 另一方面,如果您从中下载文件的服务器不分发文件,则这些文件是不可行的。另一方面,旧的 file-resource 会支持 dowload-and-compare,但不幸的是不支持身份验证,因此我们也不能在我们的案例中使用它。
服务器分发的是仅包含实际文件的 md5 校验和的小文件。所以要走的路是下载校验和,将其存储在本地,然后在每个木偶上 运行 下载这几个字节,将它们与存储的内容进行比较,如果不同则下载大文件。
这不是太复杂,所以我写了一个模块来概括操作。该模块工作得很好,除了它有一个大问题:它总是 发出更改通知。如果我调用该模块并订阅其他步骤,我想要的是在 big 文件需要下载时发出的通知。然而,为此我需要先下载小文件,这足以让 puppet 考虑状态改变并通知订阅者,即使结果是下载大文件是不必要的。我也试过用exec下载文件,但是我也无法控制它是否通知,只有它执行或不执行,执行它必须...
我需要的是抑制该通知,或者一种在不触发该通知的情况下下载文件的方法,但现在我开始认为这是不可能的。有人知道如何解决这个难题吗?
据我所知,您所实现的是 puppet 文件资源默认执行的操作,例如
file{ '/var/big.txt.gz:
ensure => file,
source => 'https://www.example..org/big.txt.gz',
}
Puppet determines if file content is synchronized by computing a checksum for the local file and comparing it against the checksum_value parameter. If the checksum_value parameter is not specified for puppet and file sources, Puppet computes a checksum based on its Puppet[:digest_algorithm]. For http(s) sources, Puppet uses the first HTTP header it recognizes out of the following list: X-Checksum-Sha256, X-Checksum-Sha1, X-Checksum-Md5 or Content-MD5. If the server response does not include one of these headers, Puppet defaults to using the Last-Modified header. Puppet updates the local file if the header is newer than the modified time (mtime) of the local file.
https://puppet.com/docs/puppet/7/types/file.html#file-attribute-source
我认为您最好编写一个 custom type(,即 Ruby 中的 ),而不是尝试通过内置 Puppet 来实现它资源类型和 Puppet DSL。您可以考虑将您的初始尝试作为原型。
如果您必须使用 DSL,那么您应该能够围绕运行摘要下载的 Exec
构建它并通过其检查unless
或onlyif
命令,主文件通过其主命令下载安装。
我遇到了一个傀儡难题。大多数从网络下载文件的资源,如 wget 或 remote_file,依赖于以下两种情况之一来验证是否需要更新文件:来自服务器的 Last-Modified header,或者校验和。如果您想确保始终安装最新版本的文件,则校验和不实用,因为您每次都需要更新 puppet master 中的校验和,这正是我打算避免的。 Last-Modified header 另一方面,如果您从中下载文件的服务器不分发文件,则这些文件是不可行的。另一方面,旧的 file-resource 会支持 dowload-and-compare,但不幸的是不支持身份验证,因此我们也不能在我们的案例中使用它。
服务器分发的是仅包含实际文件的 md5 校验和的小文件。所以要走的路是下载校验和,将其存储在本地,然后在每个木偶上 运行 下载这几个字节,将它们与存储的内容进行比较,如果不同则下载大文件。
这不是太复杂,所以我写了一个模块来概括操作。该模块工作得很好,除了它有一个大问题:它总是 发出更改通知。如果我调用该模块并订阅其他步骤,我想要的是在 big 文件需要下载时发出的通知。然而,为此我需要先下载小文件,这足以让 puppet 考虑状态改变并通知订阅者,即使结果是下载大文件是不必要的。我也试过用exec下载文件,但是我也无法控制它是否通知,只有它执行或不执行,执行它必须...
我需要的是抑制该通知,或者一种在不触发该通知的情况下下载文件的方法,但现在我开始认为这是不可能的。有人知道如何解决这个难题吗?
据我所知,您所实现的是 puppet 文件资源默认执行的操作,例如
file{ '/var/big.txt.gz:
ensure => file,
source => 'https://www.example..org/big.txt.gz',
}
Puppet determines if file content is synchronized by computing a checksum for the local file and comparing it against the checksum_value parameter. If the checksum_value parameter is not specified for puppet and file sources, Puppet computes a checksum based on its Puppet[:digest_algorithm]. For http(s) sources, Puppet uses the first HTTP header it recognizes out of the following list: X-Checksum-Sha256, X-Checksum-Sha1, X-Checksum-Md5 or Content-MD5. If the server response does not include one of these headers, Puppet defaults to using the Last-Modified header. Puppet updates the local file if the header is newer than the modified time (mtime) of the local file.
https://puppet.com/docs/puppet/7/types/file.html#file-attribute-source
我认为您最好编写一个 custom type(,即 Ruby 中的 ),而不是尝试通过内置 Puppet 来实现它资源类型和 Puppet DSL。您可以考虑将您的初始尝试作为原型。
如果您必须使用 DSL,那么您应该能够围绕运行摘要下载的 Exec
构建它并通过其检查unless
或onlyif
命令,主文件通过其主命令下载安装。