Ansible管理Windows服务器

环境

  • Ansible Server:CentOS7
  • Windows Server:Windows Server 2012 R2(192.168.xx.xx)

1、Windows Server

1.1 确认Powershell版本

Powershell输入$psversiontable

ansible依赖WinRM管理Windows终端,powershell版本最低为3.0,如低于此版本需要升级powershell,在此不做展开。

Name                           Value                                                                                   
----                           -----                                                                                   
PSVersion                      4.0                                                                                     
WSManStackVersion              3.0                                                                                     
SerializationVersion           1.1.0.1                                                                                 
CLRVersion                     4.0.30319.34209                                                                         
BuildVersion                   6.3.9600.16394                                                                          
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}                                                                    
PSRemotingProtocolVersion      2.2  

1.2 配置ansible脚本

# 创建目录
mkdir c:\ansible
cd c:\ansible
# 下载脚本
wget https://github.com/ansible/ansible/raw/devel/examples/scripts/ConfigureRemotingForAnsible.ps1
# 开启WinRM服务
set-ExecutionPolicy RemoteSigned 
.\ConfigureRemotingForAnsible.ps1 -SkipNetworkProfileCheck

1.3 开启防火墙端口

# 放行5985端口可被访问
netsh advfirewall firewall add rule name="Win-RM-HTTP" dir=in localport=5985 protocol=TCP action=allow

2、Ansible Server

2.1 安装pywinrm

# 安装epel仓库后安装pip,如果有pip可略过
yum install -y epel-release
yum install -y python-pip
# 安装pywinrm
pip install pywinrm
# 配置ansible主机文件
vi /etc/ansible/hosts
# 修改或增加以下配置(YAML格式,注意空格,不可用Tab)
all:
  children:
    windows:
      hosts:
        192.168.xx.xx:
            ansible_user: Administrator
            ansible_password: password #填写服务器密码
            ansible_port: 5985
            ansible_connection: winrm
            ansible_winrm_transport: ntlm  #必须有,不然会报错
            ansible_winrm_server_cert_validation: ignore

在ansible2.0及以后版本,已经将大部分ansible_ssh_xxx属性更改为ansible_xxx

如果Windows服务器为集群,账号密码相同,该如何编写终端文件呢?
引入变量
这里假设我们有11台服务器,其中1台为Hyper-V虚拟机,4台为AD域服务器,6台为exchange服务器,信息如下:

  • Hyper-V:192.168.0.100
  • AD域:192.168.0.1、192.168.0.3、192.168.0.5、 192.168.0.7
  • exchange:192.168.0.10、 192.168.0.11 、192.168.0.21-24
# 注意YAML配置文件,均使用空格进行2位缩进。
all: 
  children:
    kubernetes:
    ……省略
    windows:
      children:
        hyper-v:
          hosts:
            192.168.0.100:
              ansible_user: Administrator
              ansible_password: 密码
              ansible_port: 5985
              ansible_connection: winrm
              ansible_winrm_transport: ntlm
              ansible_winrm_server_cert_validation: ignore
        ad:
          hosts:
            192.168.0.1:
            192.168.0.3:
            192.168.0.5:
            192.168.0.7:
          vars: #此变量仅在ad组生效,故在exchange组仍然需要重新定义一次。
            ansible_user: 域\administrator #把域更换为自己的域名称
            ansible_password: 密码
            ansible_port: 5985
            ansible_connection: winrm
            ansible_winrm_transport: ntlm
            ansible_winrm_server_cert_validation: ignore
        exchange:
          hosts:
            192.168.0.10:
            192.168.0.11:
            192.168.0.[21:24]: #对连续的主机可以简写
          vars:
            ansible_user: 域\administrator
            ansible_password: 密码
            ansible_port: 5985
            ansible_connection: winrm
            ansible_winrm_transport: ntlm
            ansible_winrm_server_cert_validation: ignore

2.2 测试配置

# 测试
ansible windows -m win_ping
# 返回如下信息代表成功
192.168.xx.xx | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

3、踩坑

3.1 plaintext: the specified credentials were rejected by the server

# 返回错误
ansibile windows -m win_ping
192.168.xx.xx | UNREACHABLE! => {
    "changed": false,
    "msg": "plaintext: the specified credentials were rejected by the server",
    "unreachable": true
}
# 解决方法
vi /etc/ansible/hosts
# 编辑主机的配置文件,添加以下字段
ansible_winrm_transport: ntlm

参考资料:https://stackoverflow.com/questions/44183852/ansible-pinging-windows-machine-using-basic-authentication

3.2 Windows返回中文乱码

# 查看IP地址,返回信息中文乱码
ansible windows -m win_command -a 'ipconfig'
# 解决办法
vi /etc/ansible/ansbile.cfg
# 修改为如下样式
#module_lang    = C
#module_set_locale = False

module_lang = zh_CN.UTF-8
module_set_locale = True

实际发现并不能解决乱码问题,后期再研究。


参考文章:

  • 使用Ansible管理Windows:https://wsgzao.github.io/post/ansible-windows/
  • 自动注册,实现自动发现agent并添加监控:https://www.cnblogs.com/zhenglisai/p/6807096.html

你可能感兴趣的:(Ansible管理Windows服务器)