环境
- 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
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
网友评论