最近工作中需要统一管理一批Linux和Windows机器,实现应用的自动化部署。刚开始直接使用的ssh登录到目标机器进行部署,Linux机器上面没什么问题,但是Windows上面需要提前安装并配置好ssh server。当时选用freesshd作为ssh server,虽然成功实现了自动化,但是因为freesshd已经很久没更新了,不符合公司的安全规范,所以就重新调研,最后选择了Ansible。
Ansible从1.7+版本之后提供了对Windows机器的支持,而且管理方式和管理Linux机器大同小异,这一点非常棒。不过不同的是,与Linux机器通信是采用的ssh,而与Windows的通信方式则采用了Windows机器自带的powershell。因此在Windows机器上只需完成很少的配置即可使用Ansible进行管理。
Ansible可用于管理Windows集群,不过管理节点需要部署在Linux机器上,而且需要预装python winrm模块。同时,Windows机器上的powershell版本需要满足3.0+,且Management Framework也需要满足3.0+版本。
Windows机器配置
Windows机器需要完成如下几步简单配置才能实现与管理节点通信。
启用Administrator账户
要想使用Ansible管理windows主机,需要使用Administrator账户进行登录。
默认情况下,windows系统是不允许使用Administrator管理员账户进行登录的,在开机登录界面也将Administrator账户隐藏了。我们需要启用Administrator账户,如果已经可以使用Administrator进行登录,则跳过这一步。
我们从如下路径进行配置:计算机 –> 管理 –> 系统工具 –> 本地用户和组 –> 用户 –> Administrator,双击然后我们可以看到如下界面。
取消”账户已禁用”选项,应用。
然后我们再右键Administrator,为该账户设置密码。完成之后重启即可使用Administrator账户进行登录了。
安装Microsoft .NET Framework 4
下载.Net Framework 4到本地进行安装。
升级powershell版本为3.0+
我们首先在powershell中运行get-host
命令查看powershell版本,win7默认安装的powershell为2.0版本,我们需要升级到3.0+版本。
下载安装Windows Management Framework 3.0,这里选择Windows6.1-KB2506143-x64.msu下载安装。安装完成之后,重启系统,之后查看powershell版本会发现已经更新到了3.0版本。
配置winrm服务
Windows上winrm服务默认是未启用的,使用如下命令可以查看状态。
> winrm enumerate winrm/config/listener
使用如下命令配置winrm服务
> winrm quickconfig
> winrm set winrm/config/service/auth '@{Basic="true"}'
> winrm set winrm/config/service '@{AllowUnencrypted="true"}'
至此,windows主机的配置就完成了,接下来我们配置linux管理节点进行验证。
Linux管理节点配置
首先参考前一篇文章安装好ansible。
然后需要使用pip安装pywinrm模块。如果没有安装pip,则先参考前面的文章安装并配置pip。
$ pip install "pywinrm>=0.2.2"
然后我们在/etc/ansible/hosts文件中增加windows主机的配置信息,如下:
[win1]
192.168.1.7 ansible_ssh_user="Administrator" ansible_ssh_pass="admin123" ansible_ssh_port=5985 ansible_connection="winrm" ansible_winrm_server_cert_validation=ignore
然后使用如下命令进行验证,我们看到,此时可以使用win_ping模块连到之前配置的windows主机上了。
$ ansible win1 -m win_ping
192.168.1.7 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
Windows下可用模块
Windows下的可用模块并没有linux下那么多,不过常用的功能已经有了,例如:
#测试联通性
$ ansible win1 -m win_ping
192.168.1.7 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
#拷贝文件
$ ansible win1 -m win_copy -a 'src=/etc/passwd dest=C:\'
192.168.1.7 | SUCCESS => {
"changed": true,
"checksum": "395a02d7cd0aa830be63b4bbc6d2ee082bb14934",
"dest": "'C:\\passwd'",
"failed": false,
"operation": "file_copy",
"original_basename": "passwd",
"size": 1150,
"src": "/etc/passwd"
}
#创建删除文件/目录
$ ansible win1 -m win_file -a "path=C:\passwd state=absent"
192.168.1.7 | SUCCESS => {
"changed": true,
"failed": false
}
Windows下更多的可用模块可以参考官方文档。