系统相关
首页 > 系统相关> > ansible与windows主机交互

ansible与windows主机交互

作者:互联网

在和windows server通信前

ansible主机条件

如果使用ansible和windows通信和使用windows模块的话,需要满足以下条件:
1,ansible目前可以在微软的支持或者扩展支持下管理windows版本。ansible可以管理的桌面系统包括win7,8.1,10。server系统包括server 2008,2008 R2, 2012 R2,2016和2019
2,ansible需要PowerShell 3.0和.NET 4.0以上才可以安装上
3,WinRM 监听需要被创建或者激活,详情如下:

注意:这些是ansible连接的基本需求,部分ansible模块需要额外的需求,比如更新版本的操作系统或者PowerShell版本。详情查看官方文档。

powershell & .NET 升级 (暂略)
powershell 查看版本:$PSVersionTable
PS 3.0 会有点bug.

WinRM设置

一旦PowerShell被升级到最新3.0版本,还需要配置WinRM来使得Ansible能够连接主机。WinRM有两个主要的组件来管理与ansible的通信接口。listener和service configuration settings.
脚本ConfigureRemotingForAnsible.ps1可以被用于一些基本设置。这个脚本设置了HTTP&HTTPS的自签名Listener并且是能了服务里的Basic认证选项。

如果使用ConfigureRemotingForAnsible.ps1这个脚本,执行以下脚本:

$url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
$file = "$env:temp\ConfigureRemotingForAnsible.ps1"

(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)

powershell.exe -ExecutionPolicy ByPass -File $file

有两个参数(like -EnableCredSSP and -ForceNewSSLCert)能够在这个脚本中设置,这个脚本的上面有介绍。

这个ConfigureRemotingForAnsible.ps1脚本是用来培训和实验的目的并且不应该用于生产环境, 因为它使能的设置(比如Basic认证)本身就不安全。

WinRM Listener

WinRM监听一个或多个端口的请求,每个端口必须有一个listener创建和配置。
可以通过以下命令查看WinRM服务listener的运行情况。

winrm enumerate winrm/config/Listener
会有类似如下的输出:

Listener
    Address = *
    Transport = HTTP
    Port = 5985
    Hostname
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint
    ListeningOn = 10.0.2.15, 127.0.0.1, 192.168.56.155, ::1, fe80::5efe:10.0.2.15%6, fe80::5efe:192.168.56.155%8, fe80::
ffff:ffff:fffe%2, fe80::203d:7d97:c2ed:ec78%3, fe80::e8ea:d765:2c69:7756%7

Listener
    Address = *
    Transport = HTTPS
    Port = 5986
    Hostname = SERVER2016
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint = E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE
    ListeningOn = 10.0.2.15, 127.0.0.1, 192.168.56.155, ::1, fe80::5efe:10.0.2.15%6, fe80::5efe:192.168.56.155%8, fe80::
ffff:ffff:fffe%2, fe80::203d:7d97:c2ed:ec78%3, fe80::e8ea:d765:2c69:7756%7

在这个例子中有两个listener被激活,一个是监听HTTP 5985,另一个是HTTPS 5986。里面一些重要的配置选项:

$thumbprint = "E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE"
Get-ChildItem -Path cert:\LocalMachine\My -Recurse | Where-Object { $_.Thumbprint -eq $thumbprint } | Select-Object *

设置WinRM Listener

有三种方法设置WinRM listener:

$selector_set = @{
    Address = "*"
    Transport = "HTTPS"
}
$value_set = @{
    CertificateThumbprint = "E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE"
}

New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_set

powershell其他的命令可以参考:New-WSManInstance.
注:当创建一个HTTPS listener,需要有证书在LocalMachine\My cerificate store里,否则大部分的命令都不会成功。

删除WinRM Listener

注:Keys 是一个字符串数组,所以可以包含不同的值。默认下Transport=Address=包含的值对应着winrm/config/Listeners中的值。

WinRM服务选项

有一系列的选项来配置WINRM服务组件,包含认证选项和内存设置。
使用这个命令来查看服务已配置选项:

winrm get winrm/config/Service
winrm get winrm/config/Winrs

然后会有一些类似下面的输出:

Service
    RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)
    MaxConcurrentOperations = 4294967295
    MaxConcurrentOperationsPerUser = 1500
    EnumerationTimeoutms = 240000
    MaxConnections = 300
    MaxPacketRetrievalTimeSeconds = 120
    AllowUnencrypted = false
    Auth
        Basic = true
        Kerberos = true
        Negotiate = true
        Certificate = true
        CredSSP = true
        CbtHardeningLevel = Relaxed
    DefaultPorts
        HTTP = 5985
        HTTPS = 5986
    IPv4Filter = *
    IPv6Filter = *
    EnableCompatibilityHttpListener = false
    EnableCompatibilityHttpsListener = false
    CertificateThumbprint
    AllowRemoteAccess = true

Winrs
    AllowRemoteShellAccess = true
    IdleTimeout = 7200000
    MaxConcurrentUsers = 2147483647
    MaxShellRunTime = 2147483647
    MaxProcessesPerShell = 2147483647
    MaxMemoryPerShellMB = 2147483647
    MaxShellsPerUser = 2147483647

虽然这些选项一般都很少更改,但是有一少部分能够很简单的影响winRM的运行并且有助于理解。
一些重要的选项:

# 替换winrm/config/Service后面的路径{path}
Set-Item -Path WSMan:\localhost\Service\{path} -Value "value here"

# 例如, 启动Service\Auth\CbtHardeningLevel
Set-Item -Path WSMan:\localhost\Service\Auth\CbtHardeningLevel -Value Strict

PowerShell下修改winrs的值:

# 替换winrm/config/Winrs后面的路径{path}
Set-Item -Path WSMan:\localhost\Shell\{path} -Value "value here"

# 例如,启动Winrs\MaxShellRunTime
Set-Item -Path WSMan:\localhost\Shell\MaxShellRunTime -Value 2147483647

注:如果主机运行在域环境下的时候,一些选项被设置在组策略对象下,主机不能自己改动。如果设置是由组策略下发的,那么它会在value旁边有[Source="GPO"]的提示。


Windows SSH设置

Ansible 2.8为Windows主机添加了实验性的SSH连接.
注:使用这个特性需要后果自负。在WINDOWS下使用SSH只是实验性的,该功能在以后版本中可能不是向下兼容的。服务器端的组件是否能使用取决于ansible的版本。

安装Win32-OpenSSH

第一步是安装Win32-OpenSSH到windows主机上。微软提供的安装方式对ansible来说太旧了。应该采用以下方式:

- name: install the Win32-OpenSSH service
  win_chocolatey:
    name: openssh
    package_params: /SSHServerFeature
    state: present
# 需要先把role下载下来
# main.yml
- name: install Win32-OpenSSH service
  hosts: windows
  gather_facts: no
  roles:
  - role: jborean93.win_openssh
    opt_openssh_setup_service: True

注:Win32-OpenSSH仍然是一个持续更新改进的测试产品,如果你使用SSH作为和windows的交互选项,强烈建议你使用以上三种方式来安装最新的版本。

配置Win32-OpenSSH

默认Win32-OpenSSH会使用cmd.exe作为shell,如果使用其他shell,用ansible任务去定义注册表设置:

- name: set the default shell to PowerShell
  win_regedit:
    path: HKLM:\SOFTWARE\OpenSSH
    name: DefaultShell
    data: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    type: string
    state: present

# Or revert the settings back to the default, cmd
- name: set the default shell to cmd
  win_regedit:
    path: HKLM:\SOFTWARE\OpenSSH
    name: DefaultShell
    state: absent

Win32-OpenSSH认证

Win32-OpenSSH认证方式和linux上的相似。你可以使用纯文本的密码或者SSH公钥,把公钥添加用户文件目录下.ssh文件夹的authorized_key中。然后在sshd_config文件中配置SSH服务,和在Linux中使用方式一样。
当使用SSH密钥验证时,远程会话没有用户的证书并且在尝试连接网络资源时会失败,这个是已知的多跳或者credential delegation问题。有两种解决方式:

配置ansible端

使用ssh和windows交互需要配置两个连接变量:

ansible_shell_type 变量需要和windows主机上的DefaultShell相对应。如果DefaultShell是默认,那就设置为cmd,如果是Powershell就设置成powershell

SSH和windows结合的已知问题

windows上的SSH只是实验环境,下面是一些已知问题:

标签:windows,winrm,WinRM,ansible,HTTPS,OpenSSH,交互
来源: https://www.cnblogs.com/felix-zong/p/14577591.html