Windows下Ansible工作原理
Ansible 从 1.7+ 版本开始支持 Windows,但前提是管理机必须为 Linux 系统,远程主机的通信方式也由 SSH 变更为 PowerShell,基于 Kerberos 认证方式,同时管理机必须预安装Python 的 Winrm 模块,方可和远程 Windows 主机正常通信,但 PowerShell 需 3.0+ 版本且 Management Framework 3.0+
版本,实测 Windows 7 SP1
和Windows Server 2008 R2
及以上版本系统经简单配置可正常与 Ansible 通信。简单总结如下:
- 管理机必须为 Linux系统且需预安装 Python Winrm 模块
- 底层通信基于 PowerShell,认证基于 Kerberos
- 远程主机 PowerShell 版本为3.0+,Management Framework 版本为3.0+。
如上条件满足后,方可正常和Ansible通信。
系统介绍
- 管理主机: 172.16.8.247 操作系统: Ubuntu16.04
- 被控主机: 172.16.11.176 操作系统: Windows2008_R2_64
配置管理主机
安装 winrm 模块
|
|
动态目录的支持
如果 windows 主机是通过 活动目录的管理方式,管理机和被管理机基于 kerbero
认证,需要安装 python-kerbero
和 MIT krb5
依赖库
|
|
配置 Kerberos,在/etc/krb5.conf
添加下面配置
验证域账号认证
配置 inventory 主机信息和group_vars/windows.yml
变量信息
- inventory
|
|
- group_vars
|
|
这里的 ssh_port 不是真正的SSH协议的端口
被控主机 (Windows2008_R2_64)
和 Linux 发版版稍有区别,远程主机为 Windows 需预先如下配置
- 安装Framework 3.0+
- 设置PowerShell本地脚本运行权限为remotesigned
- 升级PowerShell至3.0+
- 自动设置Windows远端管理,英文全称WS-Management(WinRM)
安装 Framework 3.0+
如果系统已经安装可以忽略
设置 PowerShell 本地脚本运行权限为 remotesigned
Windows 系统默认不允许非 Adminitor 外的普通用户执行 SP 脚本,即使是管理员,如下开放 SP 脚本执行权限。
- 在 cmd 中执行 regedit.exe 打开注册表,在
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
新建字符串值名为ExecutionPolicy
,值为remotesigned
或者,打开 PowerShell 执行命令:set-executionpolicy -executionpolicy unrestricted
这里共4种权限:
- Restricted—默认的设置, 不允许任何script运行;
- AllSigned—只能运行经过数字证书签名的script;
- RemoteSigned—运行本地的script不需要数字签名,但是运行从网络上下载的script就必须要有数字签名;
- Unrestricted—允许所有的script运行。
升级 powershell至3.0+
PowerShell 3.0+ ``需基于
Windows 7 Sp1安装,Windows7 系统 Sp1 补丁升级请参考 http://windows.microsoft.com/installwindows7sp1。
Window 7 和 Windows Server 2008 R2
默认安装的有 PowerShell,但版本号一般为2.0
版本,所以我们需升级至3.0+,如下图中数字1部分表示PowerShell版本过低需3.0+版本,数字2部分表示当前PowerShell版本为2.0
- 查询 powershell 版本1234//在cmd中执行命令进入powershellpowershell// 检查powershell版本Get-Host
- 升级 powershell
选择使用 powershell 执行ansible-devel\examples\scripts\upgrade_to_ps3
脚本,执行后重启服务器,再次检查 powershell 版本。
- 设置Windows远端管理(WS-Management,WinRM)
选择使用 powershell 执行ansible-devel\examples\scripts\ConfigureRemotingForAnsible.ps1
脚本,执行结果没有返回值即为正常。如执行出现“由于此计算机上的网络连接类型之一设置为公用,因此 WinRM 防火墙例外将不运行”类似报错,请在 PowerShell 中执行命令 Enable-PSRemoting – SkipNetworkProfileCheck –Force 尝试解决。
验证配置
- 验证连接
|
|
- 在 linux 控制主机上执行命令
|
|
|
|
windows 下可用的模块
与 linux 系统相比, windows 下可以使用的模块就很少了,下面是常用的一些模块
- scripts,raw,slurp,setup模块在Windows 下可正常使用
- win_acl (E) —设置文件/目录属主属组权限
- win_copy—拷贝文件到远程Windows主机
- win_file —创建,删除文件或目录
- win_lineinfile—匹配替换文件内容
- win_package (E) —安装/卸载本地或网络软件包
- win_ping —Windows系统下的ping模块,常用来测试主机是否存活
- win_service—管理Windows Services服务
- win_user —管理Windows本地用户
更多模块介绍可以参考 ansible官网模块页面
windows ansible 模块实践
传输文件到指定目录
|
|
删除指定文件
|
|
执行远程脚本
|
|
用户管理
|
|
playbook
- copy 文件
|
|
- 执行命令
|
|