Puppet 无法在 C:\windows\system32 文件夹中创建文件
Puppet is not able to create files in C:\windows\system32 folder
我正在尝试创建一个 .ssh 文件夹,然后将 id_rsa 和 known_hosts 文件添加到 windows 2016 服务器的 .ssh 文件夹中。此文件夹需要进入任何手动(或作为服务)运行s puppet 的用户。为了完成这项工作,我编写了一个自定义事实 $::user_profile_directory 来表示主目录 (%userprofile%)。该方法对所有用户都完全适用,除非 puppet 运行s 作为服务。
当 puppet 运行s 作为服务时,它会在 "c:/windows/system32/config/systemprofile" 文件夹中创建 .ssh 文件夹,但不会在创建的 .ssh 文件夹中创建文件(id_rsa 文件known_hosts 文件)。如果 运行 puppet 服务与任何其他用户一样,则不会发生这种情况。
Puppet 也没有在日志中显示任何错误,而是说内容已更改为特定的 md5 和哈希。但是如果我使用资源管理器手动检查,.ssh 文件夹不包含任何文件。
此外,如果我手动将文件放入 c:/windows/system32/config/systemprofile/.ssh 文件夹,它会更正文件的权限。我不明白,如果它能够更正文件的权限(如果存在),那么为什么它无法创建文件。
这是我的简单木偶代码:
$user_home = $::user_profile_directory
file { "${user_home}/.ssh":
ensure => 'directory',
#owner => $user_name,
group => 'Administrators',
mode => '0700'
} ->
file { "${user_home}/.ssh/id_rsa":
ensure => 'file',
content => hiera('vester::vester_private_key'),
#owner => $user_name,
group => 'Administrators',
mode => '0600'
} ->
file { "${user_home}/.ssh/known_hosts":
ensure => 'file',
source => 'puppet:///modules/vester/known_hosts',
source_permissions => 'ignore',
#owner => $user_name,
#group => 'Administrators',
#mode => '0660'
}
当人偶 运行 作为服务时:
${user_home} 是 c:/windows/system32/config/systemprofile
当 puppet 运行s 作为其他用户时(假设是 vagrant):
${user_home} 是 c:/users/vagrant
生成 $::user_home 事实的因子代码:
Facter.add('user_profile_directory') do
confine :osfamily => :windows
setcode do
ENV['USERPROFILE']
end
end
编辑 1: 刚刚发现,我可以创建文件夹,但无法在 "C:/windows/system32" 下的任何 folders/subfolders 中创建文件。如何使用 puppet 在 system32 下的自定义文件夹中创建文件?
编辑 2: 刚刚想到,即使 $::user_profile_directory 正在返回
c:/windows/system32/config/systemprofile
我的所有文件都放在
下
c:/windows/syswow64/config/systemprofile
Puppet 32 位客户端安装在我的 64 位 Windows 2016 服务器上。
文件实际上正在创建,但不是
c:/windows/system32/config/systemprofile/.ssh
文件是在
中创建的
c:/windows/syswow64/config/systemprofile/.ssh
我的人偶客户端的文件夹。
%windir%\System32
目录是为 64 位 Windows 上的 64 位应用程序保留的。大多数 DLL 文件名在创建 64 位版本的 DLL 时没有更改,因此 32 位版本的 DLL 存储在不同的目录中。 WOW64 通过使用文件系统重定向器隐藏了这种差异。
在大多数情况下,每当 32 位应用程序尝试访问 %windir%\System32
、%windir%\lastgood\system32
或 `%windir%\regedit.exe 时,访问将被重定向到架构-具体路径。
奇怪的是,尽管文件是在 c:/windows/syswow64/config/systemprofile/.ssh
文件夹中创建的,但事件查看器中的 puppet 日志显示文件已在 c:/windows/system32/config/systemprofile/.ssh
中成功创建。发生这种情况是因为 puppet 32 位客户端不知道 windows.
中的秘密重定向
我的解决方法是删除 32 位 puppet 客户端并安装回 64 位 puppet 客户端,因为我的一个 puppet-modules(puppetlabs/vsrepo) 试图从 c:/windows/system32/config/systemprofile/.ssh
文件夹,因为它在后台使用 64 位 git.exe 客户端。
More about the WOW64 secret redirection in Microsoft documentation here
我正在尝试创建一个 .ssh 文件夹,然后将 id_rsa 和 known_hosts 文件添加到 windows 2016 服务器的 .ssh 文件夹中。此文件夹需要进入任何手动(或作为服务)运行s puppet 的用户。为了完成这项工作,我编写了一个自定义事实 $::user_profile_directory 来表示主目录 (%userprofile%)。该方法对所有用户都完全适用,除非 puppet 运行s 作为服务。
当 puppet 运行s 作为服务时,它会在 "c:/windows/system32/config/systemprofile" 文件夹中创建 .ssh 文件夹,但不会在创建的 .ssh 文件夹中创建文件(id_rsa 文件known_hosts 文件)。如果 运行 puppet 服务与任何其他用户一样,则不会发生这种情况。
Puppet 也没有在日志中显示任何错误,而是说内容已更改为特定的 md5 和哈希。但是如果我使用资源管理器手动检查,.ssh 文件夹不包含任何文件。
此外,如果我手动将文件放入 c:/windows/system32/config/systemprofile/.ssh 文件夹,它会更正文件的权限。我不明白,如果它能够更正文件的权限(如果存在),那么为什么它无法创建文件。 这是我的简单木偶代码:
$user_home = $::user_profile_directory
file { "${user_home}/.ssh":
ensure => 'directory',
#owner => $user_name,
group => 'Administrators',
mode => '0700'
} ->
file { "${user_home}/.ssh/id_rsa":
ensure => 'file',
content => hiera('vester::vester_private_key'),
#owner => $user_name,
group => 'Administrators',
mode => '0600'
} ->
file { "${user_home}/.ssh/known_hosts":
ensure => 'file',
source => 'puppet:///modules/vester/known_hosts',
source_permissions => 'ignore',
#owner => $user_name,
#group => 'Administrators',
#mode => '0660'
}
当人偶 运行 作为服务时: ${user_home} 是 c:/windows/system32/config/systemprofile
当 puppet 运行s 作为其他用户时(假设是 vagrant): ${user_home} 是 c:/users/vagrant
生成 $::user_home 事实的因子代码:
Facter.add('user_profile_directory') do
confine :osfamily => :windows
setcode do
ENV['USERPROFILE']
end
end
编辑 1: 刚刚发现,我可以创建文件夹,但无法在 "C:/windows/system32" 下的任何 folders/subfolders 中创建文件。如何使用 puppet 在 system32 下的自定义文件夹中创建文件?
编辑 2: 刚刚想到,即使 $::user_profile_directory 正在返回
c:/windows/system32/config/systemprofile
我的所有文件都放在
下c:/windows/syswow64/config/systemprofile
Puppet 32 位客户端安装在我的 64 位 Windows 2016 服务器上。 文件实际上正在创建,但不是
c:/windows/system32/config/systemprofile/.ssh
文件是在
中创建的c:/windows/syswow64/config/systemprofile/.ssh
我的人偶客户端的文件夹。
%windir%\System32
目录是为 64 位 Windows 上的 64 位应用程序保留的。大多数 DLL 文件名在创建 64 位版本的 DLL 时没有更改,因此 32 位版本的 DLL 存储在不同的目录中。 WOW64 通过使用文件系统重定向器隐藏了这种差异。
在大多数情况下,每当 32 位应用程序尝试访问 %windir%\System32
、%windir%\lastgood\system32
或 `%windir%\regedit.exe 时,访问将被重定向到架构-具体路径。
奇怪的是,尽管文件是在 c:/windows/syswow64/config/systemprofile/.ssh
文件夹中创建的,但事件查看器中的 puppet 日志显示文件已在 c:/windows/system32/config/systemprofile/.ssh
中成功创建。发生这种情况是因为 puppet 32 位客户端不知道 windows.
我的解决方法是删除 32 位 puppet 客户端并安装回 64 位 puppet 客户端,因为我的一个 puppet-modules(puppetlabs/vsrepo) 试图从 c:/windows/system32/config/systemprofile/.ssh
文件夹,因为它在后台使用 64 位 git.exe 客户端。
More about the WOW64 secret redirection in Microsoft documentation here