Ansible 从1.7+版本开始支持Windows,实测Windows Server 2008 R2及以上版本系统经简单配置可正常与Ansible通信。但需要满足以下几点:
1、管理机必须是linux系统,且按装Python Winrm模块
2、底层通信基于PowerShell,版本为3.0+,Management Framework版本为3.0+
3、远程windows主机开启Winrm服务

  • 被控制主机windows
    1. 安装Framework 3.0+
      下载链接为:http://download.microsoft.com/download/B/A/4/BA4A7E71-2906-4B2D-A0E1-80CF16844F5F/dotNetFx45_Full_x86_x64.exe

2.更改powershell策略为remotesigned
在命令行中输入 start powershell就可启动powershell
通过Get-ExecutionPolicy查看脚本执行策略;通过Set-ExecutionPolicy UnRestricted更改脚本执行策略

3.升级PowerShell至3.0+
Window 7和Windows Server 2008 R2默认安装的有PowerShell,但版本号一般为2.0版本,所以我们需升级至3.0+,Windows PowerShell 3.0使用的是 .netframework 4.0

下载upgrade_to_ps3.ps1,右击使用powershell运行后重启系统

或者使用Ansible 官方提供初始化脚本,脚本主要完成如下操作:
检查最后安装证书的指纹
配置错误处理
检测Power shell版本
检查/启动WimRM服务
确保WinRM运行之后,检查有PS会话配置
确保有SSL监听
检查基本鉴权
配置防火墙允许WinRM HTTPS链接
本地测试通过网络方式连接是否正常

注意:如果提示系统中禁止执行脚本,可以在Powershell 命令行界面输入 set-ExecutionPolicy RemoteSigned 然后输入Y,在执行脚本就不会报

4.设置Windows远端管理(WS-Management,WinRM)服务
注意以下操作在cmd中执行,而非powershell中,winrm 服务默认都是未启用的状态:
winrm quickconfig
查看winrm service listener:winrm e winrm/config/listener
配置auth 为true(默认为false):winrm set winrm/config/service/auth @{Basic="true"} 或者winrm set winrm/config/service/auth '@{Basic="true"} '
配置允许非加密方式:winrm set winrm/config/service @{AllowUnencrypted="true"}

至此windows远端管理(WS-Management,WinRM)服务的环境配置完成!

  • 控制主机linux:
    如果没有安装pip,先安装对应于你的Python版本的pip:
    [root@Super svn]# easy_install pip    #wget https://bootstrap.pypa.io/get-pip.py;python get-pip.py
    Installed /usr/lib/python2.7/site-packages/pip-10.0.1-py2.7.egg
    Processing dependencies for pip
    Finished processing dependencies for pip
    [root@Super svn]# 
    [root@Super svn]# pip install paramiko PyYAML Jinja2 httplib2 six  #pip install pywinrm paramiko PyYAML Jinja2 httplib2 six
    [root@Super 118920]# tail -2 /etc/ansible/hosts 
    [windows]
    10.15.97.100 ansible_ssh_user="administrator" ansible_ssh_pass="123123" ansible_ssh_port=5985 ansible_connection="winrm" ansible_winrm_server_cert_validation=ignore
    [root@Super ~]#

防火墙需放行5989、5986

  • 连通性
    win_ping:Windows系统下的ping模块,常用来测试主机是否存活。
[root@Super ~]# ansible 10.15.97.100 -m win_ping
10.15.97.100 | SUCCESS => {
    "changed": false,"ping": "pong"
}
[root@Super ~]#

* 远程执行命令

远程执行命令分为远程执行windows 原生自有命令通过raw 模块,如:"ipconfig "
远程执行ansible的win_command模块也可以执行命令,即ansible的扩展命令如"whoami"
默认是乱码,需要修改winrm模块文件

[root@Super ~]# cp /usr/lib/python2.7/site-packages/winrm/protocol.py{,.20180718bak}
[root@Super ~]# sed -i "s#tdout_buffer.append(stdout)#tdout_buffer.append(stdout.decode('gbk').encode('utf-8'))#g" /usr/lib/python2.7/site-packages/winrm/protocol.py
[root@Super ~]# sed -i "s#stderr_buffer.append(stderr)#stderr_buffer.append(stderr.decode('gbk').encode('utf-8'))#g" /usr/lib/python2.7/site-packages/winrm/protocol.py
[root@Super ~]#
  • 获取ip地址
[root@Super ~]# ansible windows -m raw -a "ipconfig"
10.15.97.100 | SUCCESS | rc=0 >>

Windows IP Configuration

Ethernet adapter 本地连接:

   Connection-specific DNS Suffix  . : 
   Link-local IPv6 Address . . . . . : fe80::e9ce:231:8bc6:45ea%11
   IPv4 Address. . . . . . . . . . . : 10.15.97.100
   subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 10.15.97.254

Tunnel adapter isatap.{BB164424-6017-46EB-978A-5E7CFDF80A14}:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . : 

[root@Super ~]#
  • 获取身份
[root@Super ~]# ansible windows -m win_command -a "whoami"
10.15.97.100 | SUCCESS | rc=0 >>
wthost\administrator

[root@Super ~]#
  • 移动文件
[root@Super ~]# ansible windows -m raw -a "cmd /c 'move /y D:\Ansible\product\DBFPlus.exe D:\Ansible\back\'"
ERROR! Failed at splitting arguments,either an unbalanced jinja2 block or quotes: cmd /c 'move /y D:\Ansible\product\DBFPlus.exe D:\Ansible\back\'
[root@Super ~]# ansible windows -m raw -a "cmd /c 'move /y D:\Ansible\product\DBFPlus.exe D:\Ansible\back\DBFPlus.exe'"
10.15.97.100 | SUCCESS | rc=0 >>
        1 file(s) moved.

[root@Super ~]#

移动文件目标端也需要制定到文件,而不能只制定到所在目录位置

[root@Super ~]# ansible windows -m raw -a "cmd /c 'move /y D:\Ansible\product\ D:\Ansible\back\'"
ERROR! Failed at splitting arguments,either an unbalanced jinja2 block or quotes: cmd /c 'move /y D:\Ansible\product\ D:\Ansible\back\'
[root@Super ~]# ansible windows -m raw -a "cmd /c 'move /y D:\Ansible\product\ D:\Ansible\back'"
10.15.97.100 | Failed | rc=1 >>
The system cannot find the file specified.
non-zero return code

[root@Super ~]# ansible windows -m raw -a "cmd /c 'move /y D:\Ansible\product D:\Ansible\back\'"
ERROR! Failed at splitting arguments,either an unbalanced jinja2 block or quotes: cmd /c 'move /y D:\Ansible\product D:\Ansible\back\'
[root@Super ~]# ansible windows -m raw -a "cmd /c 'move /y D:\Ansible\product D:\Ansible\back'"
10.15.97.100 | SUCCESS | rc=0 >>
        1 dir(s) moved.

[root@Super ~]#

移动文件夹源端和目标端目录都不能带反斜杠/。且将源的整个目录移到目的端目录里。

  • 创建文件夹
[root@Super ~]# ansible windows -m raw -a "md d:\Ansible\justin"
10.15.97.100 | SUCCESS | rc=0 >>

    Directory: D:\Ansible

Mode                LastWriteTime     Length Name                              
----                -------------     ------ ----                              
d----         2018/7/18     20:13            justin                            

[root@Super ~]#
  • 删除文件或目录
[root@Super ~]# ansible windows -m win_file -a "path=d:\Ansible\justin state=absent"
10.15.97.100 | SUCCESS => {
    "changed": true
}
[root@Super ~]#
  • 结束某程序
[root@Super ~]# ansible windows -m raw -a "taskkill /F /IM snmp.exe /T"
10.15.97.100 | SUCCESS | rc=0 >>
SUCCESS: The process with PID 1412 (child process of PID 548) has been terminated.

[root@Super ~]#
  • 文件传输
[root@Super ~]# ansible windows -m win_copy -a 'src=/app/svn/127_Client/118919/zjcfg.zip dest=D:\soft\'
10.15.97.100 | SUCCESS => {
    "changed": true,"checksum": "d797ae640e37a1de6bb02b1e7fb435d7919effec","dest": "'D:\\soft\\zjcfg.zip'","operation": "file_copy","original_basename": "zjcfg.zip","size": 131374,"src": "/app/svn/127_Client/118919/zjcfg.zip"
}
[root@Super ~]# ansible windows -m win_copy -a 'src=/app/svn/127_Client/118919/zjcfg.zip dest=D:\ansible\'
10.15.97.100 | Failed! => {
    "changed": false,"dest": "'D:\u0007nsible\\zjcfg.zip'","msg": "Get-AnsibleParam: Parameter 'dest' has an invalid path 'D:\u0007nsible\\' specified.","src": "/app/svn/127_Client/118919/zjcfg.zip"
}
[root@Super ~]# ansible windows -m win_copy -a 'src=/app/svn/127_Client/118919/zjcfg.zip dest=D:\'
10.15.97.100 | SUCCESS => {
    "changed": true,"dest": "'D:\\zjcfg.zip'","src": "/app/svn/127_Client/118919/zjcfg.zip"
}
[root@Super ~]# ansible windows -m win_copy -a 'src=/app/svn/127_Client/118919/ dest=D:\'
10.15.97.100 | SUCCESS => {
    "changed": true,"dest": "D:\\","operation": "folder_copy","src": "/app/svn/127_Client/118919/"
}
[root@Super ~]#

目标路径不能含关键词ansible,否则提示无效路径,源使用反斜杠结果将递归传输目录下所有文件,源不一反斜杠结尾将整个目录传输到目标目录下。

  • 创建用户
[root@Super ~]# ansible windows -m win_user -a "name=justin passwd=51cto groups=Administrators"
10.15.97.100 | SUCCESS => {
    "account_disabled": false,"account_locked": false,"changed": true,"description": "","fullname": "justin","groups": [
        {
            "name": "Administrators","path": "WinNT://WORKGROUP/WTHOST/Administrators"
        }
    ],"name": "justin","password_expired": true,"password_never_expires": false,"path": "WinNT://WORKGROUP/WTHOST/justin","sid": "S-1-5-21-4260034264-4268704002-684640490-1001","state": "present","user_cannot_change_password": false
}
[root@Super ~]#
  • 执行windows下的bat
[root@Super ~]# ansible windows -m win_command -a "chdir=D:\ .\xcopy.bat"
10.15.97.100 | SUCCESS | rc=0 >>

D:\>md d:\justin 

[root@Super ~]#

先切换到bat所在目录,再执行bat

更多官方windows模块见:官网

【Absible学习】ansible管理windows系统的更多相关文章

  1. 无法使用rm删除一个文件夹中的多个文件夹(3个文件夹除外)

    我正在尝试使用rm删除文件夹中的所有文件夹,除了2和3。但是,命令不起作用,出现以下错误尝试使用转义符,但不会删除文件夹。有什么解决方案吗?

  2. 如何从playbook更新Ansible库存文件

    我有一个剧本,通过它我可以在GCP上成功创建VM,但我不知道如何检索它的私有ip并通过剧本将其添加到库存文件中。我有什么办法可以做到吗?在此方面的任何帮助都将不胜感激

  3. 如何在set_fact ansible中打印最后一个递增的值?

    我在剧本中输入一个文件,如果它在文件中找到诸如open或allowed之类的关键字,我会要求它将变量dbsuccesscount增加到1。增量成功地工作如下然而,我想打印dbsuccesscount中的最后一个值,即107。当我在下面跑时,它不起作用调试:var:dbsuccesscount

  4. windows – 如何在node.js中监听剪贴板事件?

    我希望能够在node.js中监听剪贴板事件.我已经在java中使用了Windows键盘钩子……所以我已经对这个主题有点熟悉了.当我使用Ubuntu10.10作为我的主要操作系统时,我对UbuntuDesktop解决方案最感兴趣.有什么想法吗?非常感谢提前,约亨我建议您查看node-clipboardmodule并使用回调不断监听剪贴板的更改.就像是:

  5. windows-installer – 无提示Windows Installer安装程序,无需自动重启

    目前我有一个MSI执行重大升级,它发布为:我的问题是关于特定属性REBOOT=ReallySuppress:这是否意味着它不会重新启动系统,但会在用户手动重启系统时进行适当的更改?或者它会忽略那些需要重启系统的东西?

  6. 为Windows编写跨平台(32位和64位兼容)程序(如.NET中的AnyCPU)

    Windows最初不了解.NET框架,因此WindowsPELoader无法在PE头中查找CLR头的任何额外功能;必须通过某种内核模式扩展添加此功能.但.NET框架似乎没有安装这样的东西……这显然是可能的,这让我想尝试编写一个原生的跨平台EXE……编辑:作为旁注,请考虑如何在64位WindowsPE环境中运行32位可执行文件…

  7. windows – 为什么我的WINVER 4 .exe在W98SE下运行?

    我需要为运行Windows98SE的遗留系统构建我的应用程序.(系统涉及特殊硬件,不可能进行操作系统升级.)我的开发环境是VisualC;该应用程序是vanillaANSIC,结果是WIN32控制台应用程序.我知道在VisualStudio2008中对旧版Windows的支持完全被删除了,所以我使用的是VisualStudio2005(我在上一代WindowsXP笔记本电脑上仍然使用它).我有条件

  8. 如何使用常规Windows C/C++ API查询进程的线程数

    有没有办法使用标准WindowsC/C++API查询当前为特定进程运行的线程数?

  9. Windows上的可执行模块是否有理想的大小?

    在思考了我所看到的事情后,我留下了这些问题:>使用小的.exe是否有优势,即使应用程序的最终大小都大得多?>如果是这样,开始将应用程序分解为单独的模块的大小是多少?大型可执行文件可能具有较少的共享库,这意味着应用程序可能比使用共享库的应用程序更加占用内存.如果您希望系统具有最小的内存占用,则需要共享库.一个大的exe可能更自包含,这可能使更容易保持稳定的部署.

  10. 使用Ansible在Windows上执行.exe

    我们希望在带有Ansible1.8.2的WindowsServer2012上部署应用程序.我搜索并找到了alist个Windows模块.是否有执行.exe的模块?有人已经在Windows上使用Ansible启动了.exe吗?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部