Puppet Windows 包提供程序编码错误
Puppet Windows Package Provider Encoding Error
我有一个 Windows 的 Puppet 清单,用于(除其他外)下载和安装 Python。它曾经工作得很好。现在,每当它尝试处理 MSI 文件时,它都会给我与字符串编码相关的奇怪错误。清单的相关部分是:
(注意:我正在使用 pget 下载 MSI。)
# Prepare to download things
$downloads = "C:\puppet-downloads"
file { $downloads:
ensure => directory
}
Pget {
require => File[$downloads],
target => $downloads,
}
$python = 'python'
$py_version = '2.7.10'
$py_dir = "C:\Python27"
$py_msi = "python-${py_version}.msi"
$py_msi_path = "${downloads}\${py_msi}"
pget {'python-msi':
source => "https://www.python.org/ftp/python/${py_version}/${py_msi}",
}
package {$python:
require => Pget['python-msi'],
provider => 'windows',
source => $py_msi_path,
ensure => $py_version,
}
并且错误输出:
Error: Could not prefetch package provider 'windows': U+2122 to IBM437 in conversion from UTF-16LE to UTF-8 to IBM437
Error: /Package[python]: Could not evaluate: U+2122 to IBM437 in conversion from UTF-16LE to UTF-8 to IBM437
我发现了什么:
- U+2122为商标字符(™)
- 错误的格式来自 Ruby 字符串转换函数,而不是任何 Puppet 特定的格式。
- 即使清单的这一部分单独 运行 也会发生错误。
- puppet apply 的调试输出在开头附近列出了“default_encoding = IBM437”,但我还没有找到更改该设置的任何方法:
Debug: Runtime environment: puppet_version=3.7.5, ruby_version=2.1.5, run_mode=user, default_encoding=IBM437
看起来确实有一张票:https://tickets.puppetlabs.com/browse/PUP-4333
看起来问题是已经安装了不兼容字符的包,它会尝试预取已安装的包:
目前的解决方法(来自票证):
- 运行 "wmic product get name"
- 查找具有非 ascii 字符的字符
- 从注册表中删除外观古怪的字符
运行 chcp 65001
命令提示符会将您的控制台编码更改为 UTF-8。
虽然我不知道这将如何适应您的工作流程。
我的一台基础设施笔记本电脑也遇到了类似的问题,这是唯一一台安装了 Skype™ 7.0 的笔记本电脑。我在注册表中进行了搜索,并从具有 DisplayName 或 ProductName 的每个键中删除了该 TM。有效。但是我备份以防万一。所以我确认你可以检查你安装的程序名称中是否有这个字符,所以你可以在 Windows 注册表中删除。不过要小心。
我有一个 Windows 的 Puppet 清单,用于(除其他外)下载和安装 Python。它曾经工作得很好。现在,每当它尝试处理 MSI 文件时,它都会给我与字符串编码相关的奇怪错误。清单的相关部分是:
(注意:我正在使用 pget 下载 MSI。)
# Prepare to download things
$downloads = "C:\puppet-downloads"
file { $downloads:
ensure => directory
}
Pget {
require => File[$downloads],
target => $downloads,
}
$python = 'python'
$py_version = '2.7.10'
$py_dir = "C:\Python27"
$py_msi = "python-${py_version}.msi"
$py_msi_path = "${downloads}\${py_msi}"
pget {'python-msi':
source => "https://www.python.org/ftp/python/${py_version}/${py_msi}",
}
package {$python:
require => Pget['python-msi'],
provider => 'windows',
source => $py_msi_path,
ensure => $py_version,
}
并且错误输出:
Error: Could not prefetch package provider 'windows': U+2122 to IBM437 in conversion from UTF-16LE to UTF-8 to IBM437
Error: /Package[python]: Could not evaluate: U+2122 to IBM437 in conversion from UTF-16LE to UTF-8 to IBM437
我发现了什么:
- U+2122为商标字符(™)
- 错误的格式来自 Ruby 字符串转换函数,而不是任何 Puppet 特定的格式。
- 即使清单的这一部分单独 运行 也会发生错误。
- puppet apply 的调试输出在开头附近列出了“default_encoding = IBM437”,但我还没有找到更改该设置的任何方法:
Debug: Runtime environment: puppet_version=3.7.5, ruby_version=2.1.5, run_mode=user, default_encoding=IBM437
看起来确实有一张票:https://tickets.puppetlabs.com/browse/PUP-4333
看起来问题是已经安装了不兼容字符的包,它会尝试预取已安装的包:
目前的解决方法(来自票证):
- 运行 "wmic product get name"
- 查找具有非 ascii 字符的字符
- 从注册表中删除外观古怪的字符
运行 chcp 65001
命令提示符会将您的控制台编码更改为 UTF-8。
虽然我不知道这将如何适应您的工作流程。
我的一台基础设施笔记本电脑也遇到了类似的问题,这是唯一一台安装了 Skype™ 7.0 的笔记本电脑。我在注册表中进行了搜索,并从具有 DisplayName 或 ProductName 的每个键中删除了该 TM。有效。但是我备份以防万一。所以我确认你可以检查你安装的程序名称中是否有这个字符,所以你可以在 Windows 注册表中删除。不过要小心。