使用 ansible 批量管理 windows主机

概述

Ansible是自动化运维工具,基于Python开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible是基于模块(module)和剧本(playbook)工作。

安装指南

本次在Ubuntu上安装Ansible 2.7 . 更详细安装方式参见: Ansible 安装指南

服务器端的要求

目前Ansible可以从安装了Python 2(2.7版)或Python 3(3.5及更高版本)的任何机器上运行。控制计算机不支持Windows

这包括Red Hat,Debian,CentOS,macOS,任何BSD等等。

服务器端安装Ansible

通过Apt (Ubuntu)安装最新版本

这里有一个PPA版本的Ubuntu源。

要在您的计算机上配置PPA并安装ansible,请运行以下命令:

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt-get install ansible

:exclamation:

在较旧的Ubuntu发行版中,“software-properties-common”被称为“python-software-properties”。

Windows 指南

设置Windows主机

主机要求

要使Ansible与Windows主机通信并使用Windows模块,Windows主机必须满足以下要求:

  • Ansible支持的Windows版本通常与Microsoft当前和扩展支持下的版本相匹配。支持的桌面操作系统包括Windows 7,8.1和10,受支持的服务器操作系统包括Windows Server 2008,2008 R2,2012,2012 R2和2016
  • Ansible需要PowerShell 3.0或更高版本,并且至少要在Windows主机上安装.NET 4.0
  • 应创建并激活**WinRM listener **。更多细节可以在下面找到。

:exclamation:

虽然这些是Ansible连接的基本要求,但是一些Ansible模块还有其他要求,例如较新的OS或PowerShell版本。请参阅模块的文档页面以确定主机是否满足这些要求。

升级PowerShell和.NET框架

升级powershell需要重启服务器才能生效。

Ansible需要PowerShell 3.0版和.NET Framework 4.0或更高版本才能在较旧的操作系统(如Server 2008和Windows 7)上运行。基本OS镜像不符合此要求。您可以使用Upgrade-PowerShell.ps1脚本来更新这些脚本。

这是如何从PowerShell运行此脚本的示例:

$url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1"
$file = "$env:temp\Upgrade-PowerShell.ps1"
$username = "Administrator"
$password = "Password"

(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force

# version can be 3.0, 4.0 or 5.1
&$file -Version 5.1 -Username $username -Password $password -Verbose

完成后,您将需要删除自动登录并将执行策略设置回默认值Restricted。您可以使用以下PowerShell命令执行此操作:

# this isn't needed but is a good security practice to complete
Set-ExecutionPolicy -ExecutionPolicy Restricted -Force

$reg_winlogon_path = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Winlogon"
Set-ItemProperty -Path $reg_winlogon_path -Name AutoAdminLogon -Value 0
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultUserName -ErrorAction SilentlyContinue
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultPassword -ErrorAction SilentlyContinue

该脚本的工作原理是检查需要安装哪些程序(例如.NET Framework 4.5.2)以及需要什么样的PowerShell版本。如果需要重新启动并且设置了usernamepassword参数,则脚本将在重新启动时自动重新启动并登录。该脚本将继续,直到不再需要执行任何操作且PowerShell版本与目标版本匹配为止。如果未设置usernamepassword参数,脚本将提示用户手动重新引导并在需要时登录。当用户下次登录时,脚本将从停止的位置继续,并且该过程将继续,直到不再需要其他操作为止。

:exclamation:

  • 如果在Server 2008上运行,则必须安装SP2。如果在Server 2008 R2或Windows 7上运行,则必须安装SP1。

  • Windows Server 2008只能安装PowerShell 3.0; 指定较新的版本将导致脚本失败。

  • usernamepassword参数都是存储在注册表中的纯文本。确保在脚本完成后运行清理命令,以确保主机上仍未存储凭据。

WinRM内存补丁

在PowerShell v3.0上运行时,WinRM服务存在一个错误,它限制了WinRM可用的内存量。如果未安装此补丁,Ansible将无法在Windows主机上执行某些命令。这些补丁应作为系统引导或映像过程的一部分安装。Install-WMF3Hotfix.ps1脚本可用于在受影响的主机上安装此修补程序。

以下PowerShell命令将安装此修补程序:

$url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Install-WMF3Hotfix.ps1"
$file = "$env:temp\Install-WMF3Hotfix.ps1"

(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
powershell.exe -ExecutionPolicy ByPass -File $file -Verbose

WinRM设置

一旦Powershell升级到至少3.0版本,最后一步是配置WinRM服务,以便Ansible可以连接到它。WinRM服务有两个主要组件,用于管理Ansible如何与Windows主机连接:listenerservice配置设置。

可以在下面阅读有关每个组件的详细信息,也可以使用脚本ConfigureRemotingForAnsible.ps1来进行基本设置。此脚本使用自签名证书设置HTTP和HTTPS侦听器,并在服务上启用Basic 身份验证选项。

要使用此脚本,请在PowerShell中运行以下命令:

$url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
$file = "$env:temp\ConfigureRemotingForAnsible.ps1"

(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)

powershell.exe -ExecutionPolicy ByPass -File $file

:exclamation:

ConfigureRemotingForAnsible.ps1脚本仅用于培训和开发目的,不应在生产环境中使用,因为它启用了Basic 这本质上不安全(如身份验证)。

WinRM Listener

WinRM服务侦听一个或多个端口上的请求。每个端口都必须创建并配置一个侦听器。

要查看在WinRM服务上运行的当前侦听器,请运行以下命令:

winrm quickconfig
winrm enumerate winrm/config/Listener

运行后输出如下:

Listener
    Address = *
    Transport = HTTP
    Port = 5985
    Hostname
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint
    ListeningOn = 10.0.2.15, 127.0.0.1, 192.168.56.155, ::1, fe80::5efe:10.0.2.15%6, fe80::5efe:192.168.56.155%8, fe80::
ffff:ffff:fffe%2, fe80::203d:7d97:c2ed:ec78%3, fe80::e8ea:d765:2c69:7756%7

Listener
    Address = *
    Transport = HTTPS
    Port = 5986
    Hostname = SERVER2016
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint = E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE
    ListeningOn = 10.0.2.15, 127.0.0.1, 192.168.56.155, ::1, fe80::5efe:10.0.2.15%6, fe80::5efe:192.168.56.155%8, fe80::
ffff:ffff:fffe%2, fe80::203d:7d97:c2ed:ec78%3, fe80::e8ea:d765:2c69:7756%7

修改winrm配置,启用远程连接认证

winrm set winrm/config/service/auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'

windows 防火墙配置

配置防火墙:

  1. 添加防火墙信任规则,允许5985-5986端口通过
  2. 打开防火墙高级配置,选择入站规则,在点击新建规则
  3. 填写一下信息
    1. TCP
    2. 信任端口5985-5986
  4. 填写新建规则名称

Ansible服务器端配置并管理Windows

添加windows客户端连接信息: 编辑/etc/ansible/hosts, 添加客户端主机信息(ansible服务端的配置)

[windows]
   
192.168.2.2 ansible_user="Administrator" ansible_password="Password" ansible_port=5986 ansible_connection="winrm" ansible_winrm_server_cert_validation=ignore ansible_winrm_transport=basic

ping 远程windows主机

$ ansible 192.168.2.2 -m win_ping
192.168.2.2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

创建目录

$ ansible 192.168.2.2 -m win_file -a 'path=D:\\test state=directory'
192.168.2.2 | CHANGED => {
    "changed": true
}

下发文件

$ ansible 192.168.2.2 -m win_copy -a 'src=/etc/hosts dest=D:\\hosts.txt'
192.168.2.2 | CHANGED => {
    "changed": true,
    "checksum": "f6d471689e1233342a8e43a130ff40a6ea0b9f51",
    "dest": "D:\\hosts.txt",
    "operation": "file_copy",
    "original_basename": "hosts",
    "size": 635,
    "src": "/etc/hosts"
}

删除文件

# ansible 192.168.2.2 -m win_file -a 'dest=d:\\config_dir\\hosts.txt state=absent'

删除目录

# ansible 192.168.2.2 -m win_file -a 'dest=d:\\config_dir2 state=absent'

执行cmd命令

# ansible 192.168.2.2 -m win_shell -a 'ipconfig'

重启windows

# ansible 192.168.2.2 -m win_reboot
# ansible 192.168.2.2 -m win_shell -a 'shutdown -r -t 0'

创建用户

远程在windows客户端上创建用户

# ansible 192.168.2.2 -m win_user -a "name=testuser1 passwd=123456"

windows服务管理

# ansible 192.168.2.2 -m win_shell -a “net stop|start zabbix_agent”

完整的windows module见: Windows modules

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容