【Ansible 文档】【译文】Windows 支持

时间:2022-04-15 21:39:27

see also:List of Windows Modules

Windows Support Windows 支持

Windows: How Does It Work Windows:如何工作

正如已经知道的,Ansible默认使用SSH管理Linux/unix。

自从1.7版本开始,Ansible同样包含了对Windows机器管理的支持。这是用本地的powershell远程,而不是SSH。

Ansible仍然在Linux控制机上运行,并且使用“winrm” Python模块来与远端主机通信。尽管不被微软或者Ansible支持,Linux控制机可以是一个Windows subsystem for linux(WSL) bash shell 支持。

远端主机无需额外的软件安装,Ansible仍然保留了agentless的架构,以维持它在linux/Unix上的流行度。

注意,这里需要你对Ansible有一个基本的了解,如果你对写一个linux的playbook还不了解,也许你应该先去了解以下。

Installing on the Control Machine 控制机上的安装

在一台linux控制机上执行:

pip install "pywinrm>=0.2.2"

你也可以使用Windows控制机,但是这需要使用 Windows Subsystem for Linux (WSL) bash shell。

注意:

  使用a Windows Subsystem for Linux (WSL) bash shell 运行Ansible不是项目的目标,不支持这个特性是因为它限制了技术、特性和我们在主项目中使用的代码。

  Windows Subsystem for Linux (Beta) 不被微软或Ansible支持,并且不应该在生产环境上使用

如果你想要实验 Windows Subsystem for Linux (WSL),首先启用Windows Subsystem for Linux,按照these instructions。这需要重启

Ansible也可以运行在cygwin,但是安装太麻烦,且功能性还不能确定是否有用。

综上,最好是在linux主机上运行控制机。

Authentication Options 认证选项

当连接到一个Windows主机,有许多认证选项可以使用。选项和特性如下表:

Option Local Accounts Active Directory Accounts Credential Delegation
Basic Yes No No
Certificate Yes No No
Kerberos No Yes Yes
NTLM Yes Yes No
CredSSP Yes Yes Yes

  

你可以指定你希望使用的哪一个认证选项,通过设置 ansible_winrm_transport 变量。

Certificate

certificate 认证是类似于SSH,一个certificate被分配给本地用户并且代替输入密码的方式,认证一个证书来替代。

Kerberos

当使用一个活动账户来的NTLM,kerberos 是一个更好的选项。但是这需要控制机一点额外的设置。需要在控制主上安装 “python-kerberos” 模块,及它依赖的the MIT krb5模块。Ansible控制机同样要求恰当的配置电脑账户,在活动目录中。

Installing python-kerberos dependencies

# Via Yum
yum -y install python-devel krb5-devel krb5-libs krb5-workstation # Via Apt (Ubuntu)
sudo apt-get install python-dev libkrb5-dev krb5-user # Via Portage (Gentoo)
emerge -av app-crypt/mit-krb5
emerge -av dev-python/setuptools # Via pkg (FreeBSD)
sudo pkg install security/krb5 # Via OpenCSW (Solaris)
pkgadd -d http://get.opencsw.org/now
/opt/csw/bin/pkgutil -U
/opt/csw/bin/pkgutil -y -i libkrb5_3 # Via Pacman (Arch Linux)
pacman -S krb5

Installing python-kerberos

一旦你安装了依赖,你可以通过pip来安装python-kerberos

pip install pywinrm[kerberos]

在OS X和许多linux发行版,Kerberos 默认已经安装了。如果你的控制机还没有完成,你需要完成它。

《kerberos不懂,翻译困难,暂时不做了,如果需要的自行查看文档》

《对于我来说,我用basic就可以了,直接使用本地账户,哪来那么多事儿》

CredSSP

credSSP 认证可以被用来认证域账户和本地账户。它允许账户代理

Inventory 主机清单

Ansible的Windows支持依赖一些标准变量来指出 远程主机的  username, password, and connection type (windows)。

这些变量可以很容易的在inventory中设置。在Ansible中,这被用来代替SSH-Keys或者密码输入。

[windows]
winserver1.example.com
winserver2.example.com

在 group_vars/windows.yml,定义如下 inventory 变量:

# it is suggested that these be encrypted with ansible-vault:
# ansible-vault edit group_vars/windows.yml ansible_user: Administrator
ansible_password: SecretPasswordGoesHere
ansible_port:
ansible_connection: winrm
# The following is necessary for Python 2.7.+ (or any older Python that has backported SSLContext, eg, Python 2.7. on RHEL7) when using default WinRM self-signed certificates:
ansible_winrm_server_cert_validation: ignore

注意老版风格(ansible_ssh_*):ansible_ssh_password 不应该存在,应该是ansible_ssh_pass。

尽管Ansible是面向SSH的系统,Windows管理不是基于SSH的。

如果你已经安装了 kerberos 模块和 ansible_user 包含 @ (e.g. username@realm), Ansible会先尝试Kerberos认证。这将使用你已经在控制机上认证到Kerberos 的用户信息,而不是ansible_user 。如果这失败了,要么是因为你没有在管理机上签署(signed into)Kerberos,要么是因为远程主机上对应的域帐户不可用,接着 Ansible 将返回原始(“plain”)username/password的认证方式。

当你使用playbook时,不要忘记指定--ask-vault-pass来解锁文件。

使用如下命令来测试你的配置,尝试连接你的 Windows 节点。注意:这不是ICMP ping,只是利用 Windows 远程工具来检测 Ansible 的信道是否正常:

ansible windows [-i inventory] -m win_ping --ask-vault-pass

如果你还没有准备好你的系统,这不会工作的。如何配置Windows机器的powershell远程,而且如果必要,需要升级到powershell3以上,这在后续描述。

你可以稍后再执行该命令,以确保一切都能正常工作。

自从Ansible2.0开始,下面自定义的inventory变量同样支持winrm连接的额外配置。

  • ansible_winrm_scheme: 指定用于WinRM连接的连接模式 (http or https) 。 Ansible 默认使用https,除非端口是5985。
  • ansible_winrm_path: 指定可选的路径到WinRM端点。 Ansible 默认使用 /wsman 。
  • ansible_winrm_realm: 指定用于 Kerberos authentication 的 realm 。如果用户名包含 @, Ansible 默认会使用用户名@后的部分。
  • ansible_winrm_transport: 指定一个或者多个协议,以逗号分隔。默认地, Ansible 将使用 kerberos,plaintext 如果 kerberos 模块被安装了,并且一个realm已经定义,否则将使用 plaintext。
  • ansible_winrm_server_cert_validation: 指定服务器认证验证模式 (ignore or validate)。Ansible 在Python 2.7.9之后版本默认会验,对于Windows自签名证书来说,这将会导致证书验证错误。除非合法证书已经配置在WinRM监听器,否则应该被设置为ignore。
  • ansible_winrm_kerberos_delegation: 当使用kerberos时,设为 true 来启用远端主机上的命令代理。
  • ansible_winrm_operation_timeout_sec: 增加WinRM操作的超时,默认20。
  • ansible_winrm_read_timeout_sec: 增加WinRM读取超时,如果你正在经历读取超时错误,默认30。例如 间歇性的网络问题。
  • ansible_winrm_*: 任何被winrm.Protocol 提供支持的额外的关键字参数。

Windows System Prep Windows 系统前期准备

为了可以Ansible管理你的Windows机器,你必须启用并配置PowerShell远程。

为了自动化设置WinRM,你可以在远端机器上执行 examples/scripts/ConfigureRemotingForAnsible.ps1脚本,以管理员权限打开PowerShell控制台执行脚本。

这个例子脚本接收一些参数,管理员可以选择稍微修改默认的配置,在某些情况下,这是合适的。

传递 -CertValidityDays 选项来自定义产生的证书过期日期:

powershell.exe -File ConfigureRemotingForAnsible.ps1 -CertValidityDays 

传递-EnableCredSSP 选项来启用CerdSSP作为认证选项:

powershell.exe -File ConfigureRemotingForAnsible.ps1 -EnableCredSSP

传递 -ForceNewSSLCert 开关强制使用一个新的SSL证书,该证书被用来绑定到已经存在的winrm listenner。

powershell.exe -File ConfigureRemotingForAnsible.ps1 -ForceNewSSLCert

传递 -SkipNetworkProfileCheck 开关来配置winrm来监听PUBLIC zone interfaces(没有这个选项的话,如果有任何设备在PUBLIC zone,脚本会失败)

powershell.exe -File ConfigureRemotingForAnsible.ps1 -SkipNetworkProfileCheck

为了故障排除,ConfigureRemotingForAnsible.ps1 将写入每个变化到Windows EventLog。(useful when run unattendedly)

额外的选项 -verbose 可以用来展示更多的信息到屏幕上,关于正在执行什么。

注意:

  在Window 7和Window2008 R2机器,因为Windows 管理框架的BUG,有必要安装热修复补丁,http://support.microsoft.com/kb/2842230来避免内存和堆栈异常。新安装的Windows 2008 R2系统没有升级到最新版本的均存在这个问题。

  Windows 8.1 and Server 2012 R2 不受影响是因为他们自身默认使用的是 Windows Management Framework 4.0。

  PS 阿里云机器不会有这样的问题。

Getting to PowerShell 3.0 or higher 获取PowerShell 3.0或者更高版本

PowerShell 3.0 or higher对于大部分Windows模块都是需要的,并且也需要运行上面的脚本。注意,PowerShell 3.0仅支持 Windows 7SP1以及Windows Server 2008 SP1,以及后续版本

找到 Ansible 的checkout版本,复制  examples/scripts/upgrade_to_ps3.ps1 版本到远程主机,并且以管理员权限在PowerShell 控制台运行。就可以运行 PowerShell 3 并可以通过上面介绍的 win_ping 技术来测试连通性。

What modules are available 什么模块是可用的

大部分Ansible core中的模块是为了组合Linux/Unix机器和任意web服务而写的,尽管仍然有各种不同的Windows专用模块。

“windows” subcategory of the Ansible module index 可以查看Windows Ansible模块索引

此外,下面的core模块/action-plugins同样可以在Windows上工作。

  • add_host
  • assert
  • async_status
  • debug
  • fail
  • fetch
  • group_by
  • include
  • include_role
  • include_vars
  • meta
  • pause
  • raw
  • script
  • set_fact
  • set_stats
  • setup
  • slurp
  • template (also: win_template)
  • wait_for_connection

通过代理到localhost,一些模块可以在目标主机为windows机器的playbook中使用,这取决于你想要获得什么。例如assemble 被用来在你的Ansible主机上创建一个文件,然后发送到你的windows目的主机,使用win_copy。

很多时候,没有必要使用或者写一个Ansible模块。特别的,script模块可以被用来运行任意的PowerShell脚本,允许熟悉PowerShell的Windows管理员以非常原生的方式做任何事情。就像如下的 playbook:

- hosts: windows
tasks:
- script: foo.ps1 --argument --other-argument

同样地,win_shell 模块也可以用来运行内联的PowerShell小代码

- hosts: windows
tasks:
- name: Remove Appx packages (and their hindering file assocations)
win_shell: |
Get-AppxPackage -name "Microsoft.ZuneMusic" | Remove-AppxPackage
Get-AppxPackage -name "Microsoft.ZuneVideo" | Remove-AppxPackage

Developers: Supported modules and how it works 开发者:支持模块以及工作原理

开发Ansible模块在 later section of the documentation描述,这关注点在于linux/unix。如果要写windows模块该怎么办?

对于windows来说,Ansible模块主要用PowerShell来实现,在继续之前,掠过linux/unix开发章节。windows模块

core和extras库中的windows模块在windows子目录中。自定义模块可以直接放到Ansible的library/中或者那些在ansible.cfg中添加的目录。文档存在一个.py文件中,使用相同的名字。例如,如果一个模块名为win_ping,那么就会嵌入文档在win_ping.py文件中,并且实际的PowerShell代码存在一个win_ping.ps1文件中。看一看源码,这样会更清晰。

Modules (ps1文件),应该如下开始:

#!powershell
# <license> # WANT_JSON
# POWERSHELL_COMMON # code goes here, reading in stdin as JSON and outputting JSON

上面的魔法是必要的,告诉Ansible混入一些common code,并且也知道如何输出模块输出(push modules out )。common code 包含一些好的围绕hash数据结构非封装看,并且发出JSON结果,以及一些有用的结果。常规 Ansible 有着重复利用 Python 代码的理念 - 这点 Windows 也是等同的。

你在 windows/ 目录中看到的模块仅是一个开始,附加模块已经被 git push 到 github上了。

提醒:控制机必须是Linux系统

Windows 控制机不是这个项目的目标. Ansible 不会开发这个功能,因为受限于技术,产品和我们未来主要项目使用的代码. 一台Linux控制机是必须的,可以用来管理 Windows 机器. Cygwin 也是不被支持的,所以请不要要求 Ansible 基于 Cygwin 来运行.

Windows Facts windows facts

如linux/unix一样,facts也可以用于收集windows facts,其包含如操作系统版本这样的东西。为了查看一个windows主机的变量,运行下面的命令:

ansible winhost.example.com -m setup

注意,这个命令的调用方式和 Linux/Unix 是一样的。

Windows Playbook Examples windows playbook举例

这里有一个推送和运行一个PowerShell脚本的例子:

- name: test script module
hosts: windows
tasks:
- name: run test script
script: files/test_script.ps1

运行单个命令,使用 win_command<https://docs.ansible.com/ansible/win_command_module.html> 或者 win_shell <https://docs.ansible.com/ansible/win_shell_module.html> 模块,对应和linux/Unix操作系统的shell和command模块

- name: test raw module
hosts: windows
tasks:
- name: run ipconfig
win_command: ipconfig
register: ipconfig
- debug: var=ipconfig

运行普通的DOS命令像del,move,或者copy,这些在远程服务器中的PowerShell中是不可用的,但是它可以把 “CMD /C”放到命令前面并且把命令包含在双引号之内。例如:

- name: another raw module example
hosts: windows
tasks:
- name: Move file on remote Windows Server from one location to another
win_command: CMD /C "MOVE /Y C:\teststuff\myfile.conf C:\builds\smtp.conf"

你也可以通过PowerShell写一个与DOS命令等价的、更加具有可读性的playbook。例如,上面的例子你也可以如下操作:

- name: another raw module example demonstrating powershell one liner
hosts: windows
tasks:
- name: Move file on remote Windows Server from one location to another
win_command: Powershell.exe "Move-Item C:\teststuff\myfile.conf C:\builds\smtp.conf"

牢记,使用 win_command or win_shell 总是会报告 “changed”,并且,你有责任来确保PowerShell可以按照预期恰当地处理幂等性(上面的move例子隐含就不会是幂等的),因此可能会使用到模块或者写一个模块。

以下是一个如何使用“win_stat”模块来测试文件存在性的例子。注意,由win_stat模块返回的数据和linux提供的相同模块的结果有些许不同:

- name: test stat module
hosts: windows
tasks:
- name: test stat module on file
win_stat: path="C:/Windows/win.ini"
register: stat_file - debug: var=stat_file - name: check stat_file result
assert:
that:
- "stat_file.stat.exists"
- "not stat_file.stat.isdir"
- "stat_file.stat.size > 0"
- "stat_file.stat.md5"

Windows Contributions windows贡献

Ansible中的windows支持仍然是比较新的,欢迎贡献。无论是新的模块、现有模块的调整、文档、或者其他的什么。如果你愿意参与,请访问(stop by)Ansible开发邮件列表,say hi。

Developing Modules

List of Windows Modules

【Ansible 文档】【译文】Windows 支持的更多相关文章

  1. 【Ansible 文档】【译文】配置文件

    这里说明一下配置文件的内容,原文地址:http://docs.ansible.com/ansible/latest/intro_configuration.html 这个与[Ansible 文档]配置 ...

  2. 调用webapi 错误:使用 HTTP 谓词 POST 向虚拟目录发送了一个请求,而默认文档是不支持 GET 或 HEAD 以外的 HTTP 谓词的静态文件。的解决方案

    第一次调用webapi出错如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http:// ...

  3. Mitmproxy首页、文档和下载 - 支持SSL的HTTP代理 - 开源中国社区

    Mitmproxy首页.文档和下载 - 支持SSL的HTTP代理 - 开源中国社区 undefined 利用Dnspod api批量更新添加DNS解析[python脚本] - 推酷 undefined

  4. 【Ansible 文档】【译文】网络支持

    Networking Support 网络支持 Working with Networking Devices 使用网络设备 自从Ansible 2.1开始,你现在可以使用成熟模型 - 编写 play ...

  5. 【Ansible 文档】【译文】Playbooks 变量

    Variables 变量 自动化的存在使得重复的做事情变得很容易,但是我们的系统不可能完全一样. 在某些系统中,你可能想要设置一些与其他系统不一样的行为和配置. 同样地,远程系统的行为和状态也可以影响 ...

  6. 【Ansible 文档】【译文】Ad-Hoc 命令介绍

    Introduction To Ad-Hoc Commands Ad-Hoc命令介绍 下面的例子展示了如何使用 /usr/bin/ansible 来运行ad hoc任务. 什么是ad hoc命令? 一 ...

  7. 【Ansible 文档】【译文】入门教程

    http://docs.ansible.com/ansible/latest/intro_getting_started.html Foreword 前言 到这里,你应该已经安装了Ansible,是时 ...

  8. 【Ansible 文档】【译文】常见问题

    http://docs.ansible.com/ansible/latest/faq.html 如何为一个task或者整个Playbook设置PATH或者任意其他环境变量? 通过environment ...

  9. 【C&num;附源码】数据库文档生成工具支持(Excel&plus;Html)

    [2015] 很多时候,我们在生成数据库文档时,使用某些工具,可效果总不理想,不是内容不详细,就是表现效果一般般.很多还是word.html的.看着真是别扭.本人习惯用Excel,所以闲暇时,就简单的 ...

随机推荐

  1. BizTalk开发系列&lpar;六&rpar; BizTalk开发简述

    现在很多大型企业信息化程度很高,运行中的系统可达到数十乃至上百个.而大部分系统由于建设的时间.开发团队和技术 往往不相同,系统之间的大部分都是独立运行的.随着信息化建设的深入各系统之间的交互需求越来越 ...

  2. Mountain Road

    题意: n个车,过一条路,有不同的方向,路上不允许同时有两个方向的车,给出每个车的起始时间,方向,和经过路花费的时间,车最小间隔10个时间,求最后一个车通过路的最早的时间. 分析: dp[i][j][ ...

  3. scala位压缩与行情转换二进制

    import org.jboss.netty.buffer.{ChannelBuffers, ChannelBuffer} import java.nio.charset.Charset import ...

  4. Yii2基本概念之——行为&lpar;Behavior&rpar;

    使用行为(behavior)可以在不修改现有类的情况下,对类的功能进行扩充.通过将行为绑定到一个类,可以使得类具有行为本身所具有的属性和方法,就好像是类本来就具有的这些属性和功能一样. 好的代码设计, ...

  5. Codeforces 802I Fake News &lpar;hard&rpar; &lpar;SA&plus;单调栈&rpar; 或 SAM

    原文链接http://www.cnblogs.com/zhouzhendong/p/9026184.html 题目传送门 - Codeforces 802I 题意 求一个串中,所有本质不同子串的出现次 ...

  6. iOS 设计模式-委托模式

    委托是指给一个对象提供机会对另一对象中的变化做出反应或者相应另一个对象的行为.其基本思想是协同解决问题. Delegate的使用场合 对象A内部发生了一些事情,想通知对象B 对象B想监听对象A内部发生 ...

  7. 补充下&period;net知识

    问题1: public int getvalue(int a) { try { a = a + ; ; } catch (Exception) { throw; } finally { a = a + ...

  8. Mac 文件读写权限问题 OSError&colon; Operation not permitted

    Mac在OS X 10.11以后加入了Rootless功能,主要是限制了root权限,阻止用户对部分路径下的目录进行更改.受到限制的有以下目录: /System /bin /sbin /usr (ex ...

  9. Ubutun使用记录——语系错误(转)

    add by zhj: 对原文有修改,原文是在创建用户时出现的问题,而我是在使用psql时出现的, 但问题是相同的. 原文:http://www.douban.com/note/362250557/ ...

  10. linux下不同服务器间数据传输&lpar;wget&comma;scp&rpar;

    一.wget是Linux下最常用的http/ftp文件下载工具1.wget断点续传,只需要加上-c参数即可,例如:代码:wget-chttp://www.abc.com/abc.zip-Oabc.zi ...